IPC进程间的通信——无名管道命名管道

引言

IPC——进程间的通信
单机版的通信方式:1、半双工管道 FIFO
							  2、全双工管道 命名全双工管道
							  3、消息队列
							  4、信号量
							  5、共享内存
多机的通讯方式:	  套接字(如基于网络的)							  

IPC介绍

IPC的方式通常有管道(包括无名管道和命名管道)、消息队列、信号量、共享存储、Socket、Streams等。其中Socket和Streams支持不同主机上的两个进程IPC。
  1. 管道的特点
    为半双工的(即数据只能在一个方向上流动),具有固定的读端和写端。
    只能用于父子进程或兄弟进程。
    在建立管道的适时候(建立在内存中的) 当父子进程退出的时候,这个管道就消失了,不会在磁盘中存在

  2. 程序

#include 
#include 
#include 
#include 
//       int pipe(int pipefd[2]);

int main()
{
        int fd[2];
        int pid;
        char buf[128];
        if(pipe(fd)==-1)								//返回-1,管道创建失败。pipe参数为fd。
        {
                printf("creat pipe failed\n");
                perror("why");
        }
        pid=fork();

        if(pid<0)
        {
                printf("creat fork failed\n");
        }else if(pid>0)						
        {
                sleep(3);							//父进程睡3秒,让子进程先运行。子进程没读到数据,便会阻塞在read,等父进程睡完后,便会给子进程发数据,当管道内有数据后,子进程的read便不会阻塞。
                printf("this is father\n");
                close(fd[0]);						//父进程关闭读 (fd(0)为读而打开)。
                write(fd[1],"hello from father",strlen("hello from father"));		//父进程写内容给fd(1),fd(1)为写而打开
                wait();

        }else if(pid==0)
        {
                printf("this is child\n");
                close(fd[1]);						//子进程关闭写
                read(fd[0],buf,sizeof(buf));		//子进程读fd(0)的内容给buf。
                printf("read from fathe: %s\n",buf);
                exit(0);							//子进程退出,父进程等待
        }


        return 0;
}

FIFO

  1. 特点
    可以在无关的进程间(非亲缘)交换数据,与无名管道不同。
    有路径名,它是以一种特殊的设备文件形式存在于文件系统中。

  2. 程序代码
    read部分
    当open一个FIFO时,没有指定O_NONBLOCK(默认),只读open要阻塞到某个其他进程为写而打开此FIFO,类似的只写也是。(因此需要创建一个读的程序打开FIFO)
    若指定了O_NONBLOCK,则只读open立即返回,而只写open将出错返回-1
    ,如果没有进程已经为读而打开该FIFO,其errno置ENXIO。

#include 
#include 
#include 
#include 
#include 
#include 
#include 

int main()
{
        int fd;
        int nread;
        char buf[128]={0};
//      int mkfifo(const char *pathname, mode_t mode);
        if(mkfifo("./file",0600)==-1&&errno!=EEXIST)    //mkfifo返回-1为error,EEXIST为管道存在时返回的值,此句创建管道并当管道已存在时不再报错。 
        {
                printf("MKFIFO FAILED!\n");
                perror("why");
        }

        fd=open("./file",O_RDONLY);     //以只读非阻塞的方式打开管道
        printf("open success!\n");

        while(1)
        {
                memset(buf,0,sizeof(buf));
                nread=read(fd,buf,sizeof(buf)); //从fd读到buf里。
                printf("read %d byte,content :%s\n",nread,buf);
                if(nread==0)
                {
                        printf("Quit!\n");
                        exit(-1);
                }
        }
        close(fd);      //记得要close文件
        return 0;
}

  1. 程序代码
    write部分
#include 
#include 
#include 
#include 
#include 
#include 
int main()
{
        int fd;
        char *mes="message from write!";
        fd=open("./file",O_WRONLY);		//以只读的方式打开管道
        while(1)
        {
                write(fd,mes,strlen(mes));
                sleep(1);
        }
        close(fd);
        return 0;
}

你可能感兴趣的:(IPC进程间的通信——无名管道命名管道)