5

2个问题:

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

linux> myprogram &

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

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

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

由于myprogram已从外壳中分离并在后台运行,因此外壳提示符应立即返回给我

4

4 回答 4

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);
}

哪里daemonize可以成为应用程序是否进入后台的争论。

于 2013-02-15T12:08:27.277 回答
2

为了回答您的第二部分,这通常称为守护进程,它们是这样构建的。

main()
    pid = fork()
    if pid is child
          run program
    else we are the parent process
       exit to command prompt
于 2013-02-15T12:06:30.063 回答
1

如果其父 shell 进程未挂起(等待),则该进程处于后台,您可以通过 PID 进行检查。

要将进程置于后台(在运行时将其与 shell 完全分离),请使用 daemon(3) 函数。

于 2013-02-15T12:09:15.647 回答
0

您可能需要阅读tty(4)手册页。据我了解,后台进程没有任何进程/dev/tty(因此open该文件将失败)。

ioctl 应该将TIOCNOTTY调用进程与其控制终端分离。

您可能对isatty(3)函数感兴趣(例如,检测您的标准输入标准输出是否是终端)。

于 2013-02-15T12:39:03.237 回答