Функция навигации печатает весь свой вывод дважды - PullRequest
0 голосов
/ 11 апреля 2019

Когда я вызываю функции по отдельности в основном, они работают нормально, просто печатая нужное сообщение один раз. Вызов обеих функций приводит к тому, что навигация печатает свои сообщения дважды.

Я искал другое решение. Я попытался использовать fflush (stdout) безрезультатно, я попытался использовать условие в main, чтобы убедиться, что они запускаются индивидуально.

#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.

1 Ответ

1 голос
/ 11 апреля 2019

Когда вы звоните lifeSupport(), он разветвляется на ребенка. Дочерний записывает сообщения во все каналы myPipeX, родитель читает их и печатает сообщения, затем и родитель, и потомок возвращаются к main().

Тогда оба процесса вызывают navigation(). Каждый из них создает другого ребенка. Двое детей пишут в apipeX каналы, два родителя читают с них, и каждый из них печатает сообщения. Таким образом, вы получаете две копии всех сообщений от navigation().

В каждой функции дочерний элемент должен вызывать exit() после выполнения, а не возврата. Только родитель должен вернуться к main().

...