使用C在Linux中进行作业控制

时间:2011-07-04 17:18:59

标签: c linux process job-control

我所知道的:

当进程正在运行时,我可以按“CTRL + Z”并暂停它。使用bgfg命令,我可以在“后台”或“前台”模式下运行它。

我在说什么:

有没有办法暂停进程,将其发送到后台运行或前台运行?

修改 我有进程ID。我想将该过程发送到后台,例如。

4 个答案:

答案 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)

你做不到。 bgfg是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;  
}