我的一个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/

10-15 20:44