[英]Fork + Pipe problem
我有一個簡單的程序我用叉子和管道制作用於學習目的的問題。 我想要一個將一些數據發送給父母的孩子,然后這個(父母)再次將數據發送給孩子。
結果是父級的行為就像管道是非阻塞的,子級的行為就像管道是非阻塞的。 但是我沒有使用任何代碼來告訴管道完全沒有阻塞。
讓我展示一下:
#include <sys/types.h>
#include <sys/stat.h>
#include <sys/wait.h>
#include <unistd.h>
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <fcntl.h>
#include <conio.h>
void WriteStr(char* inStr)
{
write(1,inStr,strlen(inStr));
}
int main(void){
char *cad1 = "Introdueix un valor: ";
int bytesr = 0;
char valor[256];
//Un pipe serveix solament per una comunicació unidereccional,
//si es necessari que pare i fill es comuniquin en amdos sentits,
//s'hauran d'utilitzar dos pipes.
int pip_fill[2]; //pip_fp[0]: file descriptor de lectura
//pip_fp[1]: file descriptor d'escriptura
int pip_pare[2]; //pip_pf[0]: file descriptor de lectura
//pip_pf[1]: file descriptor d'escriptura
int pid, nbytes = 0;
char cad[256];
int num = 0;
if (pipe (pip_fill)<0){
write (1,"Pipe error!!!!\n",15);
exit (1);
}
if (pipe (pip_pare)<0){
write (1,"Pipe error!!!!\n",15);
exit (1);
}
fflushnou();
pid = fork();
switch (pid){
case -1:
//Error
write (2,"Tractar_Valor: Error!!!!\n",25);
exit (-1);
case 0:
//Fill
//printf("Fill: fp[0]:%d fp[1]:%d pf[0]:%d pf[1]:%d \n",pip_fp[0],pip_fp[1],pip_pf[0],pip_pf[1]);
close(pip_fill[0]);
close(pip_pare[1]);
while(1){
bytesr = read(0, valor, 256);
valor[bytesr] = '\0';
write(pip_fill[1],valor,strlen(valor)); //el fill escriu a la pipe la var valor
WriteStr("Fill avans\n");
nbytes = read(pip_pare[0],cad,strlen(cad)); //el fill llegeix de la pipe la var un cop ha estat tractada per el pare
WriteStr("Fill despres\n");
if (nbytes != 0){ //vol dir que hem llegit algo per la pipe pip_pf
write(1,cad,strlen(cad)); //pintem cad per pantalla
}
sleep(1);
}
default:
//Pare
close(pip_fill[1]);
close(pip_pare[0]);
close(0);
while(1){
nbytes = read(pip_fill[0],valor,strlen(valor));//el pare llegeix de la pipe la var valor
//WriteStr("Pare despres\n");
if (nbytes != 0){ //vol dir que hem llegit algo per la pipe pip_fp
//tractem la variable valor
num = atoi(valor);
num = num*2;
sprintf(cad,"Valor actual de la variable: %d \n\n",num);
write(1,cad,strlen(cad));
write(pip_pare[1],cad,strlen(cad)); //el pare escriu a la pipe la var tractada
}
sleep(1);
}
}
return 0;
}
實際的行為是孩子接受輸入,然后卡住讀“ pip_pare [0]”。 同時,父進程正在循環並一直從'pip_fill [0]'讀取值為0。
所以,我對此一點都不感到困惑,為什么父母在不讀取“ read”功能的情況下進行讀取和loopinf?
有什么建議可以解決嗎?
謝謝您的幫助 :)
勞倫斯
nbytes = read(pip_pare[0],cad,strlen(cad));
我認為您可能在這里指的是sizeof(cad)
。
write(1,cad,strlen(cad));
還有nbytes
。
nbytes = read(pip_fill[0],valor,strlen(valor));
和這類似,但是在這個版本中有一個隱藏的陷阱,我將在練習中留下!
發送可變長度的數據時,最好先發送長度(以固定長度的整數形式),以便收件人知道要請求多少數據。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.