Ввод данных в PIPE (pipe на gcc)

Модератор: Модераторы разделов

zuze
Сообщения: 27
ОС: Red Hat

Ввод данных в PIPE

Сообщение zuze »

У меня задача такая - В канале связи есть место.
Попытка записать в канал связи больше байт, чем осталось до его заполнения, и больше, чем размер буфера канала связи. Блокировка вызова запрещена.

Проблема такая вместо того чтобы выводить количество введённое в 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;
}
Спасибо сказали:
zuze
Сообщения: 27
ОС: Red Hat

Re: Ввод данных в PIPE

Сообщение zuze »

Прошу прощения, что я ввёл в заблуждение у меня надо было добавить данные больше размера буфера pipa и больше чем там осталось места с учётом того, что блокировка вызова запрещена.

Вот код решения

#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("12345"));
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;
}
Спасибо сказали: