fork(): 用来创建新的进程;在父进程中返回子进程的进程号,在子进程中返回0,错误返回-1
表头文件:#include<unistd.h>
#include<sys/types.h>
定义函数:pid_t fork(void) pid_t:创建进程时会用到进程号的类型定义,实际上为int类型;
在fork()创建一个进程的同时,子进程完全复制父进程的资源,产生一个副本,但是采用写时复制的策略,这样可以延迟真正的数据复制,写入数据后,意味着子父进程的数据开始不一致了,于是产生复制动作,每个进程拿到属于自己的一份,这样就可以系统调用的开销;
#include<stdio.h>
#include<sys/types.h>
#include<unistd.h>
#include<sys/wait.h>
int main()
{
pid_t pid;
int count =0;
printf("hello_linux,count =%x\n",&count);
pid=fork();
printf("@@@fork() is %d\n",pid);
if(pid>0)
{
printf("++child has the pid:%d\n",pid);
count++;
printf("+++count = %d,%x\n",count,&count);
wait(NULL);
}
else if(!pid)
{
sleep(2);
printf("----count = %d,%x\n",count,&count);
}
else
{
printf("frok error");
}
count++;
printf("pid = %d,count = %d\n",getpid(),count);
return 0;
}
vfork(): 用来创建新的进程;在父进程中返回子进程的进程号,在子进程中返回0,错误返回-1
表头文件:#include<unistd.h>
vfork()与fork()不同的地方在于,用vfork创建的子进程与父进程共享内存空间,也就是说子进程完全运行在父进程的地址空间上,如果这是子进程修改了某个变量,这将影响到父进程;需要注意的是用vfork()创建的子进程必须显示调用exit()来结束,否则子进程将不能结束,而fork()则不存在这个状况;
僵尸进程:
僵尸进程就是已经结束了的进程,但是还没有从进程表中删除,它放弃了几乎所有内存空间,没有任何可执行代码,也不能被调度,它需要它的父进程为他收尸,如果父进程没有安装SIGCHLD信号处理函数调用wait()或者waitpid()等待子进程结束,又没有显示忽略该信号,那么它就一直保持僵尸状态。如果父进程结束了,那么init进程会接手这个进程为它收尸,它还是可以被清除的。但是,如果父进程是一个循环,不会结束,那么子进程就会一直保持僵尸状态。