4

我知道的:

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

我在问什么:

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

编辑: 我有进程ID。例如,我想将该过程发送到后台。

4

4 回答 4

6

您可以使用 挂起它kill(pid, SIGSTOP),但使其成为前台或后台是运行它的 shell 的一个功能,因为它实际影响的是 shell 是立即显示提示(并接受新命令)还是等到作业退出。除非 shell 提供 RPC 接口(如 DBus),否则没有干净的方法来更改等待/不等待标志。

于 2011-07-04T17:32:08.267 回答
2

Linux 进程通常可以通过向其发送 SIGSTOP 信号来暂停或通过向其发送 SIGCONT 信号来恢复。在 C 中,

#include <signal.h>

kill(pid, SIGSTOP);
kill(pid, SIGCONT);

进程可以使用pause().

“前景”和“背景”模式不是进程的属性。它们是父 shell 进程如何与它们交互的属性: 在 fg 模式下,shell 的输入被传递给子进程,shell 等待子进程退出。在 bg 模式下,shell 自己接受输入,并与子进程并行运行。

于 2011-07-04T17:37:24.963 回答
1

你不能。bgfg是 shell 命令,你不能在 C 的任意 shell 中调用命令。

于 2011-07-04T17:32:49.593 回答
1

通常的方法是分叉一个子进程,然后退出父进程。看这个简单的例子

#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;  
}
于 2011-07-04T17:33:04.873 回答