Использование Waitpid и Bash Scripting - PullRequest
0 голосов
/ 09 ноября 2011

Я пытаюсь написать программу, в которой программа непрерывно принимает пользовательский ввод через цикл while, и в каждом цикле разветвляется новый дочерний элемент текущего процесса программы при запуске сценария оболочки. Вот что у меня сейчас есть:

int main(int argc, char **argv)
{
    while(!feof(stdin)){
        printf("Port Number:");
        fgets(portno, 100, stdin);
        input[strlen(portno) - 1] = '\0';
        pid_t pid = fork();

        if (pid < 0){
            die("fork did not work");
        } else if (pid == 0){
            fprintf(stderr, "[pid=%d] ", (int)getpid());
            fprintf(stderr, "process started on port %s\n", portno);
           execl("./netcattest.sh", "netcattest.sh", portno, (char *)0);
            die("program failed");
        } else {
            /*
            if (waitpid(.... NEED HELP ON THIS PART
            */
            fprintf(stderr, "[pid=%d] ", (int)pid);
            fprintf(stderr, "program terminated\n");
        }
    }

return 0;
}

У меня проблема с чтением документации по waitpid, мне немного непонятно, как использовать эту функцию. Я хочу, чтобы в случае, когда программа являлась родительским процессом, я хотел как-то идентифицировать все процессы, которые в данный момент завершены.

Например, если я выполнил цикл 3 раза, и где-то после второго цикла первый процесс завершился, я хочу каким-то образом определить идентификатор процесса, который завершился.

Я знаю, что это связано с использованием опции WNOHANG, но я действительно не понимаю, как она работает.

Большое спасибо, ребята.

РЕДАКТИРОВАТЬ: Кроме того, есть ли быстрый способ сделать 4 отступа для фрагмента кода, а не просто пробел каждой строки по отдельности?

1 Ответ

0 голосов
/ 09 ноября 2011

Я никогда не использовал эту функциональность, но, насколько я понимаю, из документации следует сделать следующее:

int status;
pid_t pid = waitpid(-1, &status, WNOHANG);

на данный момент, pid будет -1 для ошибки, 0, если ни один процесс не завершился, или иначе PID процесса, который вышел (выбран произвольно; для ожидания всех процессов, просто продолжайте вызывать его) , Вы можете проверить status с помощью различных макрофункций, указанных на странице руководства, чтобы определить, как завершился процесс и каким был его код завершения.

...