您的位置:首页 > 运维架构 > Linux

深入解析Linux中的fork函数

2013-06-28 13:43 429 查看
1、定义
#include <unistd.h>
#include<sys/types.h>
pid_t fork( void );
pid_t 是一个宏定义,其实质是int,被定义在#include<sys/types.h>中返回值:若成功调用一次则返回两个值,子进程返回0,父进程返回子进程ID;否则,出错返回-12、函数说明:一个现有进程可以调用fork函数创建一个新进程。由fork创建的新进程被称为子进程(child process)。fork函数被调用一次但返回两次。两次返回的唯一区别是子进程中返回0值而父进程中返回子进程ID。子进程是父进程的副本,它将获得父进程数据空间、堆、栈等资源的副本。注意,子进程持有的是上述存储空间的“副本”,这意味着父子进程间不共享这些存储空间。File locks and pending signals are not inherited. 【3】If the call to fork() is executed successfully, Unix will① make two identical copies of address spaces, one for the parent and the other for the child.② Both processes will start their execution at the next statement following the fork() call.3、为什么fork会返回两次?由于在复制时复制了父进程的堆栈段,所以两个进程都停留在fork函数中,等待返回。因为fork函数会返回两次,一次是在父进程中返回,另一次是在子进程中返回,这两次的返回值是不一样的。After a new child process is created, both processes will execute the next instruction following the fork() system call.调用fork之后,代码有两份,都从fork函数中返回。Please note that Unix will make an exact copy of the parent's address space and give it to the child. Therefore, the parent and child processes have separate address spaces.
实例代码1:
#include<sys/types.h>
#include<unistd.h>
#include<stdio.h>

int main(int argc,char**argv)
{
    int pid=fork();
    if(pid == -1)
    {
        print("error!");
    }
    else if(pid == 0)
    {
        print("This is the child process!");
    }
    else
    {
        print("This is the parent process! child process id = %d", pid);
    }
    return 0;
}

示例代码2:
#include  <stdio.h>
#include  <string.h>
#include  <sys/types.h>
#include <unistd.h>

#define   MAX_COUNT  200
#define   BUF_SIZE   100

void  main(void)
{
     pid_t  pid;
     int    i;
     char   buf[BUF_SIZE];

     fork();
     pid = getpid();
     for (i = 1; i <= MAX_COUNT; i++) {
          sprintf(buf, "This line is from pid %d, value = %d\n", pid, i);
          write(1, buf, strlen(buf));
     } 
}


为什么用write,而不用printf呢?because printf() is "buffered," meaning printf() will group the output of a process together,这样,会把子进程和父进程的输出混起来。所以用use the "unbuffered" write。示例代码3:
#include  <stdio.h>
#include  <sys/types.h>

#define   MAX_COUNT  200

void  ChildProcess(void);                /* child process prototype  */
void  ParentProcess(void);               /* parent process prototype */

int  main(void)
{
     pid_t  pid;

     pid = fork();
     if (pid == 0) 
          ChildProcess();
     else 
          ParentProcess();
    return 0;
}

void  ChildProcess(void)
{
     int   i;

     for (i = 1; i <= MAX_COUNT; i++)
          printf("   This line is from child, value = %d\n", i);
     printf("   *** Child process is done ***\n");
}

void  ParentProcess(void)
{
     int   i;

     for (i = 1; i <= MAX_COUNT; i++)
          printf("This line is from parent, value = %d\n", i);
     printf("*** Parent is done ***\n");
}

4、Error Codes出错返回错误信息如下:EAGAIN :达到进程数上限.ENOMEM :没有足够空间给一个新进程分配.fork()系统在Linux中的返回值是没有NULL的.
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: