实验目的
了解Linux系统调用fork的工作原理。在Linux上编写C语言程序,实现在父进程中调用fork创建一个子进程。并在父子进程中分别调用getpid、getppid 返回父子进程的进程号,并检查返回的父子进程号所代表的父子关系是否一致,从而更好地理解进程的并发。
纠错,在Linux下sleep函数不是以毫秒为单位的,是以秒为单位,所以代码部分的sleep注释写错了,这里特别指出,但代码部分因为不能修改就继续保留。
实验代码
#include <stdio.h>
#include <sys/types.h>
#include <unistd.h>
int main()
{
pid_t pid;
printf("the father pid = %d\n",getpid());
pid = fork();//父进程中调用fork创建一个子进程
// fork()调用成功,返回两次:返回值为0,代表当前进程为子进程,返回值大于零也就是子进程的PID,代表当前进程为父进程。返回值为-1,则代表函数调用失败,即创建子进程失败。
if(pid > 0){
printf("this is in father,the father pid = %d,childpid=%d\n",getpid(),pid);
sleep(1);//父进程睡眠1毫秒
//在父进程调用后加上 sleep()函数,让父进程陷入睡眠,而不导致它被摧毁。
}
else if(pid == 0)
{
printf("this is in chird ,the child pid = %d,parentpid= %d\n",getpid(),getppid());
}
return 0;
}
/*当使用fork()创建子进程后,主函数调用时,父函数先于子函数被调用,当父函数完成调用被摧毁后,才调用子函数。也就是说,当子函数被调用时,父函数已经被“杀死”了,这时的子进程便成了“孤儿进程”,某个进程(如init)会收养这个子进程。所以,子进程的父进程发生了改变。sleep函数可以让父进程睡眠,不至于被杀死,子进程的父进程就不会发生改变。*/
在codeblocks上调试运行:
参考文章:参考文章1