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

Обмен данными между процессами в линуксе через pipe

06.01.2015, 21:19. Показов 2476. Ответов 0
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
После закомменчивания части кода записывающей в 1 файл из 2 других программы, она перестала работать. Точнее, зависает, если закомментить //close(fildes[1]);/* закрытие файлов канала*/ в основном процессе. Почему так? И другие части кода, закоменченные мной, а именно передача дескриптора чтения в потомок и его закрытие, как-то влияют на работу программы?
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
#include <fcntl.h>
#include <stdio.h>
#include <string.h>
#include <unistd.h>
#include <stdlib.h>
// cd /home/administrator/lab_linux/lab6
// ./lab6 out.txt in1.txt in2.txt
char* str(int file_in);             //чтение строки
void child(char* filename, int fildes);//, int closedes);
 
int main(int argc, char** args) 
{
    if(argc != 4) 
    {
        printf("Формат: <Выходой файл> <Входной файл> <Входной файл>\n");
        exit(1);
    }
    int file_out = open(args[1], O_CREAT | O_RDWR | O_APPEND, S_IRUSR | S_IWUSR);/* открытие текстового файла */
    int fildes[2]; //дескрипторы файлов канала: fildes[0] - для  чтения из канала и fildes[1] - для записи в канал
    char ch;
    pipe(fildes); //открытие канала
    if(fork() == 0) /*порождение потомков и вызов их программ */
    {
        if(fork() == 0) 
            child(args[2], fildes[1]);//, fildes[0]);
        else 
            child(args[3], fildes[1]);//, fildes[0]);
    } 
    else 
    { 
        //close(fildes[1]);/* закрытие файлов канала*/
        while(read(fildes[0], &ch, 1) != 0)  //чтение из канала
            write(file_out, &ch, 1);         //запись в выходной файл
        close(file_out);
        close(fildes[0]);/* закрытие файлов канала*/
    }
    return 0;
}
 
char* str(int file_in)  
{
    char ch;
    char* string = (char*)malloc(sizeof(char));
    string[0] = '\0';
    while(read(file_in, &ch, 1) != 0)
     {
        char* temp = (char*)malloc(strlen(string) + 2);
        if(ch == 10)
            break;
        else 
        {
            strcpy(temp, string);
            temp[strlen(string)] = ch;
            temp[strlen(string) + 1] = '\0';
            string = temp;
        }
    }
    if(string[0] == '\0') 
        return NULL;
    else    
        return string;
}
 
void child(char* filename, int fildes)//, int closedes) 
{
    //close(closedes);
    int file_in = open(filename, O_CREAT | O_RDWR | O_APPEND, S_IRUSR | S_IWUSR);
    char* line;
    char enl = 10;
    while((line = str(file_in)) != NULL) //записываем строку в канал
    {
        write(fildes, line, strlen(line)); 
        write(fildes, &enl, 1);
    }
    close(file_in); //закрываем входной файл
    close(fildes);
}
0
IT_Exp
Эксперт
34794 / 4073 / 2104
Регистрация: 17.06.2006
Сообщений: 32,602
Блог
06.01.2015, 21:19
Ответы с готовыми решениями:

Обмен данными между процессами, сокеты
чувствую я пока вообще не врубаюсь помогите разобраться как передать данные другому процессу через сокеты #include &lt;stdio.h&gt; ...

Обмен данными между процессами
При создании дочернего процесса при помощи функции BOOL CreateProcess ( LPCTSTR lpApplicationName, // имя...

Обмен данными между процессами
Здравствуйте. Нужно создать три процесса.(fork()). У меня есть два варианта исхода событий: 1. - Родитель (р0) создает потомка(р1),...

0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
BasicMan
Эксперт
29316 / 5623 / 2384
Регистрация: 17.02.2009
Сообщений: 30,364
Блог
06.01.2015, 21:19
Помогаю со студенческими работами здесь

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

Обмен данными между процессами
Уважаемое сообщество, помогите, пожалуйста, мне разобраться с проблемкой. Мое приложение в каждом такте считывает данные по ethernet:...

Обмен данными между процессами
хотелось бы узнать в какую сторону копать сей вопрос (Обмен данными между процессами) надо чтобы одна программа передала другой,...

Обмен данными между процессами
Добрый день! Нужно распараллелить программу. Суть в следующем: должны быть два процесса(разные функции), идущих параллельно, и второй...

Обмен данными между процессами
Здравствуйте! Задача такая: есть скрипт на php который постоянно в памяти и при каждом запросе запускается скрипт пользователя. как...


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

Или воспользуйтесь поиском по форуму:
1
Ответ Создать тему
Новые блоги и статьи
PhpStorm 2025.3: WSL Terminal всегда стартует в ~
and_y87 14.12.2025
PhpStorm 2025. 3: WSL Terminal всегда стартует в ~ (home), игнорируя директорию проекта Симптом: После обновления до PhpStorm 2025. 3 встроенный терминал WSL открывается в домашней директории. . .
Access
VikBal 11.12.2025
Помогите пожалуйста !! Как объединить 2 одинаковые БД Access с разными данными.
Новый ноутбук
volvo 07.12.2025
Всем привет. По скидке в "черную пятницу" взял себе новый ноутбук Lenovo ThinkBook 16 G7 на Амазоне: Ryzen 5 7533HS 64 Gb DDR5 1Tb NVMe 16" Full HD Display Win11 Pro
Музыка, написанная Искусственным Интеллектом
volvo 04.12.2025
Всем привет. Некоторое время назад меня заинтересовало, что уже умеет ИИ в плане написания музыки для песен, и, собственно, исполнения этих самых песен. Стихов у нас много, уже вышли 4 книги, еще 3. . .
От async/await к виртуальным потокам в Python
IndentationError 23.11.2025
Армин Ронахер поставил под сомнение async/ await. Создатель Flask заявляет: цветные функции - провал, виртуальные потоки - решение. Не threading-динозавры, а новое поколение лёгких потоков. Откат?. . .
Поиск "дружественных имён" СОМ портов
Argus19 22.11.2025
Поиск "дружественных имён" СОМ портов На странице: https:/ / norseev. ru/ 2018/ 01/ 04/ comportlist_windows/ нашёл схожую тему. Там приведён код на С++, который показывает только имена СОМ портов, типа,. . .
Сколько Государство потратило денег на меня, обеспечивая инсулином.
Programma_Boinc 20.11.2025
Сколько Государство потратило денег на меня, обеспечивая инсулином. Вот решила сделать интересный приблизительный подсчет, сколько государство потратило на меня денег на покупку инсулинов. . . .
Ломающие изменения в C#.NStar Alpha
Etyuhibosecyu 20.11.2025
Уже можно не только тестировать, но и пользоваться C#. NStar - писать оконные приложения, содержащие надписи, кнопки, текстовые поля и даже изображения, например, моя игра "Три в ряд" написана на этом. . .
Мысли в слух
kumehtar 18.11.2025
Кстати, совсем недавно имел разговор на тему медитаций с людьми. И обнаружил, что они вообще не понимают что такое медитация и зачем она нужна. Самые базовые вещи. Для них это - когда просто люди. . .
Создание Single Page Application на фреймах
krapotkin 16.11.2025
Статья исключительно для начинающих. Подходы оригинальностью не блещут. В век Веб все очень привыкли к дизайну Single-Page-Application . Быстренько разберем подход "на фреймах". Мы делаем одну. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2025, CyberForum.ru