当我们编写多进程程序时,经常需要使用fork()函数创建子进程。在此为大家详细讲解C语言的fork()函数创建子进程的用法。
什么是fork()函数?
fork()函数是一个创建进程的系统调用,调用一次生成两个进程(一个子进程和一个父进程)。两个进程都执行fork()调用后的下一条语句。这个新进程几乎与原先的进程完全一样,除了它有自己独特的进程ID,PID和PPID。
基本使用方法
在C语言中,fork()函数的原型如下:
#include <unistd.h>
pid_t fork(void);
其中,返回值为pid_t类型。如果fork()调用成功,返回值为0,表示调用进程是子进程;如果返回值大于0,表示调用进程是父进程,此返回值为子进程的进程ID;如果发生错误,返回值为-1。
下面是一个简单的例子,用来说明fork()函数是如何使用的。它创建了两个进程,一个进程执行“child process”语句,另一个进程执行“parent process”语句。
#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
#include <sys/types.h>
int main()
{
pid_t pid;
pid = fork();
if (pid < 0) {
fprintf(stderr, "fork failed\n");
exit(-1);
} else if (pid == 0) {
printf("child process\n");
} else {
printf("parent process\n");
}
return 0;
}
执行结果如下:
parent process
child process
fork()调用的子进程和父进程
fork()调用后,两个进程(子进程和父进程)在fork()调用处都开始运行。子进程是父进程的一个拷贝,它有自己唯一的进程ID 。
子进程和父进程的区别在于fork()调用的返回值不同。在父进程中,fork()返回新创建的子进程的PID,在子进程中返回值为0。
可以用代码来说明:
#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
#include <sys/types.h>
int main()
{
pid_t pid;
pid = fork();
if (pid < 0) {
fprintf(stderr, "fork failed\n");
exit(-1);
} else if (pid == 0) {
printf("child pid = %d, parent pid = %d\n", getpid(), getppid());
} else {
printf("parent pid = %d, child pid = %d\n", getpid(), pid);
}
return 0;
}
执行结果如下:
parent pid = 1234, child pid = 1235
child pid = 1235, parent pid = 1234
结束进程
子进程可以用exit()函数来终止自己。exit()函数中包含一个整型参数,它表示子进程的终止状态。
在子进程中,可以用以下方式来终止它自己:
#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
#include <sys/types.h>
#include <sys/wait.h>
int main()
{
pid_t pid;
int status;
pid = fork();
if (pid < 0) {
fprintf(stderr, "fork failed\n");
exit(-1);
} else if (pid == 0) {
printf("child process: pid = %d\n", getpid());
exit(0);
} else {
printf("parent process: pid = %d, child pid = %d\n", getpid(), pid);
wait(&status);
if (WIFEXITED(status)) {
printf("child exited normally with status %d\n", WEXITSTATUS(status));
} else {
printf("child terminated abnormally\n");
}
}
return 0;
}
其中,wait()函数会阻塞父进程,直到子进程退出。wait()函数的参数是一个整形指针,用来存储子进程的终止状态。在本例中,我们通过WIFEXITED()和WEXITSTATUS()宏来检查子进程是否正常结束。
执行结果如下:
parent process: pid = 1234, child pid = 1235
child process: pid = 1235
child exited normally with status 0
以上就是C语言中fork()函数创建子进程的基本用法和两个示例的详细讲解。
本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:举例讲解C语言的fork()函数创建子进程的用法 - Python技术站