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

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

24.08.2015, 10:37. Показов 1526. Ответов 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
Ответ Создать тему
Новые блоги и статьи
Первый деплой
lagorue 16.01.2026
Не спеша развернул своё 1ое приложение в kubernetes. А дальше мне интересно создать 1фронтэнд приложения и 2 бэкэнд приложения развернуть 2 деплоя в кубере получится 2 сервиса и что-бы они. . .
Расчёт переходных процессов в цепи постоянного тока
igorrr37 16.01.2026
/ * Дана цепь постоянного тока с R, L, C, k(ключ), U, E, J. Программа составляет систему уравнений по 1 и 2 законам Кирхгофа, решает её и находит токи на L и напряжения на C в установ. режимах до и. . .
Восстановить юзерскрипты Greasemonkey из бэкапа браузера
damix 15.01.2026
Если восстановить из бэкапа профиль Firefox после переустановки винды, то список юзерскриптов в Greasemonkey будет пустым. Но восстановить их можно так. Для этого понадобится консольная утилита. . .
Изучаю kubernetes
lagorue 13.01.2026
А пригодятся-ли мне знания kubernetes в России?
Сукцессия микоризы: основная теория в виде двух уравнений.
anaschu 11.01.2026
https:/ / rutube. ru/ video/ 7a537f578d808e67a3c6fd818a44a5c4/
WordPad для Windows 11
Jel 10.01.2026
WordPad для Windows 11 — это приложение, которое восстанавливает классический текстовый редактор WordPad в операционной системе Windows 11. После того как Microsoft исключила WordPad из. . .
Classic Notepad for Windows 11
Jel 10.01.2026
Old Classic Notepad for Windows 11 Приложение для Windows 11, позволяющее пользователям вернуть классическую версию текстового редактора «Блокнот» из Windows 10. Программа предоставляет более. . .
Почему дизайн решает?
Neotwalker 09.01.2026
В современном мире, где конкуренция за внимание потребителя достигла пика, дизайн становится мощным инструментом для успеха бренда. Это не просто красивый внешний вид продукта или сайта — это. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru