У меня задача такая - В канале связи есть место.
Попытка записать в канал связи больше байт, чем осталось до его заполнения, и больше, чем размер буфера канала связи. Блокировка вызова запрещена.
Проблема такая вместо того чтобы выводить количество введённое в 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 (pipe на gcc)
Модератор: Модераторы разделов
-
- Сообщения: 27
- ОС: Red Hat
Re: Ввод данных в PIPE
Прошу прощения, что я ввёл в заблуждение у меня надо было добавить данные больше размера буфера 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;
}
Вот код решения
#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;
}