一、进程间的关系
进程间的三种关系:进程组、作业和会话。
1、进程组
每个进程除了有一个进程ID之外,还属于一个进程组。进程组是一个或多个进程的集合。通常,它们与同一作业相关联,可以接收来自同一终端的各种信号。每个进程组有一个唯一的进程组ID。每个进程组都可以有一个组长进程(该组进程的第一个,组成员ID等于组长ID)。组长进程的标识是,其进程组ID等于其进程ID。
组长进程可以创建一个进程组,创建该组中的进程,然后终止。只要在某个进程组中一个进程存在,则该进程组就存在,这与其组长进程是否终止无关。
2、作业
1>Shell分前后台来控制的不是进程而是作业(Job)或者进程组(Process Group)。一个前台作业可以由多个进程组成,一个后台也可以由多个进程组成,Shell可以运行一个前台作业和任意多个后台作业,这称为作业控制。
2>作业与进程组的区别:
如果作业中的某个进程又创建了子进程,则子进程不属于作业,但是却属于进程组。一旦作业运行结束,Shell就把自己提到前台,如果原来的前台进程还存在(如果这个子进程还没终止),它自动变为后台进程组。(一般情况进程组合作业不做区别)
查看后台作业:jobs
将前台作业提至后台:bg 1(作业号) 先要contrl C终止后台作业
将后台作业提至前台:fg 1(作业号)
3>实例:fork一个子进程,如果父进程先退出,作业结束,进程组还在,shell成为前台作业,子进程成为后台进程组,ctrl C终止不了。
8 #include<stdio.h>
9 #include<unistd.h>
10 #include<stdlib.h>
11
12 int main()
13 {
14 pid_t pid = fork();
15 while(1)
16 {
17 if(pid == -1)
18 {
19 perror("fork error");
20 return -1;
21 }
22 else if(pid > 0)//father
23 {
24 printf("i am father\n");
25 exit(1);//父进程