如何输出到当前可见的terminal

我想输出一些文本作为对SIGUSR1信号的响应

即用户发送kill -USR1 <pid>到在后台或另一个terminal启动的进程。

我想在终止的地方得到一些输出。

我怎样才能做到这一点?

@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)

为了确保你写入控制终端,只有这个设备/dev/tty 。 如果你在一个独立的(无控制终端)的过程中,它将无法正常工作。 只需打开(2)写入(2)通常,可以将stdin / stdout / stderr重定向,以确保您正在写入用户将看到的某处,打开/dev/tty并写入它。 /dev/tty早于unix的远古时代。 它已被保存的兼容性。 它也可以用来获取密码,并确保你不重定向一些文件描述符。