2个问题:
1)是否有任何Linux / POSIX的API知道,如果一个过程已经调用作为后台进程?
linux> myprogram &
该代码可以myprogram
检测到它已被调用在后台(通过运行&
)?
2)是否有任何Linux / POSIX的API,使在后台运行的过程,即使它已经开始作为一个前台进程? IE以某种方式在运行时从外壳“分离” ..(无论是从壳分离本身完全,或运行作为壳的后台进程)。
linux> myprogram
**** starting myprogram as a background job ****
linux>
在shell提示应该马上就回来给我,因为myprogram
已经从外壳脱离,并在后台运行
1)有两种方法以了解是否在后台进程
具有用于信号处理程序SIGTTIN /SIGTTOUT
,做一个非阻塞读/写,这取决于信号的处理程序(标准输入/输出)。
检查过程的基团和与终端匹配它getpgrp() == tcgetpgrp(STDOUT_FILENO)
您将需要重复检查,因为过程可以前景化或随时转到后台运行。
2)有一个daemon
函数把过程中的背景。 其建议将应用程序打印重定向到syslog
或一些其他文件,而daemonizing。
if (daemonize) {
//redirect all prints to syslog or some other logfile
daemon(0, 0);
}
在那里daemonize
可以是arguement该应用是否进入背景或没有。
要回答你的第二个部分,这通常被称为守护进程,他们正在建立这样的事情。
main()
pid = fork()
if pid is child
run program
else we are the parent process
exit to command prompt
一种方法是在背景中,如果它的父壳过程没被暂停(等待),它可以通过PID检查。
为了把一个进程在后台(在运行时从外壳完全分离的话),可以使用守护进程(3)功能。
你可能想读TTY(4)手册页。 据我了解,在后台进程没有任何/dev/tty
(所以open
-ing该文件会失败)。
该TIOCNOTTY
IOCTL应拆离其控制终端的呼叫过程。
你可能有兴趣在isatty(3)的功能(例如检测到您的标准输入和标准输出是或不是终端)。