Как напечатать \ n на строке во время дочернего процесса на вилке - PullRequest
0 голосов
/ 13 декабря 2018

Мой код:

#include <stdlib.h>
#include <stdio.h>
#include <stdbool.h>
#include <unistd.h>

int main(){
    fork();
    printf("Show me the new line before the pid child dies \n");
    return 0;
}

Вывод:

>Show me the new line before the pid child dies Show me the new line before the pid child dies"\n
>

Мой ожидаемый результат - показать '\ n' как часть строки и иметь две отдельные строки,как показано ниже:

>string1 \n
>string2 \n
>

, но я получаю следующее:

>string1 string2 \n
>

Я пытался использовать fflush (стандартный вывод), но ничего не изменилось.

#include <stdlib.h>
#include <stdio.h>
#include <stdbool.h>
#include <unistd.h>

int main(){
    fork();
    printf("Show me the new line before the pid child dies \n");
    fflush(stdout);
    return 0;
}

Тот же вывод:

>"Show me the new line before the pid child dies Show me the new line before the pid child dies"
>

Как мне сделать так, чтобы я получил следующий вывод:

>"Show me the new line before the pid child dies \n"
> Show me the new line before the pid child dies \n"
>

Обновление:

Если я запускаюкак показано ниже, он показывает мне правильные строки (как я хотел):

Команда на терминале / powershell

 .\f.exe > f.out

Вывод:

1 Show me the new line before the pid child dies 
2 Show me the new line before the pid child dies 
3 

Я меняюмой вопрос: могу ли я получить точно такой же вывод, что и на моем терминале (против кода / powershell), когда я получаю файл f.out?

Я использую MS Visual Studio в Windows.

Ответы [ 2 ]

0 голосов
/ 13 декабря 2018

Типичная проблема параллелизма.Обеспечьте правильное многопоточное поведение и устраните условия гонки с помощью мьютекс-блокировок и т.п.

В соответствии с POSIX и ISO, буферы stdout выводятся до тех пор, пока не попадут на новую строку или не произойдут явные сбросы, что требует времени и состояния гонки.Если вы перенаправляете в файл, std ведет себя по-другому.Новая строка попадает в буфер, но не запускает очистку, в то время как явное fflush принудительно заставит его, поэтому printf завершает работу, и дочерние элементы не сталкиваются друг с другом до середины fflush, но ваш буфер настроенкак ты хочешь к тому времени.Вы, вероятно, не должны зависеть от того, что время происходит таким образом.

0 голосов
/ 13 декабря 2018

Возможно, вы получили состояние гонки, после вызова fork() родительский поток и дочерний поток пытаются печатать одновременно.Поведение в этом случае не определено.Возможно, вся идея домашней работы состоит в том, чтобы научить вас этому.Вы должны использовать какую-то связь между потоками или просто ждать в родительском процессе (или в дочернем процессе это не имеет значения).

if (fork()) sleep(1);

Обновление:

Внимательно прочитав вашу строку вывода, я понял, что ваше упражнение, вероятно, состоит в том, чтобы научиться ждать в родительском процессе, пока ребенок не умрет, это достигается следующим образом:

if (fork() != 0) wait(NULL);

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