进程组(作业)
(1)概念和特性
進(jìn)程組,也稱之為作業(yè)。BSD于1980年前后向Unix中增加的一個(gè)新特性。代表一個(gè)或多個(gè)進(jìn)程的集合。每個(gè)進(jìn)程都屬于一個(gè)進(jìn)程組。在waitpid函數(shù)和kill函數(shù)的參數(shù)中都曾使用到。操作系統(tǒng)設(shè)計(jì)的進(jìn)程組的概念,是為了簡化對(duì)多個(gè)進(jìn)程的管理。
當(dāng)父進(jìn)程,創(chuàng)建子進(jìn)程的時(shí)候,默認(rèn)子進(jìn)程與父進(jìn)程屬于同一進(jìn)程組。進(jìn)程組的ID就是該進(jìn)程組組長的ID,也就是父進(jìn)程的ID。一個(gè)進(jìn)程只有一個(gè)進(jìn)程組ID,因此一個(gè)進(jìn)程只能有一個(gè)進(jìn)程組。PPID PID PGID 都大于0 。
可以使用kill -SIGKILL -進(jìn)程組ID來將整個(gè)進(jìn)程組內(nèi)的進(jìn)程全部殺死。(注意權(quán)限)
只要進(jìn)程組中有一個(gè)進(jìn)程存在,進(jìn)程組就存在,與組長進(jìn)程是否終止無關(guān)。
進(jìn)程組生存期:進(jìn)程組創(chuàng)建到最后一個(gè)進(jìn)程離開(終止或轉(zhuǎn)移到另一個(gè)進(jìn)程組)。一個(gè)進(jìn)程可以為自己或其它進(jìn)程設(shè)置進(jìn)程組ID,只要權(quán)限夠,即root用戶的進(jìn)程可以設(shè)置所有進(jìn)程的進(jìn)程組ID。
(2)進(jìn)程組操作函數(shù)
getpgrp函數(shù):獲取當(dāng)前進(jìn)程的進(jìn)程組ID
pid_t getpgrp(void); ??成功:返回調(diào)用者的進(jìn)程組ID;失敗:-1,設(shè)置errno
?
getpgid函數(shù):獲取指定進(jìn)程的進(jìn)程組ID(注意權(quán)限)
pid_t getpgid(pid_t pid);???????? 成功:返回進(jìn)程組ID;失敗:-1,設(shè)置errno
如果pid = 0,那么該函數(shù)作用和getpgrp一樣,獲取當(dāng)前進(jìn)程的進(jìn)程組ID。
?
setpgid函數(shù)
改變進(jìn)程默認(rèn)所屬的進(jìn)程組。通常可用來加入一個(gè)現(xiàn)有的進(jìn)程組或創(chuàng)建一個(gè)新進(jìn)程組。
int setpgid(pid_t pid, pid_t pgid); ????? 成功:0;失敗:-1,設(shè)置errno
將參1對(duì)應(yīng)的進(jìn)程,加入?yún)?對(duì)應(yīng)的進(jìn)程組中(可以不存在)。
注意:如改變子進(jìn)程為新的組,應(yīng)fork后,exec前;權(quán)限問題,非root進(jìn)程只能改變自己創(chuàng)建的子進(jìn)程,或有權(quán)限操作的進(jìn)程。
//修改子進(jìn)程的進(jìn)程組ID???
#include <stdio.h> #include <stdlib.h> #include <unistd.h>int main(void) {pid_t pid;if ((pid = fork()) < 0) {perror("fork");exit(1);} else if (pid == 0) {printf("child PID == %d\n",getpid()); //子進(jìn)程IDprintf("child Group ID == %d\n",getpgid(0)); // 返回組id//printf("child Group ID == %d\n",getpgrp()); // 返回組idsleep(7);printf("----Group ID of child is changed to %d\n",getpgid(0)); exit(0);} else if (pid > 0) {sleep(1);setpgid(pid,pid); //讓子進(jìn)程自立門戶,成為進(jìn)程組組長,以它的pid為進(jìn)程組idsleep(13);printf("\n");printf("parent PID == %d\n", getpid()); //父進(jìn)程IDprintf("parent's parent process PID == %d\n", getppid()); //shell進(jìn)程IDprintf("parent Group ID == %d\n", getpgid(0)); //父進(jìn)程組IDsleep(5);setpgid(getpid(),getppid()); //改變父進(jìn)程的組id為shell進(jìn)程IDprintf("\n----Group ID of parent is changed to %d\n",getpgid(0));while(1);}return 0; }[root@localhost 01_session_daemon_test]# ./setpgid
child PID == 19987
child Group ID == 19986
----Group ID of child is changed to 19987
?
parent PID == 19986
parent's parent process PID == 12137
parent Group ID == 19986
?
----Group ID of parent is changed to 12137
總結(jié)
- 上一篇: 亲爱的敌人剧情介绍
- 下一篇: 会话(session)