Форум программистов, компьютерный форум, киберфорум
C/С++ под Linux
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.64/11: Рейтинг темы: голосов - 11, средняя оценка - 4.64
 Аватар для algoritm256
9 / 9 / 5
Регистрация: 05.02.2012
Сообщений: 147
Записей в блоге: 1

Как писать в pipe

09.11.2012, 13:07. Показов 2142. Ответов 5
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Проблема такая: есть программа ридар(rd.c) и райтер(wr.c). Райтер должен писать в именованный pipe pp, а ридар в это время должен из него считывать, но при записи файла вылетает ошибка. Подскажите пожалуйста в чем дело.

rd.c
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
#include <fcntl.h>
#include <string.h>
#include <sys/mman.h>
#include <sys/types.h>
#include <sys/stat.h>
 
int read_len()
{
  FILE *in;
  int ln;
  in=fopen("len.txt","r");
  while(!feof(in))
  {
    fgetc(in);
  }
  fclose(in);
  return ln;
}
 
int read_set()
{
  FILE *in;
  int set;
  in=fopen("offset.txt", "r");
  while(!feof(in))
  {
    fgetc(in);
  }
  fclose(in);
  return set;
}
int main(int argc, char **argv)
{
  //char *addr;
  char *mapREF;
 
/*if(argc<2)
{
  printf("%s filename: \n", argv[0]);
  exit(-1);
}*/
  
 int fd= open(argv[1],O_RDWR|O_CREAT,0777);
 
if(fd<0)
{
  perror("open");
  exit(-1);
}
 
  mapREF=mmap(NULL,20, PROT_READ | PROT_WRITE, MAP_SHARED, fd, 0); 
  if(mapREF==NULL)
  {
    perror("mmap");
    return(-1);
  }
 
 //printf("%s\n",mapREF);
    int i = 0;
    char str[80]; 
    char str2[80];
    while(1)
    {
    read(fd,str,1);
    printf("%s \n",mapREF);
    sleep(1);
    }
  
  close(fd);
 
 return 0;
}
wr.c
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
#include <fcntl.h>
#include <string.h>
#include <sys/mman.h>
#include <sys/types.h>
#include <sys/stat.h>
 
void write_len(int len)
{
  FILE *in;
  in=fopen("len.txt","w+");
  while(!feof(in))
  {
    fputc(len,in);
  }
  fclose(in);
}
 
void write_of_set(int o_f)
{
  FILE *in;
  int set;
  in=fopen("offset.txt", "w+");
  while(!feof(in))
  {
    fputc(set, in);
  }
  fclose(in);
}
 
 
int main(int argc, char **argv)
{
  //char *addr;
 int fd;
 int len;
  char *mapREF;
 
/*if(argc<2)
{
  printf("%s filename: \n", argv[0]);
  exit(-1);
}*/
  
 fd= open(argv[1],O_RDWR|O_CREAT,0777);
if(fd<0)
{
  perror("open");
  exit(-1);
}
 
  mapREF=mmap(NULL,20, PROT_READ | PROT_WRITE, MAP_SHARED, fd, 0); 
  if(mapREF==NULL)
  {
    perror("mmap");
    exit(-1);
  }
 
  int i=0;
  char *str;
 memcpy(mapREF, "hello", 6);
 while (1)
    {
    gets(str);
    if(memcpy(mapREF+i, str,strlen(str))<0)
    {
        perror("strcpy");
            exit(-1);
    }
    i=strlen(str)+1;
        write_len(i);
        
    write(fd, str, strlen(str));
        sleep(4);
    }
  
  close(fd);
  printf("%d",i);
 return 0;
}
0
cpp_developer
Эксперт
20123 / 5690 / 1417
Регистрация: 09.04.2010
Сообщений: 22,546
Блог
09.11.2012, 13:07
Ответы с готовыми решениями:

Как писать на c++ в linux
Здравствуйте, у меня возникла проблема, у меня стоит linux ubuntu 10.10, я скачал компилятор g++, создаю файл 1.cpp ввожу команду g++ 1.cpp...

Pipe и exec
Задание: модифицировать программу для связи между собой двух родственных процессов, исполняющих разные программы. Код программы: ...

Pipe конвеер
Организовать программно pr1|pr2|pr3&gt;f1 pr4: Код: #include &lt;stdio.h&gt; #include &lt;sys/types.h&gt; #include &lt;sys/wait.h&gt; ...

5
1259 / 650 / 44
Регистрация: 06.02.2011
Сообщений: 1,654
09.11.2012, 14:01
а кто тут fifo? Можно было бы предположить, что это argv[1], но O_RDWR|O_CREAT ...
Да и вообще код - шедевр.
0
 Аватар для algoritm256
9 / 9 / 5
Регистрация: 05.02.2012
Сообщений: 147
Записей в блоге: 1
09.11.2012, 17:56  [ТС]
argv[1]- это тот pipe
0
1259 / 650 / 44
Регистрация: 06.02.2011
Сообщений: 1,654
09.11.2012, 18:31
Цитата Сообщение от algoritm256 Посмотреть сообщение
argv[1]- это тот pipe
Да?
А как тогда O_CREAT прикажете понимать?
А mmap() на пайп не смущает? (кстати при ошибке там не NULL).
0
 Аватар для algoritm256
9 / 9 / 5
Регистрация: 05.02.2012
Сообщений: 147
Записей в блоге: 1
09.11.2012, 18:44  [ТС]
На вы покажите как правильно, я в этом еще новичек
0
1259 / 650 / 44
Регистрация: 06.02.2011
Сообщений: 1,654
09.11.2012, 19:07
Показать что?
Если из обеих программ выкинуть _все_ кроме собственно open+read/write оно заработает (не важно пайп там будет или обычный файл). А пытаться понять кто и зачем научил Вас mmap'ить пайпы, ловить ошибки memcpy(), в чем тайный смысл Ваших ф-ций write_* и т.д. и т.п я не хочу.
1
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
raxper
Эксперт
30234 / 6612 / 1498
Регистрация: 28.12.2010
Сообщений: 21,154
Блог
09.11.2012, 19:07
Помогаю со студенческими работами здесь

ls через pipe
Здравствуйте. Помогите поправить программку из книжки, не могу понять в чём ошибка... #include &lt;stdio.h&gt; main (argc, argv) int...

Read in Pipe
Здравствуйте, пишу программу с pipe(). Возникла такая проблема, что в функции receive() возникает зависание. Прошу помочь исправить ошибку....

Как можно писать на Си в Visual Studio
Здравствуйте, как можно писать на Си в Visual Studio? Плагина как такового нет. P.S:Знаю что есть другие среды разработки, но нужна именно...

Определение размера pipe
Здравствуйте! Помогите пожалуйста, нужен программа для определения размера pipe для операционной системы. Я продумал логику...

Организация канала PIPE
помогите с таким заданием....есть 4 программы на си. Первый файл печатает сообщение, второй читает и третий тоже читает....нужно написать...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
6
Ответ Создать тему
Новые блоги и статьи
Настройки VS Code
Loafer 13.04.2026
{ "cmake. configureOnOpen": false, "diffEditor. ignoreTrimWhitespace": true, "editor. guides. bracketPairs": "active", "extensions. ignoreRecommendations": true, . . .
Оптимизация кода на разграничение прав доступа к элементам формы
Maks 13.04.2026
Алгоритм из решения ниже реализован на нетиповом документе, разработанного в конфигурации КА2. Задачи, как таковой, поставлено не было, проделанное ниже исключительно моя инициатива. Было так:. . .
Контроль заполнения и очистка дат в зависимости от значения перечислений
Maks 12.04.2026
Алгоритм из решения ниже реализован на примере нетипового документа "ПланированиеПерсонала", разработанного в конфигурации КА2. Задача: реализовать контроль корректности заполнения дат назначения. . .
Архитектура слоя интернета для сервера-слоя.
Hrethgir 11.04.2026
В продолжение https:/ / www. cyberforum. ru/ blogs/ 223907/ 10860. html Знаешь что я подумал? Раз мы все источники пишем в голове ветки, то ничего не мешает добавить в голову такой источник, который сам. . .
Подстановка значения реквизита справочника в табличную часть документа
Maks 10.04.2026
Алгоритм из решения ниже реализован на примере нетипового документа "ПланированиеПерсонала", разработанного в конфигурации КА2. Задача: при выборе сотрудника (справочник Сотрудники) в ТЧ документа. . .
Очистка реквизитов документа при копировании
Maks 09.04.2026
Алгоритм из решения ниже применим как для типовых, так и для нетиповых документов на самых различных конфигурациях. Задача: при копировании документа очищать определенные реквизиты и табличную. . .
модель ЗдравоСохранения 8. Подготовка к разному выполнению заданий
anaschu 08.04.2026
https:/ / github. com/ shumilovas/ med2. git main ветка * содержимое блока дэлэй из старой модели теперь внутри зайца новой модели 8ATzM_2aurI
Блокировка документа от изменений, если он открыт у другого пользователя
Maks 08.04.2026
Алгоритм из решения ниже реализован на примере нетипового документа, разработанного в конфигурации КА2. Задача: запретить редактирование документа, если он открыт у другого пользователя. / / . . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru