如何在子进程和父进程之间传递整数

问题描述:

我有一个程序应该计算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; 
    } 
} 

管道是NOT双向通信,它是单向的,FD [0]是读端和FD [1]是写入 - 结束。

您的代码使用一个管道作为双向(您注意到FD的关闭假设它将成为双向),这就是为什么你会得到未定义的行为。

如果你想双向你需要两个管道:-)或者你可以使用socketpair(2)创建双向IPC fds。

如果您需要更多帮助,只需发表评论。

+0

谢谢,已经读了很多关于管道的知识,但是,不知道... – patriques 2013-03-24 07:16:48