我的一个c++应用程序在运行一段不确定的时间后将挂起,因为它没有被终止,所以父进程无法重新启动它。
众所周知,sigttin可以通过nohup
或使用</dev/null
重定向标准输入来防止程序被挂起,但这并不能从根本上解决问题。
那么,有人知道如何调试或定位产生sigttin信号的代码的位置吗?
// this is a example, exec command to get SIGTTIN: ./a.out &
#include <unistd.h>
#include <sys/types.h>
#include <sys/stat.h>
#include <fcntl.h>
#include <stdio.h>
#include <stdlib.h>
#include <signal.h>
int main(int argc, char* argv[]) {
int len;
char buf[64];
while(1) {
len = read(STDIN_FILENO, buf, 64);
if (len > 0) {
write(STDOUT_FILENO, buf, len);
}
else {
perror("read");
}
}
return 0;
}
最佳答案
你在后台启动你的程序,执行./a.out &
操作,但是你的程序从stdin读取,所以你有这个信号
从https://www.gnu.org/software/libc/manual/html_node/Job-Control-Signals.html:
宏:int sigttin
进程作为后台作业运行时无法从用户终端读取。当后台作业中的任何进程试图从终端读取时,该作业中的所有进程都会发送一个sigttin信号。此信号的默认操作是停止进程。有关如何与终端驱动程序交互的详细信息,请参阅访问终端。
找到产生sigttin信号的代码的位置?
这是阅读
关于c - 如何找到导致应用程序在Linux下接收SIGTTIN的代码位置?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/56357784/