分享

有名管道

 昵称4273156 2010-10-30
2、  有名管道
有名管道可用于两个无关的进程之间的通信。它的实现函数是:
int mkfifo(const char *filename, mode_t mode)
//创建一个名为filename的管道,模式可选为读或写方式,阻塞或非阻塞方式等。
下面一个实例演示了mkfifo的使用。Fifo_read.c不断从管道文件里读数据,fifo_write.c往管道文件里写数据。改变sleep的值也会产生类似上面进程同步的问题,而会发现一些缓冲区的特性。
两个程序用gcc编译后在两个终端里运行。
//---------------------------------------------------------------------------------------------------
//fifo_read.c
//创建有名管道,演示两个不相关的进程之间的通信
//int mkfifo(const char *filename, mode_t mode)
#include
#include
#include
#include
#include
#include
#include
#include
#define FIFO "/home/huang/myfifo"
int main(int argc,char **argv)
{
       int fd;
       int nread;
       char buf_r[100];
       if(mkfifo("/home/huang/myfifo",O_CREAT|O_EXCL)
       {
              perror("mkfifo:");
              printf("cann't create fifoserver\n");
              return -1;
       }
       printf("Preparing for reading bytes...\n");
       fd=open(FIFO,O_RDONLY|O_NONBLOCK,0);
       if(fd==-1)
       {
              perror("open!\n");
              exit(1);
       }
       while(1)
       {
              memset(buf_r,0,sizeof(buf_r));
              if((nread=read(fd,buf_r,sizeof(buf_r)))==-1)
              {
                     if(errno==EAGAIN)
                            printf("no data yet\n");
              }
              printf("read %s from FIFO\n",buf_r);
              sleep(1);
       }
       pause();
       unlink(FIFO);
}
//------------------------------------------------------------------------------------------------------------------
//fifo_write.c
//创建有名管道,演示两个不相关的进程之间的通信
//int mkfifo(const char *filename, mode_t mode)
#include
#include
#include
#include
#include
#include
#include
#include
#define FIFO "/home/huang/myfifo"
int main(int argc, char **argv)
{
       int fd;
       char w_buf[100];
       int nwrite;
       if(argc==1)
       {
              printf("please send some message\n");
              exit(1);   
       }
       fd=open(FIFO,O_WRONLY|O_NONBLOCK,0);
       if(fd==-1)
       {
              if(errno==ENXIO)
                     printf("open error;no reading process\n");
              perror("open:");
              return -1;
       }
       memset(w_buf,'a',sizeof(w_buf));
       printf("sizeof(w_buf)=%d\n",sizeof(w_buf));
       while(1)
       {
              if((nwrite=write(fd,w_buf,strlen(w_buf)))==-1)
              {
                     if(errno==EAGAIN)
                            printf("The FIFO has not been write yet.\n");
                     perror("write");
              //     else
                     //     printf("error in writting!\n");
              }
              else
                     printf("write %s to the FIFO\n",w_buf);
              sleep(2);
       }
       close(fd);
}

 

    本站是提供个人知识管理的网络存储空间,所有内容均由用户发布,不代表本站观点。请注意甄别内容中的联系方式、诱导购买等信息,谨防诈骗。如发现有害或侵权内容,请点击一键举报。
    转藏 分享 献花(0

    0条评论

    发表

    请遵守用户 评论公约

    类似文章 更多