fork()函数:进程的创建函数,调用一次,但是能够返回两次,有三种不同的返回值:
1.在父进程中返回新创建子进程的进程ID;
2.子进程中返回0;
3.出现错误,返回负数。
在fork()函数执行完毕之后,如果新的进程创建完毕,则会出现两个进程,在子进程中fork会返回0;在父进程中会返回新创建子进程的进程ID。
一个进程调用fork()之后系统会对新建的进程进行进程资源分配,例如储存数据和代码的空间,然后把绝大多数的值复制到新的进程之中去,相当于对之前的进程进行了一个克隆。
fork()创建子进程的目的是在父进程运行的同时运行在子进程内运行其他的程序
例程:
/**********************************************************************
#include <unistd.h>
#include <stdio.h>
int main ()
{
pid_t fpid; //fpid表示fork函数返回的值
int count=0;
fpid=fork();
if (fpid < 0)
printf("error in fork!");
else if (fpid == 0) {
printf("i am the child process, my process id is %d/n",getpid());
printf("我是爹的儿子/n");//对某些人来说中文看着更直白。
count++;
}
else {
printf("i am the parent process, my process id is %d/n",getpid());
printf("我是孩子他爹/n");
count++;
}
printf("统计结果是: %d/n",count);
return 0;
}
运行结果: i am the child process, my process id is 5574
我是爹的儿子
统计结果是: 1
i am the parent process, my process id is 5573
我是孩子他爹
*********************************************************************/
***僵尸进程与孤儿进程:
僵尸进程:子进程会先于父进程结束,子进程结束后父进程会负责为子进程“收尸”,在子进程已经结束,但是父进程还未帮其收尸的这段时间称为僵尸进程。
(父进程会使用wait、waitpid以显式回收子进程的剩余待回收内存资源并获得子进程退出状态,若父进程未使用wait、waitpid进行回收,父进程结束时一样会回收剩余的资源)
wait和waitpid的使用:
wait:用来回收子进程,但是不会挑剔子进程 wait(&status);
waitpid:回收指定pid的进程,options也会规定我们的工作转态waitpid(pid,&status,option
#include <sys/types.h> #include <sys/wait.h>
回收的流程:子进程结束后,父进程调用wait后阻塞,等待系统向父进程发送SIGHILD信号,然后父进程被唤醒去回收僵尸子进程。(父进程无子进程时则调用wait会返回错误)
孤儿进程:父进程先于子进程结束。
linux系统规定所有的孤儿进程会自动成为一个特殊进程(进程1,也就是init进程)。