2016-10-10 3 views
0

Мне было интересно, если есть так или иначе запустить две программы, используя именованный канал i.e. fifo, выполнив только одну программу. Например, решение, упомянутое здесь [Отправка строк между двумя трубами] [1], может быть запущено с использованием только одного терминала? Есть ли все равно, чтобы вызвать writer.c из reader.c и запустить всю программу, просто запустив reader.cЗапуск трубки fifo с одного терминала

EDIT: я удалил свой код, потому что у него было много проблем. Я использовал много функций, не зная о них.

ЗАКРЫТ.

+2

Одна программа или один процесс? Вы можете использовать одну программу, которая использует 'fork()' для разделения на процесс записи и чтения. – Barmar

+0

Ваше название говорит о одном терминале? Вы знаете, что вы можете запускать несколько программ с одного терминала, не так ли? Запустите первую программу в фоновом режиме, затем запустите вторую. – Barmar

+0

Как я могу запустить одну программу в фоновом режиме? Из приведенного выше примера, как я могу запустить writer.c, просто набрав ./reader.c в одном терминале –

ответ

1

Используйте функцию POPEN(), чтобы запустить writer.py внутри вашей программы чтения:

https://linux.die.net/man/3/popen

POPEN функция возвращает FILE *, которые затем можно использовать с любым C буферной функцию ввода/вывода , Например:

#include <stdio.h> 
#include <errno.h> 

int main(int argc, char **argv) { 

    FILE *fp; 
    if((fp = popen("/path/to/writer.py", "r")) == NULL) { 
     // handle error in some way 
     perror("popen"); 
     exit(1); 
    } 

    size_t numbytes; 
    char buffer[255]; 

    // Here we read the output from the writer.py and rewrite it to 
    // stdout. The result should look the same as if you ran writer.py 
    // by itself.. not very useful. But you would replace this with code 
    // that does something useful with the data from writer.py 

    while((numbytes = fread(buffer, 1, sizeof(buffer), fp)) > 0) { 
     fwrite(buffer, 1, numbytes, stdout); 
     // should check for error here 
    } 

    pclose(fp); 
    exit(0); 
} 

PS: Я не скомпилировать или запустить эту программу, это просто пример, чтобы дать вам идею ... Но она должна работать. Также .. Я замечаю, что вы говорите writer.c в одном месте и writer.py в другом. Неважно, что написано на языке писателя. Пока имя пути программы, которое вы переходите к popen(), выводит вывод на stdout, он будет работать.

+0

Спасибо за ответ. Я редактировал свой пост. Пожалуйста, дайте мне знать, как я могу использовать ваше решение для всплывающих окон в моем коде –

+0

Я не понимаю, где вы пытаетесь выполнить свою программу записи в коде, который вы отправили? Вам не нужен филоген, просто обычная труба, которую даст вам popen() на самом деле вызывает системные вызовы (функции) pipe() и fork(), а также fdopen(), чтобы выполнить всю работу .. так что вы не используйте все, что вам нужно. Используйте popen(), как я показал вам.) –

+0

Я должен использовать fifo. Есть ли вообще использовать трубу fifo и запустить writer.py с C? –

Смежные вопросы