有没有办法改变正在运行的进程的PID、PPID、SID?答案是否定的是有道理的,但我想确定一下。
考虑一个 fork 子进程然后终止的进程。虽然这没什么不正常的(它一直发生),但如果在父终止时子停止(使用作业控制)会发生什么?孩子将如何继续下去,孩子是否知道自己已成为孤儿?
...
如果进程组不是孤立的,则不同进程组中但在同一会话中的父进程之一可能会重新启动非孤立进程组中已停止的进程。
...
由于父进程终止时进程组是孤立的,并且进程组包含一个停止的进程,POSIX.1 要求新孤立进程组中的每个进程都发送挂断信号(SIGHUP),然后是继续信号(SIGCONT) )。
如果只是担心停止的进程在其进程组变为孤立后没有机会被唤醒,为什么内核在其进程组变为孤立时不发送 SIGCONT,为什么还需要发送 SIGHUP?
我正在学习 Linux 中进程、进程组(和会话)之间的关系。
我编译了以下程序...
#include <iostream>
#include <ctime>
#include <unistd.h>
int main( int argc, char* argv[] )
{
char buf[128];
time_t now;
struct tm* tm_now;
while ( true )
{
time( &now );
tm_now = localtime( &now );
strftime( buf, sizeof(buf), "%a, %d %b %Y %T %z", tm_now );
std::cout << buf << std::endl;
sleep(5);
}
return 0;
}
Run Code Online (Sandbox Code Playgroud)
...a.out
作为后台进程运行它,就像这样......
a.out &
Run Code Online (Sandbox Code Playgroud)
这个网站说以下...
每个进程都是唯一进程组的成员,由其进程组 ID 标识。(创建进程时,它成为其父进程组的成员。)按照惯例,进程组的进程组 ID 等于进程组的第一个成员的进程 ID,称为进程组组长。
根据我的阅读,第一句与括号内的内容冲突:进程是唯一进程组的成员,还是其父进程组的成员?
我试图调查 …
根据我目前所了解的,一个终端只有一个会话,一个会话有一个或多个进程组,一个进程组有一个或多个进程。
下图说明了这一点:
我有两个问题:
编辑:我的意思是如何从终端而不是以编程方式做这两件事。
我从Informit 文章中了解到,会话和进程组用于在退出时终止后代进程,并向具有作业控制的相关进程发送信号。
我相信可以使用每个进程的 PPID 在任何时候提取此信息。这些概念的存在是否只是为了拥有一个能够快速获取进程后代的数据结构?
除了作业控制和终止后代之外,会话组和进程组是否还从事其他工作?他们存储任何上下文信息吗?
任何好的参考资料都会有所帮助。