파이프가 어떻게 작동하는지 이해하려고하는데 교과서에서이 코드를 읽을 때 혼란 스럽습니다. 우리가 그것을 중복 직후 왜 우리가 fd2[0]
을 복제하는 라인파이프를 닫고 파이프를 복제하는 방법
dup(fd2[0]); close(fd2[0]);
에서 닫습니다?
#include <stdio.h>
#include <time.h>
#include <sys/types.h>
#include <unistd.h>
int main() {
struct timespec ts1, ts2;
pid_t newpid;
int fd1[2], fd2[2];
char m0[] = "\nabout to fork....\n";
char m1[] = "message from parent to child\n";
char m2[] = "message from child to parent\n";
char m3[] = "\ndone....\n";
char rbuf1[256];
char rbuf2[256];
int cn1, cn2;
ts1.tv_sec=(time_t)1;
ts1.tv_nsec=(long)1;
ts2.tv_sec=(time_t)1;
ts2.tv_nsec=(long)1;
if ((pipe(fd1)==-1)) printf("error\n");
if ((pipe(fd2)==-1)) printf("error\n");
printf("fd1 %d %d fd2 %d %d\n", fd1[0], fd1[1], fd2[0], fd2[1]);
if ((newpid=fork()) ==-1) {
printf("failed to fork\n\n");
return 0;
}
if (newpid > 0) { // parent ***************
close(fd1[1]); close(fd2[0]); // closing 4 and 5
dup(fd2[1]); close(fd2[1]); // taking 4 in place of 6
write(4, m1, sizeof(m1)); // parent_to_child messg
usleep(10000);
cn1=read(3, rbuf1, 256);
write(1, rbuf1, cn1);
} else { // child ***************
close(fd1[0]); close(fd2[1]); // closing 3 and 6
dup(fd2[0]); close(fd2[0]); // taking 3 in place of 5
write(4, m2, sizeof(m2)); // child_to_parent messg
usleep(10000);
cn2=read(3, rbuf2, 256);
write(1, rbuf2, cn2);
}
write(2, m3, sizeof(m3));
return 0;
}
코드는 귀하의 질문과 관련이없는 것 같습니다. 어디서나 "dup"을 볼 수는 없습니다. – Sentry
죄송합니다, 내 질문에 코드의 두 번째 절반을 추가하는 것을 잊지 – Learning
코드를 포맷하십시오. –