我所知道的:
当进程正在运行时,我可以按“CTRL + Z”并暂停它。使用bg
和fg
命令,我可以在“后台”或“前台”模式下运行它。
我在说什么:
有没有办法暂停进程,将其发送到后台运行或前台运行?
修改 我有进程ID。我想将该过程发送到后台,例如。
答案 0 :(得分:6)
您可以使用kill(pid, SIGSTOP)
暂停它,但将其设置为前台或后台是运行它的shell的函数,因为它实际影响的是shell是否立即显示提示(并接受新命令)或等到工作退出。除非shell提供RPC接口(如DBus),否则没有干净的方法来更改等待/不等待标志。
答案 1 :(得分:2)
Linux进程通常可以通过发送SIGSTOP信号暂停,也可以通过发送SIGCONT信号来恢复。在C中,
#include <signal.h>
kill(pid, SIGSTOP);
kill(pid, SIGCONT);
进程可以使用pause()
暂停自身。
“前景”和“背景”模式不是该过程的属性。它们是父shell进程如何与它们交互的属性:在fg模式下,shell的输入被传递给子进程,shell等待子进程退出。在bg模式下,shell自己获取输入,并与子进程并行运行。
答案 2 :(得分:1)
你做不到。 bg
和fg
是shell命令,您无法从C调用任意shell中的命令。
答案 3 :(得分:1)
通常的方法是分叉子进程,然后退出父进程。 See this for a simple example
#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
#include <sys/types.h>
#include <sys/stat.h>
#define EXIT_SUCCESS 0
#define EXIT_FAILURE 1
static void daemonize(void)
{
pid_t pid, sid;
/* already a daemon */
if ( getppid() == 1 ) return;
/* Fork off the parent process */
pid = fork();
if (pid < 0)
{
exit(EXIT_FAILURE);
}
/* If we got a good PID, then we can exit the parent process. */
if (pid > 0)
{
exit(EXIT_SUCCESS);
}
/* At this point we are executing as the child process */
/* Change the file mode mask */
umask(0);
/* Create a new SID for the child process */
sid = setsid();
if (sid < 0)
{
exit(EXIT_FAILURE);
}
/* Change the current working directory. This prevents the current
directory from being locked; hence not being able to remove it. */
if ((chdir("/")) < 0)
{
exit(EXIT_FAILURE);
}
/* Redirect standard files to /dev/null */
freopen( "/dev/null", "r", stdin);
freopen( "/dev/null", "w", stdout);
freopen( "/dev/null", "w", stderr);
}
int main( int argc, char *argv[] )
{
daemonize();
/* Now we are a daemon -- do the work for which we were paid */
return 0;
}