C Запустите программу из другой программы в фоновом режиме и закройте ее из программы. - PullRequest
0 голосов
/ 09 сентября 2018

Я хотел запустить Программу в фоновом режиме, и она должна быть остановлена ​​с первой Программы. Код vom стартера C-Code:

#include<stdio.h>
#include<stdlib.h>

int main() {
    char command[50];
    int i;

    for(i=0; i<10; i++)
    {
            snprintf(command, sizeof(command), "./test %i &", i);
            system(command);
    }
    printf("FERTIG\n");
}

А вот код, который должен быть запущен в этом случае 10 раз: (Позже код должен быть намного больше, и это будет другой код, но будет код while (1). Так что он мне понадобится.)

#include<stdio.h>

int main(int argc, char* argv[])
{
    int i;
    printf("argc: %i\n", argc);
    for(i=0; i < argc; i++)
    {
            printf("argv[%d]: %s\n", i, argv[i]);
    }
    printf("FERTIG\n");
    while(1)
            printf("DAUERSCHLEIFE");
}

Я надеюсь, что кто-то может мне помочь. И нет, я не могу использовать любые другие языки, потому что я использую Raspberry Pi и уже знаком с C. Я не хочу изучать какие-либо другие языки.

И вопрос в том, есть ли способ остановить цикл while (1) из первой программы?

Ответы [ 2 ]

0 голосов
/ 10 сентября 2018

Калеб мне очень помог. На самом деле это не сработало, как я хотел, но я нашел еще один пост на ubuntuforums.org (ключевые слова: c pid_t fork kill exec). И это был действительно хороший ответ. Так что благодаря вашей помощи Калеб. Это должно быть голосование, но мой представитель недостаточно высок. Так жаль. Но это сказало, что было зарегистрировано.

Так вот ссылка на пост: https://ubuntuforums.org/showthread.php?t=675734

А вот и код:

#include <unistd.h>
#include <sys/types.h>
#include <signal.h>
#include <stdio.h>

int main()
{
    pid_t childPID = fork();

    if ( childPID == -1 )
    {
        printf( "failed to fork child\n" );
        _exit( 1 );
    }
    else if ( childPID == 0 )
    {
        char *args[] = { "test", "hello", "world", 0 };

        execv( "test", args );
    }

    while ( 1 )
    {
        printf( "Enter 'q' to kill child process...\n" );
//      char c = getchar();
        sleep( 10 );
        char c = 'q';
        if ( c == 'q' )
        {
            kill( childPID, SIGKILL );
            break;
        }

        sleep( 1 );
    }

    return 0;
}

Я надеюсь, что любые другие люди, также имеющие эту проблему, могли бы решить ее с помощью моего вопроса и ответа.

Но большое спасибо Калебу.

0 голосов
/ 09 сентября 2018

есть ли способ остановить цикл while (1) из первой программы?

Одним из способов является вызов kill() для отправки процессу сигнала SIGTERM или SIGKILL, что должно привести к выходу программы. Однако для этого вам также понадобится идентификатор процесса, который вы хотите уничтожить, и вызов system() не даст вам этого. Вместо этого вы можете запустить процесс, fork() запустив свой собственный процесс и вызвав exec() (или один из его вариантов) в дочернем процессе, чтобы запустить новую программу. Таким образом, ваш код будет выглядеть примерно так:

pid_t child_pid = fork();
if (child_pid == 0) {
    execl(command);
}

Затем, когда родительский процесс хочет остановить дочерний процесс, он может сделать:

kill(child_pid, SIGTERM);    // or SIGKILL

чтобы остановить ребенка.

Использование сигнала для уничтожения процесса - довольно тупой инструмент. Было бы лучше организовать какой-либо другой метод межпроцессного взаимодействия между двумя процессами, и чтобы дочерний процесс проверял сообщения от родительского процесса, которые говорят ему о корректном завершении работы.

...