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

5

两个问题:

1)是否有Linux/Posix API可以知道进程是否被作为后台进程调用?

linux> myprogram &

我的程序代码能否检测到它是通过 & 启动的后台进程?

2) 是否有Linux/Posix API可以将前台进程转化为后台进程运行?比如在运行时从shell中“分离”出来(要么完全脱离shell,要么作为shell的后台进程运行)。

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

由于myprogram已经从终端分离并在后台运行,所以命令提示符会立即返回给我。


你可以查看 top 命令的代码,了解它如何获取命令名称和进程状态(可能涉及从 /proc 读取文件)。 - Some programmer dude
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可以作为应用程序的参数,用于控制应用程序是否进入后台运行。


笔误:信号的名称为SIGTTOU,而不是SIGTTOUT - Bruno Haible

2
为了回答你的第二个问题,通常被称为守护进程,它们的构建方式类似于以下内容。
main()
    pid = fork()
    if pid is child
          run program
    else we are the parent process
       exit to command prompt

1
如果一个进程的父shell进程没有被挂起(等待),那么该进程就在后台运行,你可以通过PID检查它。
要将进程放到后台(在运行时完全从shell中分离它),请使用daemon(3)函数。

0

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

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

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


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接