面试题答案
一键面试- 通信步骤:
- 创建管道:使用
pipe
函数创建一个管道,该函数会返回两个文件描述符,一个用于读(fd[0]
),一个用于写(fd[1]
)。 - 创建子进程:通过
fork
函数创建多个子进程。 - 关闭不需要的文件描述符:
- 在父进程中,如果只负责向管道写数据,就关闭读端文件描述符
fd[0]
;如果只负责读数据,就关闭写端文件描述符fd[1]
。 - 在子进程中,同样根据需要关闭不需要的文件描述符。例如,如果子进程负责读数据,就关闭写端文件描述符
fd[1]
。
- 在父进程中,如果只负责向管道写数据,就关闭读端文件描述符
- 数据传输:
- 写数据的进程使用
write
函数将数据写入管道。 - 读数据的进程使用
read
函数从管道读取数据。
- 写数据的进程使用
- 关闭管道:通信完成后,关闭所有打开的管道文件描述符。
- 创建管道:使用
- 代码示例:
#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
#include <string.h>
#define BUFFER_SIZE 100
int main() {
int pipe_fds[2];
if (pipe(pipe_fds) == -1) {
perror("pipe creation failed");
return 1;
}
pid_t pid = fork();
if (pid == -1) {
perror("fork failed");
return 1;
} else if (pid == 0) { // 子进程
close(pipe_fds[1]); // 子进程关闭写端
char buffer[BUFFER_SIZE];
ssize_t bytes_read = read(pipe_fds[0], buffer, sizeof(buffer));
if (bytes_read == -1) {
perror("read failed");
return 1;
}
buffer[bytes_read] = '\0';
printf("子进程读取到的数据: %s\n", buffer);
close(pipe_fds[0]);
} else { // 父进程
close(pipe_fds[0]); // 父进程关闭读端
const char *message = "Hello from parent!";
ssize_t bytes_written = write(pipe_fds[1], message, strlen(message));
if (bytes_written == -1) {
perror("write failed");
return 1;
}
close(pipe_fds[1]);
wait(NULL); // 等待子进程结束
}
return 0;
}
这段代码创建了一个管道,并通过fork
创建了一个子进程。父进程向管道写入数据,子进程从管道读取数据并打印。注意在实际应用中,对于多进程场景,可以根据需求创建多个子进程,并合理分配管道读写任务。