您的位置:首页 > 其它

unix_8_进程控制(一)

2016-03-01 07:10 363 查看
类unix系统中的进程控制:

创建:pid_t fork(void);

返回值:如果创建失败则返回 -1 ; 成功情况下:子进程返回0,父进程返回 子进程的进程ID

说明:本函数调用一次会返回两次,父进程、子进程各返回一次

为什么子进程返回0,父进程返回子进程的进程ID呢?

可以这么理解:父进程的调用返回子进程的进程ID,则父进程可以通过本ID来控制子进程;并且子进程可以调用相应的API获取自身的进程ID和父进程的ID,但是父进程却没有办法获取子进程的进程ID,所以父进程的调用返回子进程的进程DI,子进程本身返回0;

子进程和父进程继续执行fork之后的指令,并且子进程是父进程的副本,但注意子进程和父进程并不是共享这些空间,

由于fork之后经常跟随exec,所有现在有很多的实现并不执行一个父进程数据段、栈、堆的完全副本,作为代替,是用 写时复制 【copy-on-write cow】 技术

代码:

  

 1 #include <unistd.h>

  2 #include <stdio.h>

  3 #include <stdlib.h>

  4

  5 int main()

  6 {

  7     int val = 0;

  8

  9     printf("before fork\n");

 10

 11     pid_t pid;

 12

 13     if((pid = fork()) < 0)

 14     {

 15         printf("创建子进程失败!\n");

 16         return -1;

 17     }

 18     else if(0 == pid)

 19     {

 20         //子进程返回

 21         val++;

 22         printf("子进程ID=%ld\n", (long)getpid());

 23     }

 24     else

 25     {

 26         sleep(1);

 27         printf("父进程中返回的子进程ID=%ld\n", (long)pid);

 28     }

 29

 30     printf("pid=%ld, val=%d\n", (long)getpid(), val);

 31     return 0;

 32 }

结果:

[yixin@localhost unix_8]$ gcc fork_0.c

[yixin@localhost unix_8]$ ./a.out

before fork

子进程ID=2759

pid=2759, val=1

父进程中返回的子进程ID=2759

pid=2758, val=0

[yixin@localhost unix_8]$


内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: