2013-03-24 6 views
0

У меня есть программа, которая должна считать символы в файле txt и использовать дочерний процесс для подсчета символов, а затем распечатать сумму. Родитель просто передает строки в файл дочернему элементу в цикле while. Программа работает в этом смысле, что она может открыть файл, прочитать его по очереди, а затем, если дочерний процесс печатает сумму, она правильная.Как передать целое число между дочерними процессами и родительским

Но теперь я хочу изменить его так, чтобы дочерний процесс возвращал сумму, а родитель выписывает nr символов. Но когда я пытаюсь это сделать, программа дает мне 1153416175 вместо реального количества символов в файле, а также просто застревает, и я должен ее убить. Почему это происходит?

#include <stdio.h> 
#include <unistd.h> 
#include <sys/types.h> 
#include <stdlib.h> 
#include <string.h> 
#define MAXLINE 100 

int main(int argc, char *argv[]) { 
    int fds[2]; /* file descriptors */ 
    int child; /* child process */ 
    int n; /* size of line in file */ 
    int count, alphacount, total=0; /* used in loop for counting chars in line */ 
    int read_bytes; /* amount of bytes read in read function */ 
    char line[MAXLINE]; 
    FILE *fp; 
    char *str; 

    if (argc < 2) { 
     printf("Format: './rakna <filename>'.\nThe file should have the .txt extension.\n"); 
     exit(1);  
    } else { 
     if (pipe(fds) < 0) { 
      perror("Can't open pipe\n"); 
      exit(1); 
     } 
     child = fork(); 
     if (child==-1) { 
      perror("fork error"); 
      exit(1); 
     } 

     /* child that reads chars and returns amount */ 
     if(child == 0)  
     { 
      /* close(fds[1]); child process close input of pipe Used to be before ..*/ 
      /* count chars through read */ 
      while (read_bytes = read(fds[0], line, sizeof(line)) > 0) { 
       /* check if line is received */ 
       if (read_bytes < 0) { 
        perror("Can't read line"); 
        exit(1); 
       } 
       /* count chars in the line */ 
       else { 
        count=0; 
        alphacount=0; 
        while (line[count] != '\0') 
        { 
         /* counting chars from 'a' to 'z' */ 
         if (line[count] >= 'a' && line[count] <= 'z') 
          alphacount++; 
         /* counting chars from 'A' to 'Z' */ 
         else if (line[count] >= 'A' && line[count] <= 'Z') 
          alphacount++; 
         count++; 
        } 
        /* adding the nr of chars in line to total */ 
        total += alphacount; 
       } 
      } 
      write(fds[1], &total, sizeof(total)); /* passing total nr of chars to parent */ 
      close(fds[0]); /* closing output part of pipe */ 
      exit(0); /* ending child process */ 
     } 

     /* parent that sends chars to child-reader and writes out amount */ 
     else 
     { 
      /* close(fds[0]); Parent process close output of pipe */ 
      fp = fopen(argv[1], "r"); 
      if (fp == 0) { 
       perror("Could not read the file.\n"); 
       exit(1); 
      } 
      while (fgets(line, MAXLINE, fp) != NULL) { 
       n = strlen(line); 
       if (n >= 0) { 
        line[n]='\0'; 
        if (write(fds[1], line, n) != n) { 
         perror("write error in pipe"); 
         exit(1); 
        } 
       } 
       else { 
        perror("problem with fgets"); 
        exit(1); 
       } 
      } 

      int nrofchars; 
      read_bytes = read(fds[0], &nrofchars, sizeof(nrofchars)); 
      printf("The file has %d nr of chars between a-z\n", nrofchars); //<-- Here it f**ks up, it gives me 1153416175 
      close(fds[1]); /* closing input part of pipe */ 
      wait(NULL); /* waits for child to read end of file */ 
     } 
     return 0; 
    } 
} 

ответ

1

Труба НЕ двусторонней связи, оно является однонаправленным, Fd [0] является чтение-конец и FD [1] является записью конца.

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

Если вы хотите двунаправленную, вам понадобятся две трубы :-) ИЛИ вы можете использовать socketpair (2) для создания двунаправленных IPC-фонов.

Если вам нужна дополнительная помощь, просто оставьте комментарий.

+0

спасибо, много читал о трубах, но, понятия не имел ... – patriques

Смежные вопросы