Fork函数定义
fork函数将运行着的程序分成2个(几乎)完全一样的进程,每个进程都启动一个从代码的同一位置开始执行的线程。这两个进程中的线程继续执行,就像是两个用户同时启动了该应用程序的两个副本。
- printf方法:
- 缓冲区放满后
- 程序结束后
- 强制刷新缓冲区 "\n" fflush(stdout)
- 为什么父子进程地址相同?
答:在程序中看到的地址是虚拟(逻辑)地址,不是真实的物理地址。
- 先使用malloc后,再使用fork,子进程也有一份父进程在堆区申请的空间
Fork函数示例1
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <assert.h>
#include <unistd.h>
int main()
{
char* s = NULL;
int n= 0;
pid_t pid = fork();
assert( pid != -1 );
if( pid == 0)//zi
{
s = "child";
n = 7;
}
else
{
s = "parent";
n = 3;
}
int i = 0;
for( ; i<n ;i++)
{
printf("s=%s,pid=%d,ppid=%d,&s=%x\n",s,getpid(),getppid(),&s);
sleep(1);
}
exit(0);
}
运行结果
可见,子进程与父进程同时进行。
子进程的pid为父进程的pid加一。父进程未结束时,子进程的ppid为父进程的pid。父进程先于子进程结束时,因不允许存在孤儿进程,故子进程的父进程就变为pid为1的进程。
Fork函数示例2
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <assert.h>
#include <unistd.h>
int main()
{
char* s = NULL;
int n= 0;
pid_t pid = fork();
assert( pid != -1 );
if( pid == 0)//zi
{
s = "child";
n = 3;
}
else
{
s = "parent";
n = 7;
}
int i = 0;
for( ; i<n ;i++)
{
printf("s=%s,pid=%d,ppid=%d,&s=%x\n",s,getpid(),getppid(),&s);
sleep(1);
}
exit(0);
}
与示例1 不同于子进程与父进程执行的次数
运行结果
子进程产生<defunct>
僵死进程:
子进程先于父进程结束,并且父进程没有调用wait获取子进程的退出码,此时子进程变成僵死进程
wait取消僵死:
{
int val = 0;
pid_t child_pid = wait(&val);
if(WIFEXITED(val))
{
printf("child_pid = %d, val = %d\n",child_pid,WEXITSTATUS(val));
}
}