我想输出一些文本作为对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的远古时代。 它已被保存的兼容性。 它也可以用来获取密码,并确保你不重定向一些文件描述符。