以编程方式检查进程是否在后台运行

For*_*med 4 c linux background-process

2个问题:

1) 是否有任何 Linux/Posix API 可以知道某个进程是否已被调用为后台进程?

linux> myprogram &
Run Code Online (Sandbox Code Playgroud)

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

2) 是否有任何 Linux/Posix API 可以使进程在后台运行,即使它已作为前台进程启动?IE 以某种方式在运行时从外壳“分离”..(要么将自身完全从外壳分离,要么作为外壳的后台进程运行)。

linux> myprogram
**** starting myprogram as a background job ****
linux>
Run Code Online (Sandbox Code Playgroud)

shell 提示应该立即返回给我,因为它myprogram已经与 shell 分离并在后台运行

hit*_*dia 5

1)有两种方法可以知道一个进程是否在后台

  1. 有一个信号处理程序SIGTTIN /SIGTTOUT并根据哪个信号处理程序(stdin/stdout)进行非阻塞读/写。

  2. 检查进程组并将其与终端匹配 getpgrp() == tcgetpgrp(STDOUT_FILENO)

您将需要重复检查,因为该过程可以随时前台或后台。

2)有一个daemon功能可以将进程置于后台。建议syslog在守护进程时将应用程序打印重定向到其他文件。

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

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