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;
}
}
감사합니다. 파이프에 대해 많이 읽었지만 아무 생각도 없었습니다. – patriques