Один из дочерних процессов не может читать из канала - PullRequest
0 голосов
/ 17 февраля 2020

Я пытаюсь реализовать небольшой IP C в C, но у меня есть проблема, которую я не могу решить.

У моего основного процесса есть два дочерних элемента, дочерний элемент A и дочерний элемент B; Ребенок А создается первым. У меня есть два канала для передачи информации этим процессам: pipefd и pipefd2.

Сначала родительский процесс читает содержимое файла и записывает в оба канала следующие два значения:

1-length of the string 
2-string itself

Получив длину строки, они создают массив символов заданной длины, а затем считывают строку в этот массив.

Затем оба потомка читают из своих каналов. Дочерний B может правильно получить эти значения из канала, но дочерний A получает 0 в качестве размера.

Вот мой код, спасибо за ваше время!

Вывод:

Child A here, input read, size is: 0 
Size is 45169child reads input, size : 45169 
Child B here, input read, size is: 45169 


//
//  Created by Dilara on 16.02.2020.
//


#include <stdio.h>
#include <sys/types.h>
#include <unistd.h>
#include <time.h>
#include <signal.h>
#include <sys/ipc.h>
#include <sys/shm.h>
#include <string.h>
#include <fcntl.h>
#include <sys/mman.h>
#include <sys/wait.h>
#include <sys/ipc.h>
#include <sys/msg.h>


#define MESSAGESIZE 10
#define READ_END    0
#define WRITE_END    1

int fsize(FILE *fp){
    int prev=ftell(fp);
    fseek(fp, 0L, SEEK_END);
    int sz=ftell(fp);
    fseek(fp,prev,SEEK_SET); //go back to where we were
    return sz;
}



void writeToPipe(int fd[2], char string[], long stell){
       close(fd[READ_END]);
        write(fd[WRITE_END], stell, sizeof(stell));
         write(fd[WRITE_END], string, strlen(string)+1);
         close(fd[WRITE_END]);
}

static void readFromPipe(int pipefd[2], char input[],long size){
         // wait(NULL);
           close(pipefd[WRITE_END]);
           read(pipefd[READ_END], input, size);
           printf("child reads input, size : %d \n",size);
           close(pipefd[READ_END]);
}

static long readSize(int pipefd[2]){
       long size;
     close(pipefd[WRITE_END]);
     read(pipefd[READ_END], size, sizeof(size));
     printf("Size is %d",size);
     close(pipefd[READ_END]);
    return size;
}




int main()
{

    int pipefd[2];
    int pipefd2[2];
      int childA_pid;
      int childB_pid;

    if (pipe(pipefd) == -1)
           {
               perror(" pipe");
               return 0;
           }

    if (pipe(pipefd2) == -1)
           {
               perror(" pipe");
               return 0;
           }


       childA_pid = fork();

        if(childA_pid == 0){
            //childA

        long SIZE = readSize(pipefd);
        char input[SIZE];
        readFromPipe(pipefd, input, SIZE);
          printf("Child A here, input read, size is: %d \n",SIZE);

        }
    else{
        childB_pid = fork();
        if(childB_pid == 0){

             long SIZE = readSize(pipefd2);
             char input[SIZE];
             readFromPipe(pipefd2, input, SIZE);
              printf("Child B here, input read, size is: %d \n",SIZE);


        }else{
            //parent
               char *buffer;
                       FILE *fp = fopen("try.txt", "r");
                 if (fp != NULL)
                 {
                     fseek(fp, 0L, SEEK_END);
                     long stell = ftell(fp);
                     rewind(fp);
                     char str[stell];
                     buffer = (char *)malloc(stell);

                     if (buffer != NULL)
                     {
                         //fread(buffer, stell, 1, fp);

                             fread(str,stell,1, fp);
                          // printf("%s", str);
                         fclose(fp);
                         fp = NULL;
                         free(buffer);
                     }

                       printf("SIZE: %d", stell);

                     writeToPipe(pipefd2, str,stell);
                     writeToPipe(pipefd, str,stell);



                 }

        }
   
}
    return 0;
}

1 Ответ

0 голосов
/ 17 февраля 2020
write(fd[WRITE_END], stell, sizeof(stell));

Я думаю, что вашему коду здесь не хватает амперсанда. Вместо переменной stell вы должны использовать ее адрес:

write(fd[WRITE_END], &stell, sizeof(stell));
...