부모와 두 자녀 사이에 정보를 보내기 위해 파이프를 사용하는 C 프로그램을 작성하려고합니다. 이 프로그램의 목적은 문자열 병합과 비슷한 것을 달성하는 것입니다. 나는 문자열의 수와 문자열을 읽었다. 문자열은 두 아이 사이에 나뉘며 각 아이가 하나의 문자열을 가질 때까지 재귀 적으로 나뉩니다. 부모님의 표준에서 읽도록 아이의 표준 입력을 리디렉션해야합니다.부모와 두 자녀 사이의 파이프
어떤 이유로 든 어떤 어린이도 첫 번째 문자열 이상을 읽지 않습니다. 이 문제는 어떻게 해결할 수 있습니까?
int main(int argc, char * argv[]) {
int nrrows = 0;
char * buffer = NULL;
size_t n = 0;
getline(&buffer, &n, stdin);
char * endptr;
nrrows = strtol(buffer, &endptr, 10);
char rows[nrrows][MAX_LEN];
int i = 0;
n = 0;
while(i < nrrows) {
char * row = NULL;
getline(&row, &n, stdin);
strcpy(rows[i], row);
i++;
}
if(nrrows == 1) {
fprintf(stderr, "%s", rows[0]);
return 0;
}
int fdcp1[2];
int fdcp2[2];
if(pipe(fdcp1) < 0) {
fprintf(stderr, "pipe unsuccessfull\n");
return EXIT_FAILURE;
}
if(pipe(fdcp2) < 0) {
fprintf(stderr, "pipe unsuccessfull\n");
return EXIT_FAILURE;
}
pid_t chpid1 = fork();
if(chpid1 < 0) {
fprintf(stderr, "fork unsuccessfull\n");
return EXIT_FAILURE;
}
else if(chpid1 == 0) {
close(fdcp2[0]);
close(fdcp2[1]);
close(fdcp1[1]);
dup2(fdcp1[0], STDIN_FILENO);
execlp("./forksort", "child1", NULL);
}else {
close(fdcp1[0]);
dup2(fdcp1[1], STDOUT_FILENO);
double half = (nrrows/2);
int h = half;
char b[2];
b[0] = '0' + h;
b[1] = '\n';
write(fdcp1[1], b, sizeof(b));
for(i = 0; i < h; i ++) {
rows[i][strlen(rows[i])] = '\0';
write(fdcp1[1], rows[i], sizeof(rows[i]));
}
pid_t chpid2 = fork();
if(chpid2 < 0) {
fprintf(stderr, "fork unsuccessfull\n");
return EXIT_FAILURE;
}else if(chpid2 == 0) {
close(fdcp1[0]);
close(fdcp1[1]);
close(fdcp2[1]);
dup2(fdcp2[0], STDIN_FILENO);
execlp("./forksort", "child2", NULL);
}else {
close(fdcp2[0]);
dup2(fdcp2[1], STDOUT_FILENO);
half = (nrrows/2);
h = half;
char b[2];
b[0] = '0' + (nrrows - h);
b[1] = '\n';
write(fdcp2[1], b, sizeof(b));
for(i = h; i < nrrows; i ++) {
rows[i][strlen(rows[i])] = '\0';
write(fdcp2[1], rows[i], sizeof(rows[i]));
}
}
}
return 0;
}
'pid_t chpid2 = fork(); pid_t chpid1 = fork();'첫 번째 자식의 추가 자식 만들기가 발생합니까? chpid2와 chpid1은 parent에 의해 생성되지만 다른 chpid1은 parent의 chpid2에 의해 생성됩니다. –
그래, 알아. 그러나 그들은 여전히 읽을 수 없습니다. – Syn
죄송합니다. 시간이 없으며 코드로 다이빙 할 예정입니다.하지만 다른 아이가 파이프를 막 닫았을 수도 있습니다. 분기 코드를 수정하고 동작을 수정하는지 확인하십시오. –