завершение процесса не влияет на waitpid () - PullRequest
0 голосов
/ 30 октября 2011

Мне нужно смоделировать следующие команды bash, используя C под Linux (с fork, exec, kill, signal, wait, waitpid, dup2, open, sleep, pipe и т. Д.).

[0] echo 'tail-f $1' > /tmp/rtail
[1]/tmp/rtail ~/.bash_history >> /tmp/1.txt &
PID of process [1] should be saved.
[2] Expect termination of the command started on step [1]. After termination print on the screen: "Program 1 terminated."

ПокаУ меня есть этот код:

#include <fcntl.h>
#include <stdio.h>
#include <unistd.h>
#include <stdlib.h>  
#include <sys/wait.h> 

int main(int argc, char *argv[]) {
    pid_t pID = fork();
    if (pID == 0) // child
    {
        int file = open("/tmp/rtail", O_CREAT | O_WRONLY);

        //Now we redirect standard output to the file using dup2
        dup2(file, 1);

        puts("tail -f $1");
        close(file);
        system("chmod 777 /tmp/rtail");
        exit(0);
    } else if (pID < 0) // failed to fork
    {
        printf("Failed to fork");
        exit(1);
        // Throw exception
    } else // parent
    {
        pid_t pID2 = fork();
        if (pID2 == 0) {
            char tmp1[20];
            sprintf(tmp1, "echo %i > /tmp/pidprog1", getpid());
            system(tmp1);


            int file = open("/tmp/1.txt", O_APPEND | O_WRONLY);

            //Now we redirect standard output to the file using dup2
            dup2(file, 1);
            FILE* proc = popen("sh /tmp/rtail ~/.bash_history", "r");
            char tmp[20];
            while (fgets(tmp, 40, proc) != NULL) {
                printf(tmp);
            }
            fclose(proc);

            exit(0);
        }
        else if (pID2 < 0) // failed to fork
        {
            printf("Failed to fork");
            exit(1);
            // Throw exception
        } else {
            FILE* fl = fopen("/tmp/pidprog1", "r");
            char buff[10];
            fgets(buff, 10, fl);
            int pidc = atoi(buff);
            fclose(fl);
            int status;
            waitpid(pidc, &status, 0);
            printf("Program 1 terminated\n");
        }
    }

    // Code executed by both parent and child.  

    return 0;
}

Проблема в том, что когда я вручную завершаю процесс, используя PID, сохраненный в / tmp / pidprog1, родительский процесс не останавливается и не выводит «Программа 1 завершена»линия.

1 Ответ

1 голос
/ 30 октября 2011

Родитель, скорее всего, читает значение мусора в pidc. Вы ничего не делаете для того, чтобы внук действительно написал pid до того, как родитель попытается его прочитать. Вам нужно использовать wait, чтобы убедиться, что в файле есть действительные pids. (Или просто следите за pids по возвращаемому значению fork.)

Вы не выполняете достаточную проверку ошибок: что произойдет, если произойдет сбой любого открытия? (например, когда вы пытаетесь открыть /tmp/1.txt для добавления, но он еще не существует?)

Почему вы используете fgets для чтения 40 символов в буфер размером 20?

Почему вы копируете и используете fputs, а не просто записываете на fd?

Почему вы печатаете сообщения об ошибках в stdout вместо stderr (используйте perror).

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...