进程间通信(管道)

管道

一端用于写,另外一端用于读

#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;
}

  

 

posted @ 2014-01-14 23:27  bradleydan  阅读(146)  评论(0)    收藏  举报