C语言程序演示fork()和pipe()的使用攻略
什么是fork()和pipe()?
fork()是在Linux系统中用来创建新进程的系统调用函数。使用fork()函数可以创建出一个子进程,该子进程是父进程的一个副本,且会与父进程一同运行,但是有不同的pid和返回值。fork()函数被调用时,当前进程将会被复制一份,形成一个新的进程和父进程同步进行。新的进程中的数据和代码与父进程是完全独立的。
pipe()是在Linux系统中用来创建管道的函数。将多个命令连接起来,让前一个命令的输出作为下一个命令的输入,这称为管道。使用pipe()函数可以创建一个匿名管道(anonymous pipe),将父进程和子进程连接起来,让它们之间可以相互通信。
fork()函数的使用
下面是使用fork()函数的典型范式:
#include <stdio.h>
#include <unistd.h>
int main() {
pid_t pid;
pid = fork();
if (pid < 0) {
printf("create child process failed.\n");
} else if (pid == 0) {
printf("I am in child process. pid=%d\n", getpid());
} else {
printf("I am in parent process. pid=%d, child's pid=%d\n", getpid(), pid);
}
return 0;
}
我们可以使用fork()函数创建一个子进程,该子进程是父进程的一个副本,但是有不同的pid和返回值。使用if语句判断是否创建子进程成功,子进程的pid为0,父进程的pid为子进程的pid。使用getpid()函数得到当前进程的pid。
下面是一个fork()函数的示例代码:
#include <stdio.h>
#include <unistd.h>
int main() {
pid_t pid;
char *msg;
int i;
printf("before fork\n");
pid = fork();
switch(pid) {
case -1:
printf("fork failed!\n");
break;
case 0:
msg = "This is child process!\n";
for (i=0; i<3; i++) {
printf("child process: %d %s", i, msg);
}
break;
default:
msg = "This is parent process!\n";
for (i=0; i<3; i++) {
printf("parent process: %d %s", i, msg);
}
break;
}
return 0;
}
pipe()函数的使用
pipe()函数的原型如下:
int pipe(int fd[2]);
其中fd参数是一个长度为2的整型数组,分别表示管道的读取端和写入端。使用pipe()函数创建一个匿名管道用于父进程和子进程之间的通信。
下面是使用pipe()函数的示例代码:
#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
#define BUFFER_SIZE 1024
int main() {
char buffer[BUFFER_SIZE];
int pfd[2];
pid_t pid;
if (pipe(pfd) < 0) {
printf("pipe failed!\n");
exit(1);
}
pid = fork();
if (pid < 0) {
printf("create child process failed!\n");
exit(1);
} else if (pid == 0) {
close(pfd[1]);
while (read(pfd[0], buffer, BUFFER_SIZE) > 0) {
printf("child process: %s", buffer);
}
close(pfd[0]);
exit(0);
} else {
close(pfd[0]);
strcpy(buffer, "Hello World!\n");
write(pfd[1], buffer, strlen(buffer)+1);
close(pfd[1]);
exit(0);
}
return 0;
}
在该示例程序中,我们首先声明了一个1KB大小的缓冲区,然后定义了一个数组pfd用于存放管道的读取端和写入端。接着我们调用pipe()函数创建一个匿名管道,如果失败的话就退出程序。
接下来我们使用fork()函数创建一个子进程,如果失败的话就退出程序。在子进程中,首先关闭管道的写入端,然后使用read()函数读取管道中的内容,直到读取失败为止。每次读取成功后,输出对应的缓冲区内容。
在父进程中,首先关闭管道的读取端,然后将字符串"Hello World!"写入管道中,最后关闭管道的写入端。
运行该程序后,我们会发现子进程读取到了父进程写入的内容。
本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:C语言程序 演示fork()和pipe() - Python技术站