类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]$