Здесь кто-нибудь видит ошибки?Я пытаюсь получить сообщение через канал, от моего родителя к ребенку - PullRequest
0 голосов
/ 08 мая 2019

Проблема здесь в том, что дочерний процесс не ожидает поступления сообщения от функции startWorking(), и из-за этого я получаю случайный символ в качестве вывода или иногда ничего.

Я отправляю массив символов из startWorking() в канал и проверяю, что только родитель выполняет эту работу.

Одним из решений будет отправка сигнала из startWorking() на дочерний процессор после записи в канал. Но поведение функции read() ожидает, когда канал примет сообщение, и только затем прочитает сообщение, но почему-то этого не происходит, или, возможно, возникла проблема при написании сообщения.

int main(int argc, char const *argv[])
{
    pid_t pid;
    pid = fork();
    int mypipefd[2];
    if (pid > 0)
    {
        if (pipe(mypipefd) == -1) 
        {
        perror("Pipe failed\n");
        exit(EXIT_FAILURE);
        }
        storeEngine(mypipefd);
    } 
    else if(pid < 0) 
    {
        perror("fork call failed \n");
        exit(EXIT_FAILURE);
    }
    else 
    {
        printf("I am the child \n");
        printf("child: %d \n", getpid());

        char message[6];
        close(mypipefd[1]);
        read(mypipefd[0], &message, 6);
        close(mypipefd[0]);
        printf("child read value:\n ");
        printf("%s \n", message);
    }
    return 0;
}
void startWorking(int *mypipefd)
{   
    printf("%d \n" ,getpid());
    //close(*mypipefd);
    write(*(mypipefd+1), "hello", 6);
    close(*(mypipefd+1));
}

Обратите внимание, что если я удалю два слэша за close(*mypipefd), программа никогда не завершится и там застрянет.

Ответы [ 2 ]

3 голосов
/ 08 мая 2019

Не проверяя оставшуюся часть кода, вам нужно вызвать pipe(), прежде чем вызывать fork(), чтобы канал мог использоваться как родительским, так и дочерним процессом. Если вы позвоните pipe() после вызова fork(), канал будет использоваться только этим одним процессом.

Больше похоже на это:

int main(int argc, char const *argv[])
{
    int mypipefd[2];

    if ( pipe( mypipefd ) == -1 )
    {
        perror("Pipe failed\n");
        exit(EXIT_FAILURE);
    }

    pid_t pid = fork();
    if (pid > 0)
    {
        storeEngine(mypipefd);
    } 
    .
    .
    .
0 голосов
/ 08 мая 2019

Нет, каналы, используемые для связи между процессами, должны быть созданы до fork () (иначе у вас не будет простого способа отправить их через них, поскольку чтение и запись должны использоваться разными процессами).

...