Как отправить непрерывный поток данных от одного процесса другому через EXECL
Я пишу программу на C, которая постоянно генерирует два строковых значения с именем stateName
а также timer
(со скоростью пять раз в секунду). Мне нужно объединить и передать их другому процессу под названием ProcessNo3_TEST
который отвечает за токенизацию, а также их отображение.
Проблема в том, что я не знаю, как передавать их постоянно через execl
, У меня было несколько попыток, но ни одна из них не увенчалась успехом. Вот мой код, который отлично работает для одной пары значений (например, UP2
а также 98
):
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#define READ 0
#define WRITE 1
int FIFO[2];
char fileDescriptor[10];
char* stringMaker( char *s1,char *s2 );
int main()
{
char lengthInChar[15],msg[200];
int msgLength,i;
char *stateName, *timer;
if (pipe(FIFO) == -1)
{
printf("cannot create pipe\n");
exit(1);
}
sprintf(fileDescriptor, "%d", FIFO[READ]);
stateName = "UP2"; // for instance
timer = "98"; // for instance
msgLength = strlen(stateName) + strlen(timer) +3;
strcpy(msg, stringMaker(stateName, timer) );
write(FIFO[WRITE], msg, msgLength);
switch (fork())
{
case 0:
sprintf(lengthInChar, "%d", msgLength);
execl("ProcessNo3_TEST", "ProcessNo3_TEST", lengthInChar, fileDescriptor, NULL);
exit(1);
case -1:
perror("fork() failed-->");
exit(2);
default:
break;
}
sleep(10);
exit(0);
}
char* stringMaker( char *s1,char *s2 )
{
char *s3;
strcpy(s3,s1);
strcat(s3,"-");
strcat(s3,s2);
strcat(s3,"-");
strcat(s3,"\0");
return s3;
}
Может ли кто-нибудь помочь в этом, пожалуйста?
(Я, кстати, запускаю CygWin на Windows)
----------ОБНОВИТЬ-------------
Как указано в комментариях ниже, я нашел хороший пример fdopen()
который решил мою проблему. ( Ссылка)
2 ответа
Хотя можно организовать передачу номера дескриптора файла одного конца канала (в виде строки) в качестве аргумента программы, обычно вместо этого можно перенаправить стандартные потоки дочернего процесса для чтения (в данном случае) или записи в канал. Обычно это достигается с помощью dup2()
, который вы бы применили в дочернем процессе, после разветвления, но до execl()
,
Затем родительский и дочерний процессы обмениваются данными по каналу. В этом случае родитель пишет в конец записи, а ребенок читает в конце чтения. Любой из них или оба могут обернуть свой файловый дескриптор в поток, передав его fdopen()
, Тогда вы можете использовать функции stdio с ним. Также обратите внимание, что после разветвления каждый процесс должен закрыть FD для конца трубы, которое он не намеревается использовать.
Если задано использование execl() (часто люди предпочитают этого не делать, но иногда это имеет свои преимущества), чем использовать анонимные каналы вместо анонимных. Анонимный конец канала теряется после execl (). Но если у вас есть именованный канал, вы можете передать его имя в качестве аргумента execl (), открыть его в дочернем процессе и использовать там.