进程控制(十四)---进程组

  在Linux系统中,每个进程都会属于一个进程组,而每个进程组都有一个进程组ID(pgid),这个进程组ID的值等于组长进程的进程ID。通常在shell下执行的第一个程序将成为一个组长进程,其后生成的所有与此进程有血缘关系的进程都属于此进程组(除非子进程使用setpgid函数改变自己的进程组ID)。

=======================================================

  Linux系统提供了 getpgrp 函数和 getpgid 函数来读取进程的进程组 ID ,提供了 setpgid 函数来设置进程的进程组 ID。

函数原型:

函数参数:

  • getpgrp 函数没有参数,只能用来读取调用进程所属的进程组 ID
  • getpgid 函数用来读取进程 ID 为pid的进程组 ID,当 pid=0时,就相当于 getpgrp 函数
  • setpgid 函数用来设置进程 ID 为pid的进程的进程组 ID 为 pgid。如果pid=0,那么相当于设置调用进程本身的进程组ID;如果pgid=0,那么相当于设置进程组ID和pid相同。要注意的是:一个进程只能够为进程本身或者其子进程设置新的进程组 ID,而且新的进程组和原来的进程组必须是属于同一个会话(session)

返回值:

  • getpgrp:总会调用成功,返回调用进程的进程组ID
  • getpgid:调用成功返回pid的进程组ID,调用失败返回 -1
  • setpgid:调用成功时返回 0, 调用失败时返回 -1
时间: 2025-01-10 15:08:23

进程控制(十四)---进程组的相关文章

进程控制之孤儿进程

#include<stdio.h> #include<sys/types.h> #include<sys/wait.h> #include<unistd.h> #include<signal.h> int main( void ) { daemon_init(); fprintf(stderr, "main进程[%d]\n", getpid() ); while( 1 ) { } exit(0); } int daemon_i

进程控制(十)---exec族函数

当使用fork()创建了一个子进程后,通常接着会使用 exec 族函数指定新的程序来覆盖子进程的代码段.数据段.堆和栈.从而让子进程去执行一个新的程序,而不是执行父进程的副本. ===================================================== exec 族函数中总共有 6 个函数: 上面 5 个函数属于库函数,这些函数都最终调用了下面的 execve 函数,这6个函数中,只有execve 函数属于Linux的系统调用. 出错返回: 这些函数在调用成功时不

进程控制(一)---PCB(进程控制块)

 进程是对程序的动态描述,是操作系统进行资源分配的最小单位(线程是操作系统执行实体的最小单位). 对于多道程序系统来说,其内存中可能存在着很多个进程,为了方便管理这些进程,操作系统内核为每个被创建的进程都建立一个结构体来保存与其相关的信息.这个结构体就是PCB,也就是进程控制块,进程控制块存在于进程的高 1 G空间,也就是内核空间中.在具体linux内核实现中,使用一个名为task_struct的结构体来描述的,在内核/include/linux/sched.h头文件中有具体定义. 操作系统组织

进程控制(1):进程标识符

进程标识符(PID)是一个进程的基本属性,其作用类似于每个人的身份证号码.根据进程标识符,用户可以精确地定位一个进程.一个进程标识符唯一对应一个进程,而多个进程标识符可以对应同一个程序.本文将深入探讨进程标识符及其相关操作. 1 进程标识符 每个进程在系统中都有唯一的一个ID标识它,这个ID就是进程标识符(PID).因为其唯一,所以系统可以根据它准确定位到一个进程.进程标识符的类型为pid_t,其本质上是一个无符号整型的类型别名(typedef). 接下来,我们来简单介绍一个进程与程序的关系.所

进程控制、孤儿进程和僵尸进程

一.进程控制 1.进程标识 1.操作系统里每打开一个进程都会创建一个进程ID,这是唯一标识进程的编号,即PID. 2.PID 在任何时刻都是唯一的,但是可以重用.当进程终止并被回收以后,其 PID 就会被系统回收 3.进程的 PID 由系统内核根据延迟重用算法生成,以确保新进程的 PID 不同于最近终止进程的 PID. 4.进程PID的最大值是有限的(因系统的不同而不同),需要及时回收 2.特殊进程 0 号进程:通常是调度进程,常常被称为交换进程(swapper).该进程是内核的一部分,所有进程

进程控制(六)---孤儿进程和僵尸进程

考虑下面两种情况: 第一种:父进程 先于 子进程 退出. 发生此种情况的时候,子进程便成为 孤儿进程.系统中的所有孤儿进程都会被 init 进程领养,init 进程的进程 ID 始终为 1.系统内当有进程终止的时候,内核会去检查所有的进程是否为该终止进程的子进程,如果是,则将其父进程 ID 修改为 1,即被 init 进程领养.init 进程保证会去 wait 每个子进程的退出.这样一来,就可以保证系统内的所有进程都有父进程.当一个孤儿进程被 init 进程领养的时候,孤儿进程将会由前台进程转为

linux c 笔记 进程控制(四)

一.更改用户 I D和组I D可以用setuid函数设置实际用户ID和有效用户ID.与此类似,可以用 setgid函数设置实际组ID和有效组ID.int setgid(gid_t gid) ;两个函数返回:若成功则为 0,若出错则为- 1关于谁能更改 ID有若干规则.现在先考虑有关改变用户 I D的规则(在这里关于用户 ID所说明的一切都适用于组 ID).(1) 若进程具有超级用户特权,则 setuid函数将实际用户 ID.有效用户 ID,以及保存的设置-用户- ID设置为uid.(2) 若进程

进程控制(十一)---更改进程的用户ID和组ID

Linux提供了setuid函数和seteuid函数来更改与进程相关的用户ID,和进程相关的用户ID有“实际用户ID.有效用户ID和保存的设置用户ID” ====================================================== 函数原型: 函数参数: uid:要设置的用户ID 返回值: 调用成功时返回 0 调用失败时返回 -1 ==================================================== 当进程的有效用户ID是roo

进程控制(十二)---system函数

system函数是用来在进程中执行 shell 命令的.注意其实 exec 族函数其实也可以用来在进程中执行 shell 命令,但是这两个函数实现执行 shell 命令的原理是完全不同的. system函数相当于是 fork->exec->wait 这样的一个过程,也就是说system函数会调用fork函数来创建一个子进程,然后在子进程中去执行 shell命令,不影响父进程的执行. 而直接利用 exec 族函数来执行 shell命令是将 shell命令的代码段.数据段直接覆盖掉本进程原来的代码