Контроль работы в Linux с C - PullRequest
4 голосов
/ 04 июля 2011

Что я знаю:

Когда процесс запущен, я могу нажать «CTRL + Z» и приостановить его. С помощью команд bg и fg я могу запустить его в режиме «фон» или «передний план».

Что я задаю:

Есть ли способ приостановить процесс, отправить его для запуска в фоновом режиме или на переднем плане в C?

Edit: У меня есть идентификатор процесса. Я хочу отправить этот процесс в фоновом режиме, например.

Ответы [ 4 ]

6 голосов
/ 04 июля 2011

Вы можете приостановить его с помощью kill(pid, SIGSTOP), но создание его переднего или заднего плана является функцией оболочки, которая его выполняла, поскольку на самом деле это влияет на то, отображает ли оболочка приглашение (и принимает ли ононовая команда) немедленно или ожидает завершения задания.Если оболочка не предоставляет интерфейс RPC (например, DBus), нет простого способа изменить флаг ожидания / не ожидания.

2 голосов
/ 04 июля 2011

Процесс Linux обычно можно приостановить, отправив ему сигнал SIGSTOP, или возобновить, отправив ему сигнал SIGCONT. В С

#include <signal.h>

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

Процесс может приостановить себя, используя pause().

Режимы «Передний план» и «Фон» не являются свойствами процесса. Это свойства того, как родительский процесс оболочки взаимодействует с ними: в режиме fg вход в оболочку передается дочернему процессу, и оболочка ожидает выхода дочернего процесса. В режиме bg оболочка принимает данные сама и работает параллельно дочернему процессу.

1 голос
/ 04 июля 2011

Обычный способ - отключить дочерний процесс и выйти из родительского процесса. Смотрите простой пример .

#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;  
}
1 голос
/ 04 июля 2011

Вы не можете. bg и fg являются командами оболочки, и вы не можете вызвать команду в произвольной оболочке из C.

...