如何输出到当前可见的终端

时间:2015-02-24 09:43:10

标签: c++ c linux tty

我想输出一些文字作为对信号SIGUSR1

的回应

即。用户将kill -USR1 <pid>发送到在后台或其他终端中启动的进程。

我想在调用kill的终端中获得一些输出。

我怎样才能做到这一点?

2 个答案:

答案 0 :(得分:2)

@BoBTFish的评论正在发挥作用。一个可能的伪C ++实现:

// somewhere in code:
std::memset(&sa, 0, sizeof(struct sigaction));
sa.sa_sigaction = sh_dump;
sa.sa_flags = static_cast<int>(SA_SIGINFO); // <- important, else you'll get an invalid siginfo_t pointer
sigaction(SIGUSR1, &sa, NULL);

void sh_dump(int, siginfo_t *info, void *) {

    if(info) {

        // do some locking of your choice

        char *p = NULL;
        char sp[PATH_MAX] = "";

        std::snprintf(sp, PATH_MAX, "/proc/%d/stat", info->si_pid);

        int tty_nr = 0;
        FILE *spf;

        if((spf = std::fopen(sp, "r"))) {

            int iDummy;
            char cDummy, *sDummy;

            // proc(5)
            if(std::fscanf(spf, "%d %ms %c %d %d %d %d", &iDummy, &sDummy, &cDummy, &iDummy, &iDummy, &iDummy, &tty_nr)) {}

            free(sDummy);
            std::fclose(spf);
        }

        // see http://goo.gl/L0pGK1 for an implementation
        if(!(p = ttynameCheckDir(static_cast<dev_t>(tty_nr), "/dev/pts"))) {
            p = ttynameCheckDir(static_cast<dev_t>(tty_nr), "/dev");
        }

        std::ofstream out(p ? p : "/dev/null");

        free(p);

        if(out.is_open()) out << "HELLO" << std::endl;

        // do some unlocking of your choice
    }
}

在终端上打印HELLO,调用kill -USR1 <pid>

编辑:使用/proc/#/stat(仅限Linux)

答案 1 :(得分:0)

为了确保您向控制终端写信,设备/dev/tty就是为了这个。如果您处于独立(无控制终端)过程中,它将无法工作。只需打开(2)它和写入(2)通常,stdin / stdout / stderr可以被重定向,所以为了确保你正在写一个用户会看到的地方,打开{ {1}}并写信给它。 /dev/tty早于unix的古代。它的兼容性得到了保护。它也可用于获取密码,并确保您不会重定向输入到进程的文件描述符。