离弦之Ray

  BlogJava :: 首页 :: 联系 :: 聚合  :: 管理
  55 Posts :: 0 Stories :: 33 Comments :: 0 Trackbacks

父进程和子进程创建双向管道的实际步骤

创建管道 1(fd1[0] fd1[1]) 和管道 2(fd2[0] fd2[1])

Fork

父进程关闭管道 1 的读出端( fd1[0]) [MS1]  

父进程关闭管道 2 的写入端( fd2[1]

子进程关闭管道 1 的写入端( fd1[1]

子进程关闭管道 2 的读出端( fd2[0]


下面是示例程序:

#include “unpipe.h”

void client(int, int) ,server(int, int);

int main(int argc, char* argv[])

{

       int pipe1[2],pipe[2];

pid_t childpid;

Pipe(pipe1);

Pipe(pipe2);

 

if((childpid=fork())==0)

{

       Close(pipe1[1]) ;

       Close(pipe2[0]) ;

 

       server(pipe1[0],pipe2[1]) ;

       exit(0) ;

}

close(pipe1[0]) ;

close(pipe2[1]) ;

client(pipe2[0],pipe1[1]) ;

 

waitpid(childpid,NULL,0) ;

exit(0) ;

}

//////////////////client

void client(int readfd, int writefd)

{

       size_t len;

ssize_t n;

char  buff[MAXLINE];

 

fgets(buff,MAXLINET,stdin);

len = strlen(buff);

if(buff[len-1]==’\n’)

       len--;

write(writefd,buff,len);

while((n=read(readfd,buff,MAXLINE))>0)

        write(STDOUT_FILENO,buff,n);

}

///////////////////server

void server(int readfd, int writefd)

{

       int fd;

       ssize_t n;

       char buff[MAXLINE+1];

 

       if((n=read(readfd,buff,MAXLINE))==0)

          err_quit(“end-of –file while reading pathname”);

       if((fd =open(buff,O_RDONLY)<0)){

sprintf(buff+n,sizeof(buff)-n,”can’t open, %s\n”,strerror(errno));

n = strlen(buff);

write(writefd,buff,n);

}else{

 While((n=read(fd,buff,MAXLINE))>0)

        Write(writefd,buff,n);

Close(fd);

}

}


Properties of Pipe:

1) Pipes do not have a name. For this reason, the processes must share a parent process. This is the main drawback to pipes. However, pipes are treated as file descriptors, so the pipes remain open even after fork and exec.

2) Pipes do not distinguish between messages; they just read a fixed number of bytes. New line (\n) can be used to separate messages. A structure with a length field can be used for message containing binary data.

3) Pipes can also be used to get the output of a command or to provide input to a command


 [MS1] 换句话说就是父进程对管道 1 只能写,以下可以依此类推。

posted on 2006-06-14 20:14 离弦之ray的技术天空 阅读(248) 评论(0)  编辑  收藏 所属分类: Linux&C

只有注册用户登录后才能发表评论。


网站导航: