当前位置:首页 > Windows程序 > 正文

api之进程环境(二)

2021-03-15 Windows程序

 

1、引言

通过上一篇的学习,我们已经知道了如何控制一个进程,fork函数从父进程中复制出子进程,我们可以通过exec函数让子进程运行新的程序,进程可以通过调用exit系列函数(return_exit)终止,父进程可以利用waitwaitpid函数等待某个进程的终止状态。

在操作系统上同时运行着很多的进程,那么这些进程之间有没有什么什么关系呢?答案是肯定的,最起码这些进程之间是有父子关系的,当然只这里要除掉012这三个进程。

那么本篇的主要内容就是进一步讨论这些进程之间的相互关系。

2、终端登录

大家现在登陆一个linux操作系统已经熟练了,只要输入用户名和密码即可,但是对于这个的登陆的过程就不是很熟悉了,我们通过RS-232终端登陆的过程来窥见下这个具体的登陆过程是怎样的。

 

3、进程组

进程组是一个进程或多个进程的集合,每个进程还属于某个唯一的进程组,组ID就是进程组组长的进程IDgetpgrp函数可以返回当前进程所在进程组的组ID

3.1getpgrp函数

1)、函数原型和所需头文件

#include <unistd.h>

pid_t getpgrp(void);

2)、函数功能:获取调用该函数的当前进程所在进程组的组ID

3)、函数参数:无参数。

4)、函数返回值:成功,返回当前进程所在进程组的组ID,失败返回-1errno被设置。

5)、注意:

a)、即使是组长死了,但只要该组中还有一个组员进程正在运行,那么进程组依然存在。

B)、从进程组创建到该组中最后一个进程结束的这段时间,我们称为进程组的生命期。

c)、从shell终端开始运行的第一个进程担任组长,其进程ID就是组ID,随后从该进程fork   出的所有的进程全部属于该组。

d)、当然除了组长进程外任何一个组员都能够通过调用setpgid函数自成一组或则加入其   它组。

6)、测试用例

test.c

#include <stdio.h> #include <unistd.h> int main(void) { int ret = 0; ret = fork(); if(0 == ret) //原始父进程的第一个子进程 { ret = fork(); if(0 == ret){ printf("pgrp = %d\n", getpgrp()); } else if(ret > 0){ printf("pgrp = %d\n", getpgrp()); } } else if(ret > 0){ ret = fork(); //原始父进程的第二个子进程 if(0 == ret){ printf("pgrp = %d\n", getpgrp()); } else if(ret > 0){ //原始父进程 sleep(1);//让所有子进程先运行结束 printf("pgrp = %d\n", getpgrp()); } } return 0; } return 0; }

上例运行结果如下:

pgrp = 4163

pgrp = 4163

pgrp = 4163

pgrp = 4163

可以看出所有进程都同属于一个组,组长由原始父进程担任,从原始父进程复制出来所有的进程都属于该组。

3.2setpgid函数

1)、函数原型和所需头文件

#include <unistd.h>

pid_t getpgid(pid_t pid, pid_t pgid);

2)、函数功能:调用该函数以指定某个进程参加一个现存的组或者创建一个新的进程组。

3)、函数参数

pid_t pid:指定需要被修改为或设置到新进程组的进程。

pid_t pgid:进程组ID,指定某个进程组。

温馨提示: 本文由Jm博客推荐,转载请保留链接: https://www.jmwww.net/file/61408.html