C и именованные каналы. Можно ли выполнить одну программу из другой, чтобы записать в канал?
Я работаю над заданием, в котором две программы должны отправлять сообщения родительской программе, используя именованный канал. На данный момент у меня есть работающая программа "писатель" и работающий "читатель". Выполнение каждой программы в отдельных терминалах (начиная с родительской программы в первую очередь) работает должным образом. Теперь у меня вопрос: возможно ли, чтобы родительская программа выполнила программу-писатель, которая затем записывает в канал и завершает работу, а затем родитель читает из канала и выполняет цикл, повторяя процесс. Вот конкретные программы, на которые я ссылаюсь.
Родитель называется "мост":
// File bridge.c
#include <stdio.h>
#include <stdlib.h>
#include <sys/stat.h>
#include <unistd.h>
#include <string.h>
#include <linux/stat.h>
#include <time.h>
#include <sys/types.h>
#include <fcntl.h>
int main(){
char *sharedPipe = "MYFIFO";
int pipe;
char readBuffer[80];
umask(0);
pipe = mkfifo(sharedPipe, 0666);
if(pipe < 0){
perror("mkfifo");
exit(2);
}
time_t entryTime, currentTime;
while(1){
entryTime = time(NULL);
pipe = open(sharedPipe, O_RDONLY); // removed nonblock
pipe = read(pipe, readBuffer, 80);
currentTime = time(NULL);
printf("%s", ctime(¤tTime));
printf("Bridge received message: %s\n\n", readBuffer);
sleep( 30 - (currentTime - entryTime) );
}
}
И это ребенок ("lifeSupport"):
// File lifeSupport.c
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <unistd.h>
#include <sys/stat.h>
#include "randapi.h"
#include <sys/types.h>
#include <fcntl.h>
int main(){
int pipe;
char *sharedPipe = "MYFIFO";
int lifeTime = (int)(getRandExponential() * 5.0);
sleep(lifeTime); // simulate adjustment of life support
int envTime = (int)(getRandExponential() * 4.0);
sleep(envTime); // simulate adjustment of environment
char buffer[80];
snprintf(buffer, sizeof(buffer), "Breathing gas levels adjusted (%d sec.). Environment adjusted (%d sec.).", lifeTime, envTime);
pipe = open(sharedPipe, O_WRONLY);
if(pipe < 0){
perror("open");
exit(2);
}
pipe = write(pipe, buffer, strlen(buffer) + 1);
close(pipe);
}
Чтобы повторить, в идеале я хочу выполнить только родитель ("мост"), а затем выполняет дочерний ("lifeSupport"), который пишет в канал и завершает работу, так что родитель может затем прочитать из канала и отобразить результат, Пожалуйста, дайте мне знать, если я могу что-нибудь прояснить. Я ценю любую помощь!