在我学习无名管道的过程中,进行了多个进程的创建。实现了两个进程写,一个进程读。接下来我会展示我的代码和要注意的事项
#include <stdio.h>
#include <sys/types.h>
#include <unistd.h>
#include <string.h>
int main()
{
pid_t pid;
int pfd[2];
int ret;
int i;
char buf[40];
ret=pipe(pfd);
if(ret==-1)
{
printf("pipe is error");
return -1;
}
for(i=0;i<2;i++)
{
pid=fork();
if(pid<0)
{
perror("pid");
return -1;
}
if(pid==0)
{
break;
}
}
if(i==2)
{
close(pfd[1]);
while(1)
{
memset(buf,0,sizeof(buf));
ret=read(pfd[0],buf,sizeof(buf));
if(ret==-1)
{
printf("read is error");
return -1;
}
printf("%s\n",buf);
}
}
if(i==1)
{
close(pfd[0]);
while(1)
{
strcpy(buf,"this is two");
ret=write(pfd[1],buf,strlen(buf));
if(ret==-1)
{
return -1;
}
sleep(1);
}
}
if(i==0)
{
close(pfd[0]);
while(1)
{
strcpy(buf,"this is one");
ret=write(pfd[1],buf,strlen(buf));
if(ret==-1)
{
return -1;
}
usleep(930000);
}
}
return 0;
}
以下是实验现象:
以下的值得注意的几点:
1.每次读之前都要记得将buf数组清零,否则会出现乱码
2.要注意两个进程读的时机,最好是一个写线程休眠的时间稍微多余另外一个写线程的时间。(为了防止线程读的时候造成两组字符串都连续读到了)
3.最为重要的是创建子进程的时候要注意不要让子进程创建子进程,否则会出现很多没有必要的进程
4.此处巧妙的地方在于利用i变量进行进程的分别