Форум программистов, компьютерный форум, киберфорум
C/С++ под Linux
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.71/7: Рейтинг темы: голосов - 7, средняя оценка - 4.71
0 / 0 / 0
Регистрация: 29.06.2013
Сообщений: 63

Используя popen сделать, чтобы один процесс отправлял текст, второй принимал и выводил

24.08.2015, 10:37. Показов 1566. Ответов 5
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
В общем задача такая, используя popen сделать, чтобы один процесс отправлял текст, второй принимал и выводил.
В итоге, read возвращает только последний символ, помогите разобраться что к чему

main.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
#include <stdio.h>
 
#define MSGSIZE 10
 
int main(int argc, char** argv)
{
    extern FILE* popen();
    extern int pclose();
 
    FILE* in;
    FILE* out;
    static char msg[MSGSIZE];
 
    if(!(in = popen("./writer", "r")))
    {
        perror("popen()");
        return 1;
    }
    if(!(out = popen("./reader", "w")))
    {
        perror("popen()");
        pclose(in);
        return 1;
    }
 
    while (fgets(msg, MSGSIZE, in) != NULL);
    fputs(msg, out);
 
    pclose(in);
    pclose(out);
 
    return 0;
}
reader.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
#include <stdio.h>
#include <stdlib.h>
#include <sys/types.h>
#include <sys/time.h>
#include <sys/stat.h>
#include <fcntl.h>
#include <unistd.h>
#include <ctype.h>
 
#define MSGSIZE 10
 
int main(int argc, char** argv)
{
    static char out[MSGSIZE];
 
    fd_set fd;
    FD_ZERO(&fd);
    FD_SET(0, &fd);
 
    int retval = select(1, &fd, NULL, NULL, NULL);
 
    if (retval == -1)
    {
        perror("select()");
        return 1;
    }
    else
    {
        read(0, out, MSGSIZE);
    }
 
    for (int i = 0; i < MSGSIZE; ++i)
        printf("%c", toupper(out[i]));
    printf("\n");
 
    return 0;
}
writer.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
#include <stdio.h>
#include <stdlib.h>
#include <sys/types.h>
#include <sys/time.h>
#include <sys/stat.h>
#include <fcntl.h>
#include <unistd.h>
 
#define MSGSIZE 10
 
int main(int argc, char** argv)
{
    static char in[MSGSIZE] = "sfsfghjkge";
 
    fd_set fd;
    FD_ZERO(&fd);
    FD_SET(1, &fd);
 
    int retval = select(2, NULL, &fd, NULL, NULL);
 
    if (retval == -1)
    {
        perror("select()");
        return 1;
    }
    else
    {
        write(1, in, MSGSIZE);
    }
 
    return 0;
}
0
Лучшие ответы (1)
IT_Exp
Эксперт
34794 / 4073 / 2104
Регистрация: 17.06.2006
Сообщений: 32,602
Блог
24.08.2015, 10:37
Ответы с готовыми решениями:

Как сделать чтобы цикл while выполнялся один раз и выводил примерно такой текст из формы?
как сделать чтобы цикл while выполнялся один раз и выводил примерно такой текст из формы тест: 1111 тест: 2222 тест: 3333 тест:...

как сделать в программе, чтобы на печать выводил один результат а не все окошко интерфейса?
как сделать в программе, чтобы на печать выводил один результат а не все окошко интерфейса? какие параметры нужно писать вместо...

Можно ли сделать так, чтобы Winamp выводил музыку на колонки, а PotPlayer выводил звук из фильма на наушники?
привет у меня мать Elitegroup со встроенным звуковым движком &quot;RealtekHD&quot; - на матери присутствует 6 различных гнёзд. Я хотел спросить у...

5
Модератор
Эксперт PythonЭксперт JavaЭксперт CЭксперт С++
 Аватар для easybudda
12843 / 7592 / 1766
Регистрация: 25.07.2009
Сообщений: 13,973
24.08.2015, 14:47
Похожий пример завалялся
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
/* ANSI C 99 */
 
#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
#include <sys/types.h>
#include <sys/wait.h>
#include <string.h>
 
#define FD_IN 0
#define FD_OUT 1
 
int main(void) {
    int fds[2];
    
    if ( pipe(fds) ) {
        perror("pipe");
        exit(1);
    }
    
    switch( fork() ) {
        case -1:
            close(fds[FD_IN]);
            close(fds[FD_OUT]);
            perror("fork");
            exit(1);
        case 0: {
            close(fds[FD_IN]);
            const char * words[] = { "any", "many", "money", "more", NULL };
            for ( int i = 0; words[i]; ++i ) {
                if ( write(fds[FD_OUT], words[i], strlen(words[i]) + 1) < 0 ) {
                    close(fds[FD_OUT]);
                    perror("write");
                    _exit(1);
                }
            }
            close(fds[FD_OUT]);
            _exit(0);
        }
        default : {
            close(fds[FD_OUT]);
            char buf[BUFSIZ];
            while ( read(fds[FD_IN], buf, BUFSIZ) > 0 )
                printf("%s\n", buf);
            close(fds[FD_IN]);
            int ret;
            wait(&ret);
            if ( ret ) {
                fprintf(stderr, "EPIC FAIL!\n");
                exit(1);
            }
            else {
                fprintf(stderr, "Communication succesfully closed.\n");
                exit(0);
            }
        }
    }
}
Code
1
2
3
4
5
6
7
8
andrew@debppc:~/workspace/c/system$ gcc -std=c99 child_talk.c 
andrew@debppc:~/workspace/c/system$ ./a.out 
any
many
money
more
Communication succesfully closed.
andrew@debppc:~/workspace/c/system$
0
0 / 0 / 0
Регистрация: 29.06.2013
Сообщений: 63
24.08.2015, 15:39  [ТС]
Через pipe я делал, надо именно тоже самое, что с pipe, но через popen
0
923 / 639 / 198
Регистрация: 08.09.2013
Сообщений: 1,693
24.08.2015, 17:06
Лучший ответ Сообщение было отмечено Памирыч как решение

Решение

Цитата Сообщение от karl 777 Посмотреть сообщение
используя popen сделать, чтобы один процесс отправлял текст, второй принимал и выводил.
Упростил, чтобы не углубляться.
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
#include <stdio.h>
 
int main(int argc, char** argv)
{
    static char msg[10];
    FILE *in = popen("./writer 'Что это за строка?\nЭто_длинная_строка!!!!!'", "r");
    if(!in) {
        perror("popen() raed");
        return 1;
    }
    FILE *out = popen("./reader", "w");
    if(!out) {
        perror("popen() writw");
        pclose(in);
        return 1;
    }
    while (fgets(msg, 10, in) != NULL) fputs(msg, out);
 
    pclose(in);  pclose(out);
}
// reader.c 
#include <stdio.h>
int main() {
  char s[10];
  while (fgets (s, 10, stdin)) printf (s);
}
// writer.c 
#include <stdio.h>
int main (int ac, char *av[]) {
  for (int i= 1; i < ac; i++) puts (av[i]);
}
1
0 / 0 / 0
Регистрация: 29.06.2013
Сообщений: 63
25.08.2015, 12:35  [ТС]
Цитата Сообщение от gng Посмотреть сообщение
#include <stdio.h>
int main() {
* char s[10];
* while (fgets (s, 10, stdin)) printf (s);
}
Почему после while в s остается только последний символ? То есть если сделать:
C
1
2
while(fgets(s, 10, stdin));
printf(s);
Выведется только последний символ строки?
0
923 / 639 / 198
Регистрация: 08.09.2013
Сообщений: 1,693
25.08.2015, 13:11
Цитата Сообщение от karl 777 Посмотреть сообщение
Почему после while в s остается только последний символ? То есть если сделать:
while(fgets(s, 10, stdin));
printf(s);
Потому что в теле цикла один пустой оператор ";"
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
BasicMan
Эксперт
29316 / 5623 / 2384
Регистрация: 17.02.2009
Сообщений: 30,364
Блог
25.08.2015, 13:11
Помогаю со студенческими работами здесь

Как сделать чтобы при добавлении бота в беседу ВК, он отправлял сообщение?
Создаю бота для бесед ВКонтакте Нужно чтобы при добавлении бота в беседу, он отсылал характерное сообщение (Всем привет!) Еще чтобы в...

Как сделать, чтобы один border перекрывал второй
Подскажите решение: #header .logo { float: left; border-top: 10px solid #000; height: 100px; border-left: 10px solid #f3d0bf; ...

Работа с TextBox C#: при заполнении первого текст бокса - второй выводил результат
Привет форумчане. Такая задача: есть 2 текст бокса, необходимо, после заполнения первого - увидеть результат во 2-ом, при этом выводить 15%...

Как сделать, чтобы один поток не закончил работу, пока второй работает?
Подскажите, есть например 2 потока, которые ну например отсчитывают в цикле до 100. Как сделать чтоб один не закончил работу пока второй...

Как сделать чтобы значения принимал в градусах а не радианах?
Чтобы считал cos20 градусов ,а не радиан.


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

Или воспользуйтесь поиском по форуму:
6
Ответ Создать тему
Новые блоги и статьи
Оттенки серого
Argus19 18.03.2026
Оттенки серого Нашёл в интернете 3 прекрасных модуля: Модуль класса открытия диалога открытия/ сохранения файла на Win32 API; Модуль класса быстрого перекодирования цветного изображения в оттенки. . .
SDL3 для Desktop (MinGW): Рисуем цветные прямоугольники с помощью рисовальщика SDL3 на Си и C++
8Observer8 17.03.2026
Содержание блога Финальные проекты на Си и на C++: finish-rectangles-sdl3-c. zip finish-rectangles-sdl3-cpp. zip
Символические и жёсткие ссылки в Linux.
algri14 15.03.2026
Существует два типа ссылок — символические и жёсткие. Ссылка в Linux — это запись в каталоге, которая может указывать либо на inode «файла-ИСТОЧНИКА», тогда это будет «жёсткая ссылка» (hard link),. . .
[Owen Logic] Поддержание уровня воды в резервуаре количеством включённых насосов: моделирование и выбор регулятора
ФедосеевПавел 14.03.2026
Поддержание уровня воды в резервуаре количеством включённых насосов: моделирование и выбор регулятора ВВЕДЕНИЕ Выполняя задание на управление насосной группой заполнения резервуара,. . .
делаю науч статью по влиянию грибов на сукцессию
anaschu 13.03.2026
прикрепляю статью
SDL3 для Desktop (MinGW): Создаём пустое окно с нуля для 2D-графики на SDL3, Си и C++
8Observer8 10.03.2026
Содержание блога Финальные проекты на Си и на C++: hello-sdl3-c. zip hello-sdl3-cpp. zip Результат:
Установка CMake и MinGW 13.1 для сборки С и C++ приложений из консоли и из Qt Creator в EXE
8Observer8 10.03.2026
Содержание блога MinGW - это коллекция инструментов для сборки приложений в EXE. CMake - это система сборки приложений. Здесь описаны базовые шаги для старта программирования с помощью CMake и. . .
Как дизайн сайта влияет на конверсию: 7 решений, которые реально повышают заявки
Neotwalker 08.03.2026
Многие до сих пор воспринимают дизайн сайта как “красивую оболочку”. На практике всё иначе: дизайн напрямую влияет на то, оставит человек заявку или уйдёт через несколько секунд. Даже если у вас. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru