本次文章讲述的是:
如何利用fork函数实现对父子进程的循环打印。
首先,我们通过man手册,查看fork函数的用法以及头文件:man 2 fork(第一页为shell用户命令,第二页为系统调用,第三页为库函数),这里调用的是第二页,查找第二页得到如图:
SYNOPSIS
#include <sys/types.h>
#include <unistd.h>
pid_t fork(void);
这里包含#include <sys/types.h>和#include <unistd.h>两个头文件,函数原型为pid_t fork(void);pid_t 很明显为类型重命名,这里需要注意的是fork函数的返回值,当它等于0时处于子进程中,当它大于0时处于父进程中,小于0时出错。所以我们可以通过getpid()函数得到子进程号,getppid()函数得到父进程号(注意他们的头文件)来实现父子进程号的打印。
#include <stdio.h>
#include <sys/types.h>
#include <sys/wait.h>
#include <unistd.h>
int main(int argc, char *gc, char *arargv[])
{
pid_t p = getpid();
printf("before ppid = %d\n",p);
int n = 0;
pid_t pid = -2; //这里我们将pid设为不为0的值,避免与下面while条件冲突
while(n < 5 && pid !=0) //循环五次
{
pid = fork();
if(pid == -1) //判断是否子进程创建
{
perror("fork error");
}
if(getpid() != p) //判断父进程号与子进程号
{
printf("child pid:%d ",getpid());
printf("parent ppid:%d\n",getppid());
puts("");
// sleep(1); //需要看清实验过程可加入sleep,头文件已加
}
waitpid(pid,NULL,0); //这里运用waitpif函数可以将子进程回收
n++;
}
return 0;
}
具体的函数过程就在上面了,这里我们循环的是五次,并且打印了父子进程号,其中的小细节可自行修改,结果如下:
$gcc 2fork.c
$ ./a.out
before ppid = 233393
child pid:233394 parent ppid:233393child pid:233395 parent ppid:233393
child pid:233396 parent ppid:233393
child pid:233397 parent ppid:233393
child pid:233398 parent ppid:233393
另外我们也可以用for循环来执行,这里就不过多阐述,感兴趣的朋友可以自行尝试!