C 进程与管道之间的通信
我试图实现一个程序,该程序在输入中接受一系列参数,并根据它创建由管道实现的相等数量的进程,其中每个进程写入管道,然后将其传递给父进程 这是我的代码,它不能满足我的需要 谢谢你的帮助C 进程与管道之间的通信,c,operating-system,fork,pipe,inter-process-communicat,C,Operating System,Fork,Pipe,Inter Process Communicat,我试图实现一个程序,该程序在输入中接受一系列参数,并根据它创建由管道实现的相等数量的进程,其中每个进程写入管道,然后将其传递给父进程 这是我的代码,它不能满足我的需要 谢谢你的帮助 #include <stdio.h> #include <unistd.h> #include <sys/wait.h> #include <string.h> int main(int argc ,char *argv[]) { int i,pid; int
#include <stdio.h>
#include <unistd.h>
#include <sys/wait.h>
#include <string.h>
int main(int argc ,char *argv[])
{
int i,pid;
int fd[2];//crea i descriptor
char phrase[30][30];//crea il buffer
pipe(fd); /* crea la pipe */
// Genera i 10 processi
for(i=0;i<argc-1;i++)
{
if((pid=fork())==0)
{
strcpy(phrase[i], argv[i+1]);
printf("ho scritoo :'%s'\n",*phrase);
close(fd[0]); /* chiude in lettura */
write(fd[1],phrase,strlen(*phrase)+1); /* invia anche 0x00 */
close (fd[1]); // chiude in scrittura
// pid=0 -> figlio
usleep(50000*(1+i)); // Ritardo iniziale
printf("Figlio: %d\n",i+1); // Stampa messaggio del figlio
usleep(500000*(1+i)); // Ritardo finale
return(101+i); // Termina con codice di ritorno
}
else {
printf("Ho generato il figlio %d con pid %d\n",i+1,pid);
char message[100]; //creare il buffer
memset(message,0,100);
int bytesread;
close(fd[1]); /* chiude in scrittura */
bytesread = read(fd[0],message,sizeof(message));
printf("ho letto dalla pipe %d bytes: '%s' \n",bytesread,message);
close(fd[0]);
}
}
// Attende che dieci processi terminino
for(i=0;i<argc-1;i++)
{
int status;
wait(&status); // Attende termine di un figlio (uno qualunque)
printf("Terminato processo %d\n",WEXITSTATUS(status));
}
}
你有两个问题:
首先,您没有将正确的短语写入管道。你一直在写短语
。对于第一个子项,这是确定的,对于其他子项,它将是空字符串
其次,在创建第一个子项后,您将关闭fd[0]
。您将永远不会收到来自其他进程的数据
#include <stdio.h>
#include <unistd.h>
#include <sys/wait.h>
#include <string.h>
int main(int argc ,char *argv[])
{
int i,pid;
int fd[2];//crea i descriptor
char phrase[30][30];//crea il buffer
pipe(fd); /* crea la pipe */
for(i = 0; i < argc - 1 ; i++)
{
if((pid=fork())==0)
{
strcpy(phrase[i], argv[i+1]);
printf("ho scritoo :'%s'\n",phrase);
close(fd[0]); /* chiude in lettura */
write(fd[1],phrase[i],strlen(phrase[i])+1); /* invia anche 0x00 */
close (fd[1]); // chiude in scrittura
// pid=0 -> figlio
usleep(50000*(1+i)); // Ritardo iniziale
printf("Figlio: %d\n",i+1); // Stampa messaggio del figlio
usleep(500000*(1+i)); // Ritardo finale
return(101+i); // Termina con codice di ritorno
} else {
printf("Ho generato il figlio %d con pid %d\n",i+1,pid);
char message[100]; //creare il buffer
memset(message,0,100);
int bytesread;
bytesread = read(fd[0],message,sizeof(message));
printf("ho letto dalla pipe %d bytes: '%s' \n",bytesread,message);
// close(fd[0]);
}
}
close(fd[0]); /* chiude in scrittura */
close(fd[1]); /* chiude in scrittura */
// Attende che dieci processi terminino
for(i=0;i<argc-1;i++)
{
int status;
wait(&status); // Attende termine di un figlio (uno qualunque)
printf("Terminato processo %d\n",WEXITSTATUS(status));
}
return 0;
}
#包括
#包括
#包括
#包括
int main(int argc,char*argv[])
{
inti,pid;
int fd[2];//crea i描述符
字符短语[30][30];//crea il缓冲区
管道(fd);/*crea la管道*/
对于(i=0;ifiglio
usleep(50000*(1+i));//里塔多日化
printf(“菲利奥:%d\n”,i+1);//斯塔姆帕·梅萨吉奥·德尔·菲利奥
usleep(500000*(1+i));//里塔多大结局
return(101+i);//里托诺密码终端
}否则{
printf(“Ho generato il figlio%d con pid%d\n”,i+1,pid);
字符消息[100];//creare il缓冲区
memset(message,0100);
int字节读取;
bytesread=read(fd[0],message,sizeof(message));
printf(“ho letto dalla管道%d字节:'%s'\n',字节读取,消息);
//关闭(fd[0]);
}
}
关闭(fd[0]);/*斯克里图拉的chiude*/
关闭(fd[1]);/*斯克里图拉的chiude*/
//参加终点站的检查
对于(i=0;iIt不清楚您想做什么。您能解释更多吗?父进程必须在通信结束时收集并打印所有子进程输入。谢谢您:)我试图运行该程序,但没有正确完成,它卡在最后一个for循环中!我的意思是进程没有像以前那样结束。@AnisNouri修复了。这是for
语句的停止条件。它应该在此条件下停止I
#include <stdio.h>
#include <unistd.h>
#include <sys/wait.h>
#include <string.h>
int main(int argc ,char *argv[])
{
int i,pid;
int fd[2];//crea i descriptor
char phrase[30][30];//crea il buffer
pipe(fd); /* crea la pipe */
for(i = 0; i < argc - 1 ; i++)
{
if((pid=fork())==0)
{
strcpy(phrase[i], argv[i+1]);
printf("ho scritoo :'%s'\n",phrase);
close(fd[0]); /* chiude in lettura */
write(fd[1],phrase[i],strlen(phrase[i])+1); /* invia anche 0x00 */
close (fd[1]); // chiude in scrittura
// pid=0 -> figlio
usleep(50000*(1+i)); // Ritardo iniziale
printf("Figlio: %d\n",i+1); // Stampa messaggio del figlio
usleep(500000*(1+i)); // Ritardo finale
return(101+i); // Termina con codice di ritorno
} else {
printf("Ho generato il figlio %d con pid %d\n",i+1,pid);
char message[100]; //creare il buffer
memset(message,0,100);
int bytesread;
bytesread = read(fd[0],message,sizeof(message));
printf("ho letto dalla pipe %d bytes: '%s' \n",bytesread,message);
// close(fd[0]);
}
}
close(fd[0]); /* chiude in scrittura */
close(fd[1]); /* chiude in scrittura */
// Attende che dieci processi terminino
for(i=0;i<argc-1;i++)
{
int status;
wait(&status); // Attende termine di un figlio (uno qualunque)
printf("Terminato processo %d\n",WEXITSTATUS(status));
}
return 0;
}