У меня есть программа, которая должна считать символы в файле 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;
}
}
спасибо, много читал о трубах, но, понятия не имел ... – patriques