[英]When a parent has written data into a pipe shared with a forked child and both are reading data, how to prevent parent from reading it before child?
我有一個C語言代碼實現父子通信的管道。 我經常需要從父母和孩子那里讀寫。 較小版本的代碼如下:
int main(){
int cpid, var;
int fds[2];
pipe(fds);
if((cpid=fork())==0){
read(fds[0], &var, sizeof(int));
printf("Recieved in child - %d\n",var);
var = 3;
write(fds[1], &var, sizeof(int));
printf("Writing from child - %d\n",var);
exit(0);
}
var = 5;
write(fds[1], &var, sizeof(int));
printf("Writing from parent - %d\n",var);
// I need something here to execute following read only after child writes
read(fds[0], &var, sizeof(int));
printf("Recieved in parent - %d\n",var);
waitpid(cpid,NULL,0);
return 0;
}
但我面臨的問題是父進程中的讀取剛剛從父進程寫入后執行。 我需要防止這種情況發生。 在孩子用上面的代碼編寫之前,我們有什么方法可以停止在父母中閱讀? 歡迎任何算法或建議。
PS:我嘗試使用像SUGUSR1這樣的信號並暫停父節點直到子節點發送信號,但由於信號沒有排隊,因此在這種情況下信號的概念因多個子父管道通信而失敗。
根據@JonathanLeffler和@EugeneSh的評論。 單管不適合雙向通信。 因此,上面的代碼可以修改為使用一個管道用於父子,一個管道用於子父通信,如下所示:
int main(){
int cpid, var;
int p2c[2], c2p[2];
pipe(p2c);
pipe(c2p);
if((cpid=fork())==0){
read(p2c[0], &var, sizeof(int));
printf("Recieved in child - %d\n",var);
var = 3;
write(c2p[1], &var, sizeof(int));
printf("Writing from child - %d\n",var);
exit(0);
}
var = 5;
write(p2c[1], &var, sizeof(int));
printf("Writing from parent - %d\n",var);
read(c2p[0], &var, sizeof(int));
printf("Recieved in parent - %d\n",var);
waitpid(cpid,NULL,0);
return 0;
}
這也適用於多個子父邏輯。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.