fork函数是计算机程序设计中的分叉函数。返回值: 若成功调用一次则返回两个值,子进程返回0,父进程返回子进程标记;否则,出错返回-1。
fork函数将运行着的程序分成2个(几乎)完全一样的进程,每个进程都启动一个从代码的同一位置开始执行的线程。这两个进程中的线程继续执行,就像是两个用户同时启动了该应用程序的两个副本。
函数原型
pid_t fork( void);
(pid_t 是一个宏定义,其实质是int 被定义在#include中)
返回值: 若成功调用一次则返回两个值,子进程返回0,父进程返回子进程ID;否则,出错返回-1
函数说明
一个现有进程可以调用fork函数创建一个新进程。由fork创建的新进程被称为子进程(child process)。fork函数被调用一次但返回两次。两次返回的唯一区别是子进程中返回0值而父进程中返回子进程ID。
子进程是父进程的副本,它将获得父进程数据空间、堆、栈等资源的副本。注意,子进程持有的是上述存储空间的“副本”,这意味着父子进程间不共享这些存储空间。
UNIX将复制父进程的地址空间内容给子进程,因此,子进程有了独立的地址空间。在不同的UNIX (Like)系统下,我们无法确定fork之后是子进程先运行还是父进程先运行,这依赖于系统的实现。所以在移植代码的时候我们不应该对此作出任何的假设。
////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
int main(void)
{
int n = 0;
char caBuf[32] = {'\0'};
pid_t pid = 0;
pid = fork();
if (pid > 0)
{
/*parent*/
n = 3;
strcpy(caBuf, "parent:");
//getpid(): 获得自己的进程号
printf("parent:parentPid = %d\n", getpid());
printf("parent:childPid = %d\n", pid);
}
else if (0 == pid)
{
/*child*/
n = 9;
strcpy(caBuf, "child:");
//getppid(): 获得父进程的进程号
printf("child:parentPid = %d\n", getppid());
printf("child:childPid = %d\n", getpid());
}
else if (-1 == pid)
{
/*parent*/
printf("errno:%d, err:%s\n"
, errno, strerror(errno));
exit(-1);
}
//父子进程都要执行
for (; n >= 0; n--)
{
printf("%s %d\n", caBuf, n);
sleep(1);
}
return 0;
}
//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
网友评论