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提示应该回到我身边
答案 0 :(得分:4)
1)有两种方法可以知道后台进程是否
有SIGTTIN /SIGTTOUT
的信号处理程序,并根据哪个信号处理程序(stdin / stdout)执行非阻塞读/写操作。
检查流程组并将其与终端“getpgrp() == tcgetpgrp(STDOUT_FILENO)
您需要重复检查,因为该过程可以随时进行预设或后台处理。
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)