Linux中的管道(pipe)和fork是两个重要的系统调用,它们在进程间通信和多进程编程中扮演着关键角色。
管道是一种半双工的通信方式,允许一个进程将数据流传递给另一个进程。它通常用于父子进程之间的通信。
pipe()
系统调用创建,存在于内存中,适用于有亲缘关系的进程间通信。mkfifo()
创建,存在于文件系统中,可以被任何进程访问。#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
int main() {
int pipefd[2];
pid_t pid;
char buffer[256];
if (pipe(pipefd) == -1) {
perror("pipe");
exit(EXIT_FAILURE);
}
pid = fork();
if (pid == -1) {
perror("fork");
exit(EXIT_FAILURE);
} else if (pid == 0) { // 子进程
close(pipefd[1]); // 关闭写端
read(pipefd[0], buffer, sizeof(buffer));
printf("Child received: %s\n", buffer);
close(pipefd[0]);
} else { // 父进程
close(pipefd[0]); // 关闭读端
write(pipefd[1], "Hello from parent!", 17);
close(pipefd[1]);
}
return 0;
}
fork()
是一个系统调用,用于创建一个新的进程。新进程几乎是父进程的副本,拥有相同的代码、数据和堆栈。
#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
void child_process() {
printf("Child process: PID = %d\n", getpid());
}
void parent_process(pid_t pid) {
printf("Parent process: Child PID = %d\n", pid);
}
int main() {
pid_t pid = fork();
if (pid == -1) {
perror("fork");
exit(EXIT_FAILURE);
} else if (pid == 0) {
child_process();
} else {
parent_process(pid);
}
return 0;
}
原因:当管道中没有数据可读或缓冲区已满时,读写操作会阻塞。 解决方法:
select
、poll
)监控多个管道。原因:子进程复制了父进程的资源,如果不小心在子进程中释放了共享资源,可能导致父进程访问已释放的内存。 解决方法:
通过合理使用管道和fork,可以有效地实现多进程编程和进程间通信。
领取专属 10元无门槛券
手把手带您无忧上云