编程检查某个进程在后台中运行(Programmatically check if a process

2019-07-19 23:21发布

2个问题:

1)是否有任何Linux / POSIX的API知道,如果一个过程已经调用作为后台进程?

linux> myprogram &

该代码可以myprogram检测到它已被调用在后台(通过运行& )?

2)是否有任何Linux / POSIX的API,使在后台运行的过程,即使它已经开始作为一个前台进程? IE以某种方式在运行时从外壳“分离” ..(无论是从壳分离本身完全,或运行作为壳的后台进程)。

linux> myprogram
**** starting myprogram as a background job ****
linux>

在shell提示应该马上就回来给我,因为myprogram已经从外壳脱离,并在后台运行

Answer 1:

1)有两种方法以了解是否在后台进程

  1. 具有用于信号处理程序SIGTTIN /SIGTTOUT ,做一个非阻塞读/写,这取决于信号的处理程序(标准输入/输出)。

  2. 检查过程的基团和与终端匹配它getpgrp() == tcgetpgrp(STDOUT_FILENO)

您将需要重复检查,因为过程可以前景化或随时转到后台运行。

2)有一个daemon函数把过程中的背景。 其建议将应用程序打印重定向到syslog或一些其他文件,而daemonizing。

if (daemonize) {
//redirect all prints to syslog or some other logfile
    daemon(0, 0);
}

在那里daemonize可以是arguement该应用是否进入背景或没有。



Answer 2:

要回答你的第二个部分,这通常被称为守护进程,他们正在建立这样的事情。

main()
    pid = fork()
    if pid is child
          run program
    else we are the parent process
       exit to command prompt


Answer 3:

一种方法是在背景中,如果它的父壳过程没被暂停(等待),它可以通过PID检查。

为了把一个进程在后台(在运行时从外壳完全分离的话),可以使用守护进程(3)功能。



Answer 4:

你可能想读TTY(4)手册页。 据我了解,在后台进程没有任何/dev/tty (所以open -ing该文件会失败)。

TIOCNOTTY IOCTL应拆离其控制终端的呼叫过程。

你可能有兴趣在isatty(3)的功能(例如检测到您的标准输入标准输出是或不是终端)。



文章来源: Programmatically check if a process is being run in the background