如何输出到当前可见的终端
How to output to the currently visible terminal
我想输出一些文本作为对信号的响应 SIGUSR1
即用户发送 kill -USR1 <pid>
到在后台或另一个终端启动的进程。
我想在调用 kill
的终端中获得一些输出。
我怎样才能做到这一点?
@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
专门用于此。如果您处于分离(无控制终端)进程中,它将不起作用。只是 open(2) 它和 write(2) 通常,stdin/stdout/stderr 可以被重定向,所以为了确保你在某个地方写用户将看到,打开 /dev/tty
并写入。 /dev/tty
早于 unix 时代。它已被保存以保持兼容性。它也可用于获取密码并确保您不会重定向某些提供给进程的文件描述符。
我想输出一些文本作为对信号的响应 SIGUSR1
即用户发送 kill -USR1 <pid>
到在后台或另一个终端启动的进程。
我想在调用 kill
的终端中获得一些输出。
我怎样才能做到这一点?
@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
专门用于此。如果您处于分离(无控制终端)进程中,它将不起作用。只是 open(2) 它和 write(2) 通常,stdin/stdout/stderr 可以被重定向,所以为了确保你在某个地方写用户将看到,打开 /dev/tty
并写入。 /dev/tty
早于 unix 时代。它已被保存以保持兼容性。它也可用于获取密码并确保您不会重定向某些提供给进程的文件描述符。