я преподавал в университете, к простейшим способом обработки процессов в фоновом режиме, чтобы повесить ход на детей/родителей Мультипроцессный процессов с трубой read()
функции. Честно говоря, я уже 2 недели работаю над своей домашней работой, и я не могу решить асинхронную обработку процесса. Я минимизировал свой код, чтобы написать одну дочернюю обработку с двумя трубами и заблокировать родительский и дочерний процессы с помощью функции read()
. Вы можете найти текущее состояние моего кода ниже:GNU C манипуляции с трубами
#include <sys/types.h>
#include <unistd.h>
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
char pipeMessage[100];
char* readFromPipe(int pipe)
{
pipeMessage[0] = '\0';
read(pipe, pipeMessage, sizeof(pipeMessage));
fflush(NULL);
return pipeMessage;
}
void writeToPipe(int pipe, char *input)
{
char text[strlen(input) + 1];
strncpy(text, input, (int)strlen(input));
strncat(text, "\0", 1);
printf("TEXT: %s\n", text);
write(pipe, text, sizeof(text));
fflush(NULL);
}
int main(void)
{
int pipes[2][2];
pid_t pid;
if(pipe(pipes[0]) < 0 || pipe(pipes[1]) < 0)
{
printf("[ERROR] create pipes\n");
return -1;
}
printf("[PARENT] Create child1\n");
if((pid = fork()) < 0)
{
printf("[ERROR] Fork error\n");
return -1;
}
if(pid == 0)
{
// Child code
close(pipes[0][0]);
writeToPipe(pipes[0][1], "TEST MESSAGE");
printf("[CHILD1] pipe message: %s\n", readFromPipe(pipes[1][0]));
writeToPipe(pipes[0][1], "-1");
}
else if(pid > 0)
{
// Parent code
close(pipes[0][1]);
close(pipes[1][0]);
char *message;
do
{
message = readFromPipe(pipes[0][0]);
printf("[PARENT] pipe message: %s\n", message);
writeToPipe(pipes[1][1], "-1");
}
while(atoi(message) != -1);
}
return 0;
}
ошибка является следующее:
[PARENT] Create child1
TEXT: TEST MESSAGE
[PARENT] pipe message: TEST MESSAGE
TEXT: -1
[CHILD1] pipe message: -1
TEXT: -1�po
[PARENT] pipe message: -1�T MESSAGE
TEXT: -1�po
Я пытался осуществить эту обработку с сигналами процесса, но в конечном приложении мне потребуется 3 различные дочерние процессы, а асинхронный запуск вызвал проблемы с обработкой сигнала. Я также попытался найти учебное пособие в сети, но каждый многопроцессорный раздел охватывает простое решение одного сообщения от родителя к ребенку и наоборот. Но в родительском процессе мне нужно меню, основанное на символах, поэтому дети должны постоянно ждать родительского сигнала/сообщения, а родителям также нужно дождаться, когда ребенок закончит фактическую задачу. Пожалуйста, помогите мне, потому что я действительно застрял. Если у вас есть нормальное решение для обработки процессов, сообщите мне, потому что я знаю, что этот код ужасен. Единственная причина - отсутствие правильных учебников. Спасибо заранее.
Я бы использовал некоторое время (правда) с помощью выбора вызова, работающего с файловыми дескрипторами, созданными с помощью socketpair (двунаправленная связь). –
Можете ли вы дать мне отправную точку, пожалуйста? как ссылка или простой пример. заранее заранее – MontyX
Дайте мне 5 мин. Если я не могу найти ссылку, я даю вам простой пример –