C - Как реализовать код, который будет выполняться только один раз в родительском процессе после вызова fork ()? - PullRequest
0 голосов
/ 14 июля 2020

Я пытаюсь выполнить printf(">>"); только один раз в родительском процессе. Это означает, что как только я вызываю fork () и создается дочерний процесс, программа (после того, как она снова начинает выполнять код сверху), должна пропустить printf(">>");

Примечание: я пытаюсь реализовать что-то очень аналогично оболочке Python. Обратите внимание, когда вы вводите print("example") в Python Shell, он печатает «example», а не «>>> example»

Прошу прощения за низкую читаемость, я действительно старался изо всех сил.

#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <unistd.h>
#include <sys/types.h>

int main(){

char * selected = malloc(256);
char line[255];
pid_t pid = getpid();

while (1){

    printf("(In parent) PID: %d, PPID: %d\n", getpid(), getppid());

    // if (ps is parent && line is NOT executed later on by fork){
    printf(">>");
    //}

    fgets(line, sizeof(line), stdin);
    line[strlen(line) - 1] = '\0'; // removes \n 

    if (strcmp(line, "fork") == 0){
        pid = fork();
        if (pid == 0){
            printf("(In child) PID: %d, PPID: %d\n", getpid(), getppid());
        }
    }
}

return 0;
}

1 Ответ

1 голос
/ 14 июля 2020

Просто позвоните printf(">>");, а затем fflush(NULL); (прочтите fflu sh (3) ) перед fork().

Помните, что stdio (3) помещается в буфер. См. setvbuf (3) и используйте strace (1) и gdb (1) .

См. Также Advanced Linux Программирование и системные вызовы (2)

Также подумайте о том, чтобы изучить исходный код небольших оболочек, таких как sa sh*, для вдохновения. 1027 *.

...