1
我在學習管道和叉子。在這種情況下,我試圖從父母向孩子寫同一個詞。下面是一些練習代碼我寫的(四個孩子):從一位家長寫信給多個孩子?
#define MAXWORD 5
int main() {
pid_t parentID, pid, fd[2];
int i, j, k;
int status = 0;
char toWrite[5] = "abcd";
pipe(fd);
parentID = getpid();
for (i = 0; i < 4; i++) {
if (getpid() == parentID) {
pid = fork();
}
if (pid < 0) {
perror("fork");
exit(1);
} else if (pid == 0) {
close(fd[1]);
printf("Reading ...\n");
char buf[MAXWORD];
read(fd[0], buf, MAXWORD);
printf("CHILD : %d\tread : %s\n", getpid(), buf);
exit(0); // edited
}
}
for (k = 0; k < 4; k++) {
if (getpid() == parentID) {
close(fd[0]);
printf("Writing ...\n");
write(fd[1], toWrite, MAXWORD);
wait(&status); // edited
}
}
return 0;
}
下面是從代碼的輸出:
Reading ...
Writing ...
CHILD : 1457 read : abcd
Writing ...
Reading ...
Reading ...
Writing ...
Writing ...
CHILD : 1458 read : abcd
CHILD : 1457 read : abcd
Reading ...
Reading ...
CHILD : 1458 read : abcd
Reading ...
Reading ...
Reading ...
CHILD : 1458 read : abcd
CHILD : 1459 read :
Reading ...
CHILD : 1459 read :
CHILD : 1460 read :
CHILD : 1457 read : abcd
Reading ...
CHILD : 1457 read : abcd
如果我把寫報表否則,如果條款中的環路,將分叉完成它工作正常。但是,如果我在孩子創建後嘗試寫作,則效果不佳。
編輯:添加標記爲「編輯」的行後,該程序按預期工作。這是否是正確的做法?
和投入讚賞。謝謝。
你提出的最後一點一直困擾着我。我應該沒有寫入循環? – isal 2013-03-19 01:51:04
一種常用的方法是將孩子分成一個循環。然後在循環之後,使用if(getpid()!= parentID)在其周圍進行讀取。這將導致每個孩子讀一次。這意味着每個孩子都會得到一次寫作。 – 2013-03-19 01:54:26
啊,呃!這很好。但是,如果寫也是類似的? – isal 2013-03-19 02:03:30