Подождите, не работает, чтобы синхронизировать три процесса - PullRequest
1 голос
/ 12 сентября 2011

Я новый C dev. Я пытаюсь синхронизировать три процесса, чтобы напечатать [ОТЕЦ] [СЫН] [ГРАНДСОН] [ОТЦ] [СЫН] [ГРАНДСОН] с этим кодом:

int main(int argc, char **argv)
{

    int c = 0;
    while (c<2)
    {
        c++;
        printf("[FATHER]");
        pid_t son = fork();
        if (son == 0)
        {
            printf("[SON]");
            pid_t grandson = fork();
            if (grandson == 0)
            {
                printf("[GRANDSON]");
                return 0;
            }
            wait(NULL);
            return 0;
        }
        wait(NULL);
    };

  }

Вместо этого я получаю этот вывод: [ОТЕЦ] [СЫН] [ГРАНДСОН] [ОТЕЦ] [СЫН] [ОТЕЦ] [ОТЕЦ] [СЫН] [ГРАНДСОН] [ОТЕЦ] [ОТЕЦ] [СЫН] [ОТЕЦ] [ ОТЕЦ]

Неужели я что-то недопонимаю или упускаю при использовании кода ожидания? Большое спасибо.

1 Ответ

0 голосов
/ 12 сентября 2011

Вместо вызова fflush после каждого вызова printf было бы лучше, если бы вы использовали системный вызов write для печати в stdout (при необходимости сначала отформатируйте строку вывода, используя sprintf),Системный вызов write выполняет небуферизованную запись, что избавит вас от необходимости каждый раз вспоминать о вызове fflush.

Вы можете даже использовать макрос с переменным числом, чтобы избежать записи строки sprintf, за которой следуетwrite строка.

...