Копирование строки с использованием каналов
Вопрос
я написал следующий код для копирования строки "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, выполняющий буферизованный ввод-вывод, не позволяют вам получать какие-либо выходные данные.