头文件
1
2
|
#include<unistd.h>/*#包含<unistd.h>*/
#include<sys/types.h>/*#包含<sys/types.h>*/
|
函数原型
pid_t fork(
void);
(pid_t 是一个
宏定义,其实质是int 被定义在#
include<
sys/types.h>中)
返回值: 若成功调用一次则返回两个值,子进程返回0,
父进程返回子进程ID;否则,出错返回-1
函数说明
一个现有进程可以调用fork函数创建一个新进程。由fork创建的新进程被称为子进程(child process)。fork函数被调用一次但返回两次。两次返回的唯一区别是子进程中返回0值而
父进程中返回子进程ID。
UNIX将复制
父进程的
地址空间内容给子进程,因此,子进程有了独立的地址空间。在不同的UNIX (Like)系统下,我们无法确定fork之后是子进程先运行还是父进程先运行,这依赖于系统的实现。所以在移植代码的时候我们不应该对此作出任何的假设。
----------------------------------------------------------------------------------------------------------
#include "apue.h"
int glob=6;
char buf[]="a write to stdout\n";
int main(void)
{
int var;
pid_t pid;
var=88;
if(write(STDOUT_FILENO,buf,sizeof(buf)-1)!=sizeof(buf)-1)
{
err_sys("write error");
}
printf("before fork\n");
if((pid=fork())<0)
{
err_sys("fork error");
}
else if(pid==0)
{
//child
glob++;
var++;
} else
{
printf("child pid is :%d\n",pid);
//parent
sleep(2);
}
printf("pid = %d,glob = %d,var = %d\n",getpid(),glob,var);
exit(0);
}
jiang@AY140524110335068908Z:~/new_apue$ ./a.out
a write to stdout
before fork
child pid is :11626
pid = 11626,glob = 7,var = 89
pid = 11625,glob = 6,var = 88