2013-03-24 1 views
0

txt 파일의 문자를 계산하고 자식 프로세스를 사용하여 문자를 계산 한 다음 그 값을 인쇄하는 프로그램이 있습니다. 부모는 파일의 줄을 while 루프의 자식으로 전달합니다. 이 프로그램은 파일을 열어서 줄 단위로 읽은 다음 자식 프로세스가 그 양을 인쇄하면 올바른 것입니다.자식 프로세스와 부모간에 정수를 전달하는 방법

하지만 지금은 자식 프로세스가 금액을 되돌려주고 부모가 char의 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

파이프 그것은 단방향, NOT 양방향 통신이며, [0]이 판독되고 최종 FD [1]에 기입 단부가 fd이다.

코드가 하나의 파이프를 양방향으로 사용하고 있습니다 (FD가 양방향이 될 것이라고 가정 할 때 FD의 종료를 주석 처리 했으므로) 정의되지 않은 동작이 발생합니다.

양방향을 원하면 두 개의 파이프가 필요합니다 .-) 또는 socketpair (2)를 사용하여 양방향 IPC fds를 만들 수 있습니다.

도움이 더 필요한 경우 댓글을 달아주세요.

+0

감사합니다. 파이프에 대해 많이 읽었지만 아무 생각도 없었습니다. – patriques

관련 문제