Ввод данных в PIPE
Попытка записать в канал связи больше байт, чем осталось до его заполнения, и больше, чем размер буфера канала связи. Блокировка вызова запрещена.
Проблема такая вместо того чтобы выводить количество введённое в pipe, write мне возвращает -1, если симолов меньше 28, если 28 то повторяет эти 28 символов и выводик количество их, если больше то опять -1 и ошибку.
Примеры работы:
[root@localhost root] prog3
Enter data: 1
Number byte: -1
Примеры работы:
[root@localhost root] prog3
Enter data: 1111111111111111111111111111
1111111111111111111111111111
Number byte: 28
Примеры работы:
[root@localhost root] prog3
Enter data: 11111111111111111111111111111
Number byte: -1
Can't close output stream
Подскажите пожалуйста, где я сделал неправильно?
Вот код
/* Прототипы функции printf() и exit() */
#include <stdio.h>
/* Прототип функции read() */
#include <sys/types.h>
/* Прототип функции pipe() */
#include <unistd.h>
int main(void)
{
/* Дискрипторы pipe */
/* fd[0] - файловый дескриптор, соответствующий входной поток данных */
/* fd[1] - файловый дескриптор, соответствующий выходной поток данных */
int fd[2];
/* Буффер pipe*/
char buffer[6];
size_t size;
/* Попытаемся создать pipe */
if(pipe(fd) < 0)
{
/* Если создать pipe не удалось, печатаем об этом сообщение и прекращаем работу */
printf("Can\'t create pipe\n");
exit(-1);
}
/* Закрываем входной поток для того чтобы небыло блокировки */
if (close(fd[0]) < 0)
printf("Can\'t close input stream\n");
/* Вывод сообщения на ввод данных */
printf("Enter data: ");
/* Ввод данных */
scanf("%s", &buffer);
/* запись данных в канал */
/* Записывается столько байт, сколько осталось до заполнения канала.
Системный вызов возвращает количество записанных байт */
size = write(fd[1], buffer, strlen(buffer));
/* Вывод на экран количество записанных байт */
printf("Number byte: %d\n", size);
/* Закрываем входной поток*/
if (close(fd[1]) < 0)
printf("Can\'t close output stream\n");
/* Завершение работы */
return 0;
}
Потом. Раз уж вы используете pipe в одном процессе, зачем вы закрываете входной поток -- if (close(fd[0]) < 0) ? Далее вы как то интересно работает с памятью на 6 симолов. Во первых так -- scanf("%s", buffer); -- без & , а во вторых что будет если введено больше 6-ти символов?
Вообщем что происходит на самом деле для меня загадка...
Потом. Раз уж вы используете pipe в одном процессе, зачем вы закрываете входной поток -- if (close(fd[0]) < 0) ? Далее вы как то интересно работает с памятью на 6 симолов. Во первых так -- scanf("%s", buffer); -- без & , а во вторых что будет если введено больше 6-ти символов?
Вообщем что происходит на самом деле для меня загадка...
Если поставить if (close(fd[0]) < 0) в место меред if (close(fd[1]) < 0), а вscanf("%s", &buffer) убрать знак &, то первые две ситуации пробадают.
Остаётся ситуация
Примеры работы:
[root@localhost root] prog3
Enter data: 111111111111111111111111
Number byte: -1
Can't close output stream
Can't close output stream
В документации по функции write написано
В канале связи есть место. Попытка записать в канал связи больше байт, чем осталось до его заполнения, и больше, чем размер буфера канала связи. Блокировка вызова запрещена.
Что при такой ситуации функция write действует так
Записывается столько байт, сколько осталось до заполнения канала. Системный вызов возвращает количество записанных байт.
А уменя вместо дого чтобы лишнее отрезалось выскакивают сообщения
Can't close output stream
Can't close output stream
Я так понял в функции write неправильно указал третий параметр, подскажите пожалуйста, где в нём ошибка?
Единственное что могу посоветовать так это посмотреть как работает write (или man write). Если вам интересно по какой причине возвращается -1, поставьте вывод ошибки printf("%s\n", strerror(errno)) в месте возврата функции write;
И прочитайте уже что нибудь о том как устроены pipe. Смотреть на подобный код чудно.
Вот код решения
#include <stdio.h>
#include <sys/types.h>
#include <unistd.h>
int main(void)
{
int fd[2];
char buffer[6] = "Hi";
char r[6];
size_t size;
if(pipe(fd) < 0)
{
printf("Can\'t create pipe\n");
exit(-1);
}
write(fd[1], buffer, 2);
size = write(fd[1], "123456", strlen("123456"));
read(fd[0], r, 9);
printf("%s\n", r);
printf("\nNumber byte: %d\n", size);
if (close(fd[0]) < 0)
printf("Can\'t close input stream\n");
if (close(fd[1]) < 0)
printf("Can\'t close output stream\n");
return 0;
}