Babita22 Ответов: 3

двусторонняя связь между дочерними и родительскими процессами в C с помощью каналов


Я хочу, чтобы родительские и дочерние процессы взаимодействовали в C linux с помощью каналов. Я создал два файловых дескриптора. один для родителя к ребенку, то есть readpipe и другой writepipe для viceversa.
Но я получаю null в качестве вывода для строк ch и ch1 в моем коде ниже.
Пожалуйста, помогите мне в этом.

#include <stdio.h>
#include<stdlib.h>
#include 
#include<unistd.h>
int main()
{
    pid_t pid;
    int r;
    char *ch=NULL;
    char *ch1=NULL;
    int readpipe[2];
    int writepipe[2];
    int a;
    int b;
    a=pipe(readpipe);
    b=pipe(writepipe);
      // check a and b

    pid=fork();
    // check pid

    if(pid==0)
    { //CHILD PROCESS
            close(readpipe[1]);
            close(writepipe[1]);
            read(readpipe[0],ch,sizeof(ch));
            printf("\nREAD = %s",ch);
            close(readpipe[0]);
            ch1="YES";
            write(writepipe[1],ch1,sizeof(ch1));
            close(writepipe[1]);
    }
    else
    { //PARENT PROCESS
            close(writepipe[0]);
            close(writepipe[1]);
            ch="HI!! YOU THERE";
            write(readpipe[1],ch,sizeof(ch));
            close(readpipe[1]);
            read(writepipe[1],ch1,sizeof(ch1));
            printf("\nACK RECEIVED %s",ch1);
            close(writepipe[1]);
    }
    return 0;
}

Спасибо...:)

Babita22

спасибо @Richard за то, что он сделал это ясно. Как это сделать, кстати?

Richard MacCutchan

Нажмите кнопку Улучшить вопрос ссылка, и вы можете отредактировать свой вопрос. Затем вы увидите теги <pre>, которые я добавил вокруг вашего кода. Почему бы не посмотреть на все пункты меню над окном редактирования, чтобы увидеть, для чего они существуют?

3 Ответов

Рейтинг:
20

Babita22

#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
#include <string.h>
#include<wait.h>
int main(void)
{
        pid_t pid;
        int r;
        char buf[1024];
        char cp[50];
        char ans;
        int readpipe[2];
        int writepipe[2];
        long int a;
        int b;
        a=pipe(readpipe);
        b=pipe(writepipe);

        if (a == -1) { perror("pipe"); exit(EXIT_FAILURE); }
        if (b == -1) { perror("pipe"); exit(EXIT_FAILURE); }
        printf("\nSIZE OF CP IS %d",sizeof(cp));
        printf("\nSEND SOMETHING TO CHILD PROCESS\t");
        scanf("%[^\n]%*c",&ans);
        fflush(stdin);
        pid=fork();
        if(pid==-1)
        {
                printf("pid:main");
                exit(1);
        }
        while(ans=='y' || ans=='Y')
        {
                if(pid==0)
                { 
                //CHILD PROCESS
                         if(ans=='n')
                        {
                                //a=getpid();
                                //printf("\nPARENT PROCESS a=%ld",a);
                                kill(pid,SIGKILL);
                        }

                        close(readpipe[1]);
                        close(writepipe[0]);
                        if(read(readpipe[0],buf,sizeof(buf)) < 0)
                        {
                            break;
                        }
                        printf("\nChild Process Read: %s\n",buf);
                        printf("\n(child)Enter data:\t");
                        fflush(stdin);
                        fgets(cp, 50, stdin);
                        printf("\nData Written to Parent%s",cp);
                        if(/*!strncmp("Q",cp,1) || */write(writepipe[1],cp,strlen(cp)+1) < 0)
                        {
                            break;
                        }
                        //printf("\nSEND SOMETHING TO PARENT PROCESS\t");
                        //fflush(stdin);
                        //scanf(" %[^\n]%*c",&ans);

                }
                else
                {
                        close(readpipe[0]);
                        close(writepipe[1]);
                        printf("\n(Parent)Enter data\t");
                        fgets(cp, 50, stdin);
                        printf("\nData Writtent to Child: %s",cp);
                        if(/*!strncmp("Q",cp,1) ||*/ write(readpipe[1],cp,strlen(cp)+1) < 0)
                        {
                            break;
                        }        

                        if(read(writepipe[0],buf,sizeof(buf)) < 0)
                        {
                            break;
                        }
                        printf("\nParent Process Read: %s\n",buf);
                        printf("\nSEND SOMETHING TO CHILD PROCESS\t");
                        fflush(stdin);
                        scanf(" %[^\n]%*c",&ans);
                        if(ans=='n')
                        {
                                kill(pid,SIGKILL);
                        }
                }
//              printf("\nSEND SOMETHING TO CHILD PROCESS\t");
//              scanf("%[^\n]%*c",&ans);

        }
        close(readpipe[1]);
        close(writepipe[0]);
        close(readpipe[0]);
        close(writepipe[1]);
        return 0;
}


Рейтинг:
2

bling

Я вижу две проблемы (их может быть больше) ...


1. в дочернем процессе половину кода вы закрываете writepipe[1], а затем записываете в него.

2. в родительской части кода процесса вы закрываете оба дескриптора writepipe, но позже снова закрываете writepipe[1].


Рейтинг:
0

Member 13844341

#включить <stdio.h>
#include <unistd.h>
#include <sys types.h="">
#include <stdlib.h>
#включить <memory.h>

тап_п() {
//для родителей и детей
int parentToChild[2];

//для ребенка к родителю
int childToParent[2];

//строковые данные
char message1[] = "массаж от ребенка к родителю\n";
char message2[] = "сообщение от родителя к ребенку\n";
char readBuffer[120];
труба(parentToChild);
труба(childToParent);
инт процесса , байт;

если((процесса = вызов Fork())== -1){
printf("ошибка при создании дочернего процесса");
}

если(processId == 0){
//дочерний процесс здесь
//отправить сообщение от ребенка к родителю
закрыть(childToParent[0]);
write(childToParent[1] , message1 , strlen(message1)+1);

//получить сообщение от родителя
закрыть(parentToChild[1]);
bytes = read(parentToChild[0] , readBuffer , sizeof(readBuffer));
printf("%s",readBuffer);

// выход(1);
}

если(processId !=0 ){
//родительский процесс здесь
//отправить сообщение от родителя к ребенку
закрыть(parentToChild[0]);
write(parentToChild[1] , message2 , strlen(message2)+1);

//получение сообщения от ребенка
закрыть(childToParent[1]);
bytes = read(childToParent[0] , readBuffer , sizeof(readBuffer));
printf("%s", readBuffer);
// выход(1);
}

возвращает 0;
}


Richard MacCutchan

Уже отвечал четыре года назад.