进程创建

fork()

       #include <unistd.h>

       pid_t fork(void);

a)用来创建一个新的进程,调用成功后,将存在两个进程,每个进程都从fork()的返回处继续执行。两个进程执行相同的程序文本段,但各自拥有不同的栈段、数据段和堆段,因为子进程对其父进程的堆段、栈段以及数据段进行了拷贝。

 

b)fork() 调用成功后,父进程中返回 子进程的 PID,在子进程中返回 0 。如果调用失败,在父进程中返回 -1,不创建进程。

 

c)fork() 调用成功创建子进程后,究竟是父进程先于子进程执行,还是子进程先于父进程执行,这取决于内核的调度。编程时应注意。

 示例

#include <stdio.h>
#include <unistd.h>

static int data = 111;

int main()
{
    int istack = 222;
    pid_t pid;
    switch(pid = fork())
    {
    case -1:
        perror("creat process failure!");
        return -1;
    case 0://child process 
        data *= 3;
        istack *= 3;
        break;
    default://parent process,do nothing but sleep 3 seconds
        sleep(3);
        break;
    }

    /*both child and parent come here*/
    printf("(%s)my pid is %d data is %d istack is %d\n", 
           (pid == 0) ? "child" : "parent", getpid(), data, istack);
    return 0;
}

运行结果

(child)my pid is 119011 data is 333 istack is 666
(parent)my pid is 119010 data is 111 istack is 222

父进程睡眠 3 秒,保证子进程先执行。数据结果可以看出,子进程拥有自己的栈和对父进程数据段的拷贝。

PS:

子进程ID(pid)返回给父进程的理由是:因为一个进程的子进程可以多个,并且没有一个函数使一个进程可以获得其所有子进程的进程ID。fork() 使子进程返回 0 的理由是:一个进程只会有一个父进程,所以子进程总是可以通过 getppid() 以获得其父进程的进程ID。

 

posted @ 2018-08-06 19:23  shelmean  阅读(1101)  评论(0编辑  收藏  举报