У меня проблемы с пониманием потока, когда запущено несколько процессов fork - PullRequest
1 голос
/ 14 октября 2019

Я запускаю программу, в которой она запускает несколько процессов (в данном случае, команд). Я застрял в запуске нескольких процессов, так как он повторяет и запускает фрагменты кода несколько раз. У меня МНОГО проблем, пытающихся следить за тем, что происходит.

Я уже посмотрел множество видео на YouTube и другие вопросы SO по этому поводу.

Ниже приведен вариант моего кода, включая псевдокод:

int forking(char **command) {

pid_t parentPID = getpid();
pid_t childPID = fork();

if(childPID < 0) {
    printf("Fork failed\n");
} else if(childPID == 0) { //child process
    printf("Child PID: %d\n", getpid());
} else {
    printf("Parent PID: %d\n",
}

}

int main() {

    //open file of commands, each spaced by a newline

    printf("Main PID: %d\n", parentPID);
    while((getline(&command, &len_buffer, file_pointer)) != -1) {
        printf("-----------------\n);
        //parse command using strtok() to use execvp()
        pid = forking(parsed_command_array);
        if(pid == parentPID) {
            printf("This is the parent: %d\n", pid);
        else {
            printf("This is child, pid is: %d\n", pid);
        }
    }
}

Кажется, что выводятся следующие выходные данные для 2 команд:

------------------------
Main PID: 42729
Parent PID: 42729
This is parent: 42729
------------------------
Main PID: 42729
Child PID: 42730
This is child, pid is: 42730
------------------------
Main PID: 42729
Parent PID: 42729
This is parent: 42729
Child PID: 42731
This is child, pid is: 42731
Parent PID: 42730
This is child, pid is: 42730
Child PID: 42732
This is child, pid is: 42732

Я хотел, чтобы код для каждой команды в цикле while: 1Разобрать команду для execvp (что я уже сделал) 2. Вызвать fork в функции и вернуть PID. Если PID является родительским, игнорируйте, если PID является дочерним, напечатайте PID.

Я также хотел сохранить элемент управления в родительском элементе, чтобы при запуске fork я хотел получить дочерний элементPID, запустите процесс в потомке, затем вернитесь к родителю.

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

1 Ответ

0 голосов
/ 14 октября 2019

В конце цикла while после первого прохода у вас есть два процесса. Оба этих процесса возвращаются к началу цикла, и оба развивают новый процесс. Теперь у вас есть 4 процесса, и на следующей итерации они все разветвляются, и теперь у вас есть 8.

Вы хотите, чтобы дочерний процесс вызывал exit или execvp, чтобы он не продолжал цикл.

...