应用程序开发-进程通信-管道

 管道包括有名管道和无名管道。单向的、先进先出的,它把一个进程的输入和另一个进程的输入连接在一起。

一个进程在管道的尾部写入数据,另一个进程从管道的头部读数据。

无名管道用于在父子进程间的通信。

有名管道用于运行于同一系统中的任意两个进程间的通信。

无名管道

无名管道创建函数

int pipe(int filedis[2]);

filedis[0]文件描述符用于读管道, filedis[1]用于写管道。

 

创建和关闭管道的例子:

int main()

{

    int pippe_fd[2];

    if (pipe(pipe_fd) < 0)

    {

    return -1

    }

    else

    {

    printf("create pipe success\n");

    }

    close(pipe_fd[0]);

    close(pipe_fd[1]);

}

 

管道读写:管道用于不同进程间的通信。通常先创建一个管道(必须要在fork前创建好管道),再fork创建一个子进程,该子进程会继承父进程所创建的管道。

实例如下:

#include <unistd.h>

#include <sys/types.h>

#include <errno.h>

#include <stdio.h>

#include <stdlib.h>

 

int main()

{

int pipe_fd[2];

pid_t pid;

char buf_r[100];

char* p_wbuf;

int r_num;

memset(buf_r,0,sizeof(buf_r));

/*创建管道*/

if(pipe(pipe_fd)<0)

{

printf("pipe create error\n");

return -1;

}

/*创建子进程*/

if((pid=fork())==0)  //子进程 OR 父进程?

{

printf("\n");

close(pipe_fd[1]);

sleep(2); /*为什么要睡眠*/

if((r_num=read(pipe_fd[0],buf_r,100))>0)

{

printf(   "%d numbers read from the pipe is %s\n",r_num,buf_r);

}

close(pipe_fd[0]);

exit(0);

   }

else if(pid>0)

{

close(pipe_fd[0]);

if(write(pipe_fd[1],"Hello",5)!=-1)

printf("parent write1 Hello!\n");

if(write(pipe_fd[1]," Pipe",5)!=-1)

printf("parent write2 Pipe!\n");

close(pipe_fd[1]);

sleep(3);

waitpid(pid,NULL,0); /*等待子进程结束*/

exit(0);

}

return 0;

}

 

有名管道(FIFO)

int mkfifo(const char *pathname, mode_t mode);

 

例子:

#include <sys/types.h>

#include <sys/stat.h>

#include <errno.h>

#include <fcntl.h>

#include <stdio.h>

#include <stdlib.h>

#include <string.h>

#define FIFO_SERVER "/tmp/myfifo"

 

main(int argc,char** argv)

{

int fd;

char w_buf[100];

int nwrite;

/*打开管道*/

fd=open(FIFO_SERVER,O_WRONLY|O_NONBLOCK,0);

if(argc==1)

{

printf("Please send something\n");

exit(-1);

}

strcpy(w_buf,argv[1]);

/* 向管道写入数据 */

if((nwrite=write(fd,w_buf,100))==-1)

{

if(errno==EAGAIN)

printf("The FIFO has not been read yet.Please try later\n");

}

else 

printf("write %s to the FIFO\n",w_buf);

}

 

 

#include <sys/types.h>

#include <sys/stat.h>

#include <errno.h>

#include <fcntl.h>

#include <stdio.h>

#include <stdlib.h>

#include <string.h>

#define FIFO "/tmp/myfifo"

 

main(int argc,char** argv)

{

char buf_r[100];

int  fd;

int  nread;

/* 创建管道 */

if((mkfifo(FIFO,O_CREAT|O_EXCL)<0)&&(errno!=EEXIST))

printf("cannot create fifoserver\n");

printf("Preparing for reading bytes...\n");

memset(buf_r,0,sizeof(buf_r));

/* 打开管道 */

fd=open(FIFO,O_RDONLY|O_NONBLOCK,0);

if(fd==-1)

{

perror("open");

exit(1);

}

while(1)

{

memset(buf_r,0,sizeof(buf_r));

if((nread=read(fd,buf_r,100))==-1)

{

if(errno==EAGAIN)

printf("no data yet\n");

}

printf("read %s from FIFO\n",buf_r);

sleep(1);

}

pause(); /*暂停,等待信号*/

unlink(FIFO); //删除文件

}

 

 

你可能感兴趣的:(开发,通信,进程,管道,应用程序)