Проблема с setbuf, не работающим в многопроцессорном режиме - PullRequest
0 голосов
/ 31 мая 2019

Как и в следующем коде, я создаю дочерний процесс с использованием функции fork, удаляю буфер stdout и создаю среду условий гонки, но два процесса не конкурируют.

Система: Linux user1-ubuntu64 4.18.0-20-generic Compiler: gcc версии 7.4.0 (Ubuntu 7.4.0-1ubuntu1 ~ 18.04) Команда компиляции: gcc -o test test.c

Если родительский процесс имеет очень небольшую задержку(250 нс), это работает, что я хочу.

Исходный код:

#include <stdio.h>
#include <sys/types.h>

static void printatime(char *);

int main(void)
{
    pid_t pid;

    if ((pid = fork()) < 0)
    {
        perror("fork error");
        return -1;
    }
    else if (pid == 0)
    {
        printatime("AAAAAAAAAAAA");
    }
    else
    {
        printatime("BBBBBBBBBBBB");
    }
    return 0;
}

static void printatime(char *str)
{
    char *ptr = str;
    setbuf(stdout, NULL);
    while (*ptr)
    {
        putc(*ptr++, stdout);
    }
}

Ожидаемые результаты:

user@ubuntu64:~/C$ BAABBABABAABBAAABBABABAB

Фактические результаты:

BBBBBBBBBBBBuser@ubuntu64:~/C$ AAAAAAAAAAAA
...