进程间通信(管道)
管道
一端用于写,另外一端用于读
#include <stdlib.h>
#include <string.h>
#include <unistd.h>
#include <sys/types.h>
int main(void)
{
int result=-1;
int fd[2],nbytes;
pid_t pid;
char string[]="Hello Pipe";
char readbuffer[80];
int *write_fd=&fd[1]; // write
int *read_fd=&fd[0];// read
result=pipe(fd);// create pipe
if(-1==result)
{
printf("Create Pipe Error\n");
return -1;
}
pid=fork();
if(-1==pid)
{
printf("Fork Error");
return -1;
}
if(0==pid)
{
close(*read_fd);
result=write(*write_fd,string,strlen(string));
}
else
{
close(*write_fd);
nbytes=read(*read_fd,readbuffer,sizeof(readbuffer));
printf("number:%d,%s\n",nbytes,readbuffer);
}
return 0;
}
管道操作原子性
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <unistd.h>
#include <sys/types.h>
#define K 1024
#define WRITELEN (128*K)
int main(void)
{
int result=-1;
int fd[2],nbytes;
pid_t pid;
char string[WRITELEN]="Hello Pipe";
char readbuffer[10*K];
int *write_fd=&fd[1]; // write
int *read_fd=&fd[0];// read
result=pipe(fd);// create pipe
if(-1==result)
{
printf("Create Pipe Error\n");
return -1;
}
pid=fork();
if(-1==pid)
{
printf("Fork Error");
return -1;
}
if(0==pid)
{
int write_size=WRITELEN;
result=0;
close(*read_fd);
while(write_size>=0)
{
result=write(*write_fd,string,write_size);
if(result>0)
{
write_size-=result;
printf("write:%d,left:%d",result,write_size);
}
else
{
sleep(2);
}
}
return 0;
}
else
{
close(*write_fd);
while(1)
{
nbytes=read(*read_fd,readbuffer,sizeof(readbuffer));
if(nbytes<=0)
{
printf("No Data");
break;
}
printf("number:%d,content:%s\n",nbytes,readbuffer);
}
}
return 0;
}

浙公网安备 33010602011771号