Справочник функций

Ваш аккаунт

Войти через: 
Забыли пароль?
Регистрация
Информацию о новых материалах можно получать и без регистрации:

Почтовая рассылка

Подписчиков: -1
Последний выпуск: 19.06.2015

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

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

Проблема такая вместо того чтобы выводить количество введённое в 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;
}
361
07 марта 2008 года
Odissey_
661 / / 19.09.2006
Эм... честно говоря вообще не понял что вы хотите сделать... pipe для одного процесса это конечно интересно, но зачем?
Потом. Раз уж вы используете pipe в одном процессе, зачем вы закрываете входной поток -- if (close(fd[0]) < 0) ? Далее вы как то интересно работает с памятью на 6 симолов. Во первых так -- scanf("%s", buffer); -- без & , а во вторых что будет если введено больше 6-ти символов?
Вообщем что происходит на самом деле для меня загадка...
11K
07 марта 2008 года
zuze
84 / / 07.03.2008
Цитата: Odissey_
Эм... честно говоря вообще не понял что вы хотите сделать... pipe для одного процесса это конечно интересно, но зачем?
Потом. Раз уж вы используете 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 неправильно указал третий параметр, подскажите пожалуйста, где в нём ошибка?

361
07 марта 2008 года
Odissey_
661 / / 19.09.2006
Для меня, все что вы говорите -- японская письменность. Вы как буд то ребус из программы складываете.

Единственное что могу посоветовать так это посмотреть как работает write (или man write). Если вам интересно по какой причине возвращается -1, поставьте вывод ошибки printf("%s\n", strerror(errno)) в месте возврата функции write;
И прочитайте уже что нибудь о том как устроены pipe. Смотреть на подобный код чудно.
11K
08 марта 2008 года
zuze
84 / / 07.03.2008
Прошу прощения, что я ввёл в заблуждение у меня надо было добавить данные больше размера буфера 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("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;
}
Реклама на сайте | Обмен ссылками | Ссылки | Экспорт (RSS) | Контакты
Добавить статью | Добавить исходник | Добавить хостинг-провайдера | Добавить сайт в каталог