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;
    }
}
4

1 回答 1

1

管道不是双向通信,它是单向的,fd[0] 是读端,fd[1] 是写端。

您的代码使用一个管道作为双向(您注释掉了 FD 的关闭,假设它会变成双向),这就是您得到未定义行为的原因。

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

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

于 2013-03-24T02:57:48.267 回答