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

时间:2013-02-15 11:59:01

标签: c linux background-process

2个问题:

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

linux> myprogram &

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

2)是否有任何Linux / Posix API使进程在后台运行,即使它已作为前台进程启动? I.E.在运行时以某种方式“脱离”shell ...(要么完全脱离shell,要么作为shell的后台进程运行)。

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

由于myprogram已从shell分离并在后台运行,因此shell提示应该回到我身边

4 个答案:

答案 0 :(得分:4)

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

  1. SIGTTIN /SIGTTOUT的信号处理程序,并根据哪个信号处理程序(stdin / stdout)执行非阻塞读/写操作。

  2. 检查流程组并将其与终端“getpgrp() == tcgetpgrp(STDOUT_FILENO)

  3. 匹配

    您需要重复检查,因为该过程可以随时进行预设或后台处理。

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

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

    其中daemonize可以成为申请是否进入背景的争论。

答案 1 :(得分:2)

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

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

答案 2 :(得分:1)

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

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

答案 3 :(得分:0)

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

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

您可能对isatty(3)函数感兴趣(例如,检测您的 stdin stdout 是否是终端)。