Копирование строки с использованием каналов

StackOverflow https://stackoverflow.com/questions/2092687

  •  21-09-2019
  •  | 
  •  

Вопрос

я написал следующий код для копирования строки "hello world" в другой массив символов, используя fork и каналы вместо использования стандартных библиотечных функций или стандартных потоков ввода-вывода.Программа успешно компилируется, но я не получаю никаких выходных данных.Даже выходные данные printf не отображаются.

# include <string.h>
# include <unistd.h>
# include <stdio.h>

char string[] = "hello world";

int main()

{

        int count, i;
        int toPar[2], toChild[2];
        char buf[256];
        pipe(toPar);
        pipe(toChild);

        if (fork() == 0)
        {
                printf("\n--- child process ---");
                close(0);
                dup(toChild[0]);
                close(1);
                dup(toPar[1]);
                close(toPar[1]);
                close(toChild[0]);
                close(toPar[0]);
                close(toChild[1]);
                for (;;)
                {
                        if ((count = read(0, buf, sizeof(buf))) == 0)
                                break;
                        printf("\nChild buf: %s", buf);
                        write(1, buf, count);
                }
        }

        printf("\n--- parent process ---");
        close(1);
        dup(toChild[1]);
        close(0);
        dup(toPar[0]);
        close(toPar[1]);
        close(toChild[0]);
        close(toPar[0]);
        close(toChild[1]);
        for (i = 0; i < 15; i++)
        {
                write(1, string, strlen(string));
                printf("\nParent buf: %s", buf);
                read(0, buf, sizeof(buf));
        }
        return 0;

   }
Это было полезно?

Решение

Ваш printfы пишут в stdout - но как в родительском, так и в дочернем файлах вы перенаправили файловый дескриптор 1 в канал, так что именно там printf вывод пойдет.

Вместо того , чтобы printf(...), использовать fprintf(stderr, ...) - тогда вы сможете увидеть результат, так как stderr все еще указывает на ваш терминал.

Обратите внимание, что у вас есть пара ошибок:

  • ребенок должен позвонить _exit(0) когда это будет сделано, в противном случае оно попадет в родительский код;
  • в write следует использовать strlen(string) + 1, так что он записывает нулевой терминатор.

Другие советы

Попробуйте добавить " ", например printf("\nParent buf: %s\n", buf);

Я бы предположил, что эти каналы блокируют ввод-вывод, поэтому read просто не вернется, если канал не будет закрыт другим процессом.Это, а также printf, выполняющий буферизованный ввод-вывод, не позволяют вам получать какие-либо выходные данные.

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top