Linux进程中最知名的属性就是它的进程号(Process Idenity Number,PID)和它的父进程号(parent process ID,PPID)。PID、PPID都是非零正整数。一个PID惟一地标识一个进程。一个进程创建新进程称为创建了子进程(child process)。相反地,创建子进程的进程称为父进程。所有进程追溯其祖先最终都会落到进程号为1的进程身上,这个进程叫做init进程。是内核自举后第一个启动的进程。init进程作用是扮演终结父进程的角色。因为init进程永远不会被终止,所以系统总是可以确信它的存在,并在必要的时候以它为参照。如果某个进程在它衍生出来的全部子进程结束之前被终止,就会出现必须以init为参照的情况。此时那些失去了父进程的子进程就都会以init作为它们的父进程。如果你执行一下ps -af 命令,可以列出许多父进程ID(Parent Process ID,PPID)为1的进程来。Linux提供了一条pstree命令,允许用户查看系统内正在运行的各个进程之间的继承关系。直接在命令行中输入pstree即可,程序会以树状结构方式列出系统中正在运行的各进程之间的继承关系。
setpgid(设置进程组识别码)
相关函数 getpgid,setpgrp,getpgrp
表头文件 #include<unistd.h>
定义函数 int setpgid(pid_t pid,pid_t pgid);
函数说明 setpgid()将参数pid 指定进程所属的组识别码设为参数pgid 指定的组识别码。如果参数pid 为0,则会用来设置目前进程的组识别码,如果参数pgid为0,则会以目前进程的进程识别码来取代。
返回值 执行成功则返回组识别码,如果有错误则返回-1,错误原因存于errno中。
错误代码 EINVAL 参数pgid小于0。
EPERM 进程权限不足,无法完成调用。
ESRCH 找不到符合参数pid指定的进程。
setpgrp(设置进程组识别码)
相关函数 getpgid,setpgid,getpgrp
表头文件 #include<unistd.h>
定义函数 int setpgrp(void);
函数说明 setpgrp()将目前进程所属的组识别码设为目前进程的进程识别码。此函数相当于调用setpgid(0,0)。
这个函数的意思是说如果调用的进程不是会话首进程,则将进程组号和会话号设置为与它的进程号相等的。并释放调用进程的终端。
此时子进程作为一个后台进程,就不会收到ctrl+c之类的信号了。
返回值 执行成功则返回组识别码,如果有错误则返回-1,错误原因存于errno中。