当我将 cat 命令作为后台进程运行时,
$ cat &
然后尝试杀死它
$ killall -v cat
它说它用信号 15 杀死了猫,但那只猫只是被阻止了。运行后$ ps
,我看到它仍在运行。直到我打电话$ fg
才最终终止。
似乎与等待输入有关,因为在c++中模拟cat时,
string line;
while(getline(cin, line))
cout << line << endl;
同样的事情也会发生,但是对于一个简单的while(true);
循环,进程被成功杀死。
它似乎也是一个后台进程,因为当我运行$ cat
并在另一个终端中$ killall -v cat
它也可以正常工作。
这里发生了什么?提前致谢。
答案1
当你跑步时
cat &
你应该会看到一条消息说
[1]+ Stopped cat
此后不久(可能有不同的工作编号)。这是因为cat
尝试从其标准输入读取,因此当它在后台运行时,它最终会被停止。
SIGKILL
停止的进程在恢复之前不会接收信号(续)。这就是这里发生的情况:SIGTERM
只有当进程继续时,您的数据才会被传递,当您将其返回到前台时,就会发生这种情况。