Когда я вызываю функции по отдельности в main, они работают нормально, просто печатая нужное сообщение один раз. Вызов обеих функций приводит к тому, что навигация дважды печатает свои сообщения.
Я искал другое решение. Я пытался использовать fflush (stdout) безрезультатно, я пытался использовать условие в основном, чтобы убедиться, что они работают по отдельности.
#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
#include <string.h>
#include <wait.h>
#include "RAND_API.h"
#define MAXLEN 500
void lifeSupport();
void navigation();
int main()
{
lifeSupport();
navigation();
return 0;
}
void lifeSupport()
{
//Create pipe
ret = write( myPipe[1], lifeSup1, strlen( lifeSup1 ) + 1 );
//sleep( getRandExponential() * 10 );
ret = write( myPipe2[1], lifeSup2, strlen( lifeSup2 ) + 1 );
//sleep( getSRand() * 6 );
sleep( getRandExponential() * 5 );
ret = write( myPipe3[1], lifeSup3, strlen( lifeSup3 ) + 1 );
sleep( getRandExponential() * 4 );
ret = write( myPipe4[1], lifeSup4, strlen( lifeSup4 ) + 1 );
close( myPipe[1] );
close( myPipe2[1] );
close( myPipe3[1] );
close( myPipe4[1] );
}
else
{
//wait(NULL);
close( myPipe[1] );
close( myPipe2[1] );
close( myPipe3[1] );
close( myPipe4[1] );
ret = read( myPipe[0], buffer, MAXLEN );
printf( "%s", buffer );
ret = read( myPipe2[0], buffer, MAXLEN );
printf( "%s", buffer );
ret = read( myPipe3[0], buffer, MAXLEN );
printf( "%s", buffer );
ret = read( myPipe4[0], buffer, MAXLEN );
printf( "%s", buffer );
}
}
void navigation()
{
//create pipe
ret = write( apipe[1], nav1, strlen( nav1 ) + 1 );
ret = write( apipe2[1], nav2, strlen( nav2 ) + 1 );
//sleep( getSRand() * 6 );
ret = write( apipe3[1], nav3, strlen( nav3 ) + 1 );
close( apipe[1] );
close( apipe2[1] );
close( apipe3[1] );
}
else
{
close( apipe[1] );
close( apipe2[1] );
close( apipe3[1] );
ret = read( apipe[0], buff, MAXLEN );
printf( "%s\n", buff );
ret = read( apipe2[0], buff, MAXLEN );
printf( "%s\n", buff );
ret = read( apipe3[0], buff, MAXLEN );
printf( "%s\n", buff );
close( apipe[0] );
close( apipe2[0] );
close( apipe3[0] );
}
}
выход:
Life support system initiiated
Adjusting breathing gas levels
Adjusting enviroment
Life support system terminating
Initiating navigation system
Initiating navigation system
Making adjustments
Making adjustments
Adjustments done. Navigation system terminating.
Adjustments done. Navigation system terminating.
Ожидаемый результат:
Life support system initiiated
Adjusting breathing gas levels
Adjusting enviroment
Life support system terminating
Initiating navigation system
Making adjustments
Adjustments done. Navigation system terminating.
@ user3386109 что ты имеешь в виду? Извините, если ответ очевиден, пошутите, я все еще учусь. Я не должен разветвляться в навигации?
Ваше редактирование, похоже, удалило большую часть кода, о котором вы спрашивали. Теперь вы просто показываете части программы, и она не может быть скомпилирована.
Когда вы вызываете lifeSupport()
, он разветвляет ребенка. Ребенок пишет сообщения во все каналы myPipeX
, родитель читает из них и печатает сообщения, затем и родитель, и ребенок возвращаются в main()
.
Затем оба процесса вызывают navigation()
. Каждый из них создает еще одного ребенка. Двое детей пишут в apipeX
трубы, двое родителей читают из них, и каждый из них печатает сообщения. Таким образом, вы получаете две копии всех сообщений от navigation()
.
В каждой функции дочерний элемент должен вызывать exit()
после того, как это будет сделано, а не возвращаться. Только родитель должен вернуться к main()
.
Спасибо что сделал.
Обратите внимание, что и родитель, и потомок будут вызывать функцию
navigation
, что означает, что у вас есть четыре процесса послеfork
вnavigation
.