精华内容
下载资源
问答
  • 有名管道的创建

    2013-05-13 08:58:55
    有名管道的创建与读写 创建有名管道有两种方式: 一是在 shell 下交互地建立一个有名管道,二是在程序中使用系统函数建立有名管道。shell 方式下可使用 mknod 或 mkfifo 命令,下面命令使用 mknod 创建了一个...

    有名管道的创建与读写

    创建有名管道有两种方式:
    一是在 shell 下交互地建立一个有名管道,二是在程序中使用系统函数建立有名管道。shell 方式下可使用 mknod 或 mkfifo 命令,下面命令使用 mknod 创建了一个有名管道:
    mknod namepipe
    创建有名管道的系统函数有两个:mknod() 和 mkfifo() 。两个函数均定义在头文件 sys/stat.h 中,函数原型如下:
    引用
    #include <sys/types.h>
    #include <sys/stat.h>

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

    函数 mknod() 参数中path 为创建的有名管道的全路径名;mod 为创建的有名管道的模式,指明其存取权限;dev 为设备值,该值取决于文件创建的种类,它只在创建设备文件时才会用到。这两个函数成功返回 0,失败则返回 -1。
    通过查看相关头文件,可以看到 mode_t 是 unsigned int  类型
    使用 mknod() 创建一个有名管道
    引用
    umask(0);
    if (mknod ("/tmp/fifo", S_IFIFO | 0666, 0== -1{
          perror("mknod error!");
          exit(1);
    }


    使用 mkfifo() 创建有名管道,mkfifo() 前两个参数的含义和 mknod() 相同
    引用
    umask(0);
    if (mkfifo ("/tmp/fifo", S_IFIFO | 0666, 0== -1{
          perror("mkfifo error!");
          exit(1);
    }


    “S_IFIFO | 0666" 指明创建一个有名管道且存取权限为 0666 ,即创建者、与创建者同组的用户、其他用户对该有名管道的访问权限都是可读可写。

    有名管道创建后就可以使用了,有名管道的和管道的使用方法基本相同。只是使用有名管道时,必须先调用 open() 将其打开,因为有名管道是一个存在硬盘上的文件,而管道是存在内存中的特殊文件。

    需要注意的是,调用 open() 打开有名管道的进程可能会被阻塞。但如果同时以读写方式 ( O_RDWR ) 打开,则一定不会导致阻塞;如果以只读方式 ( O_RDONLY ) 打开,则调用 open() 函数的进程将会被阻塞直到有写方打开管道;同样以写方式 ( O_WRONLY ) 打开也会阻塞直到有读方打开管道。
    展开全文
  • #include #include #include #include #include #if 1 //创建两个FIFO实现不同进程间的全双工通信 --实现自由通信 //有名管道的创建及读写extern int errno;//..............ser.c --服务端 int main() {
    #include<stdio.h>
    #include<unistd.h>
    #include<stdlib.h>
    #include<fcntl.h>
    #include<string.h>
    #if 1
    //创建两个FIFO实现不同进程间的全双工通信 --实现自由通信
    //有名管道的创建及读写extern int errno;
    
    //..............ser.c --服务端
    int main()
    {
        if(access("write_fifo",F_OK) == -1)
        {
            int res = mkfifo("write_fifo",0666);
            if(res == -1)
            {
                printf("errno = %d\n",errno);
                perror("mkfifo");
                exit(1);
            }
        }
     //printf("11111111111111111111111111\n");
             //服务端先进行写的操作 ,再进行读的操作
        int write_fd = open("write_fifo",O_WRONLY);  //以只写方式打开
        if(write_fd == -1)
        {
            perror("open write_fifo");//打开写管道失败
            exit(1);
        }
        int read_fd = open("read_fifo",O_RDONLY);
        if(read_fd == -1)
        {
            perror("open read_fifo"); //打开读管道失败
            //    unlink("read_fifo");
            exit(1);
        }
        char sendbuf[256];
        char recvbuf[256];
    
        pid_t pid1,pid2;
        int status;
        pid1=fork();//创建进程
        if(pid1 == -1)
        {
            printf("create fork error\n");
            exit(1);
        }
        else if(pid1 == 0)//子进程
        {
            while(1)
            {
                read(read_fd,recvbuf,256);
                printf("Cli:>%s\n",recvbuf);
            }
        }
        else if(pid1>0)
        {
            pid2 = fork();
            if(pid2 == -1)
            {
                printf("create fork2 erroe\n");
                exit(1);
            }
            if(pid2 == 0)
            {
                while(1)
                {
                    printf("Ser:>");
                    //if(read_fd == 0)
                    //    {
                    //        printf("\n");
                    //    }
                    // gets(sendbuf);
                    scanf("%s",sendbuf);
                    if(strcmp(sendbuf,"quit") == 0) //比较是否相等 相等就退出
                    {
                        close(write_fd);//文件描述符
                        unlink("write_fifo");//删除管道
                        break;
                    }
    
                    write(write_fd,sendbuf,strlen(sendbuf)+1);
                }
            }
            if(pid2 >0)
            {
                wait(&status);
            }
        }
        /*while(1)   //只能实现你说一句我说一句
          {
          printf("Ser:>");
          scanf("%s",sendbuf);
          write(write_fd,sendbuf,strlen(sendbuf)+1);
    
          read(read_fd,recvbuf,256);
          printf("Cli:>%s\n",recvbuf);
          }*/
        return 0;
    }
    
    //.........cli.c --客户端
    int main()
    {
        // 对文件是否存在以及文件权限进行检查,若不存在,进入access创建管道
        if(access("read_fifo",F_OK) == -1)
        {
            int res = mkfifo("read_fifo",0666);
            if(res == -1)
            {
                perror("mkfifo");
                exit(1);
            }
        }
            //客户端先进行读的操作 在进行写的操作
        int read_fd = open("write_fifo", O_RDONLY);
        if(read_fd == -1)
        {
            perror("open write_fifo");
            exit(1);
        }
        int write_fd = open("read_fifo",O_WRONLY);
        if(write_fd == -1)
        {
            perror("open read_fifo");
            unlink("read_fifo");
            exit(1);
        }
        int status;
        char  sendbuf[256];
        char  recvbuf[256];
        pid_t pid1,pid2;
        pid1=fork();
        if(pid1 == -1)
        {
            printf("create fork error\n");
            exit(1);
        }    
        else   if(pid1 == 0)
        {
            while(1)
            {
                read(read_fd,recvbuf,256);
                printf("Ser:>%s\n",recvbuf);
            }
        }
        else if(pid1 >0)
        {
            pid2 = fork();
            if(pid2 ==-1)
            {
                printf("create fork2 error\n");
                exit(1);
            }
            else if(pid2 == 0)
            {
                while(1)
                {
    
                    printf("Cli:>");
                    //        gets(sendbuf);
                    scanf("%s",sendbuf);
                    if(strcmp(sendbuf,"quit") == 0)
                    {
                        close(write_fd);
                        unlink("read_fifo");
                        break;
                    }
                    write(write_fd,sendbuf,strlen(sendbuf)+1);
                }
               }
            else if(pid2>0)
            {
                wait(&status);
            }
        }
        /*
           while(1)  //只能你说一句我说一句
           {
           read(read_fd,recvbuf,256);
           printf("Ser:>%s\n",recvbuf);
           printf("Cli:>");
           scanf("%s",sendbuf);
           write(write_fd,sendbuf,strlen(sendbuf)+1);
           }*/
        return  0;
    }
    #endif
    展开全文
  • 有名管道的创建与读写

    千次阅读 2011-09-27 10:47:23
    创建有名管道有两种方式: 一是在 shell 下交互地建立一个有名管道,二是在程序中使用系统函数建立有名管道。shell 方式下可使用 mknod 或 mkfifo 命令,下面命令使用 mknod 创建了一个有名管道: mknod...
    创建有名管道有两种方式:
    一是在 shell 下交互地建立一个有名管道,二是在程序中使用系统函数建立有名管道。shell 方式下可使用 mknod 或 mkfifo 命令,下面命令使用 mknod 创建了一个有名管道:
    mknod namepipe
    创建有名管道的系统函数有两个:mknod() 和 mkfifo() 。两个函数均定义在头文件 sys/stat.h 中,函数原型如下:
    引用
    #include <sys/types.h>
    #include <sys/stat.h>

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

    函数 mknod() 参数中path 为创建的有名管道的全路径名;mod 为创建的有名管道的模式,指明其存取权限;dev 为设备值,该值取决于文件创建的种类,它只在创建设备文件时才会用到。这两个函数成功返回 0,失败则返回 -1。
    通过查看相关头文件,可以看到 mode_t 是 unsigned int  类型
    使用 mknod() 创建一个有名管道
    引用
    umask(0);
    if (mknod ("/tmp/fifo", S_IFIFO | 0666, 0== -1{
          perror("mknod error!");
          exit(1);
    }


    使用 mkfifo() 创建有名管道,mkfifo() 前两个参数的含义和 mknod() 相同
    引用
    umask(0);
    if (mkfifo ("/tmp/fifo", S_IFIFO | 0666, 0== -1{
          perror("mkfifo error!");
          exit(1);
    }


    “S_IFIFO | 0666" 指明创建一个有名管道且存取权限为 0666 ,即创建者、与创建者同组的用户、其他用户对该有名管道的访问权限都是可读可写。

    有名管道创建后就可以使用了,有名管道的和管道的使用方法基本相同。只是使用有名管道时,必须先调用 open() 将其打开,因为有名管道是一个存在硬盘上的文件,而管道是存在内存中的特殊文件。

    需要注意的是,调用 open() 打开有名管道的进程可能会被阻塞。但如果同时以读写方式 ( O_RDWR ) 打开,则一定不会导致阻塞;如果以只读方式 ( O_RDONLY ) 打开,则调用 open() 函数的进程将会被阻塞直到有写方打开管道;同样以写方式 ( O_WRONLY ) 打开也会阻塞直到有读方打开管道。
    展开全文
  • 无名管道必须是线程之间有亲原关系,但是有名管道是则解决了这个问题,它是通过路经将其写段和读段联系起来。 //读段 1 #include  2 #include  3 #include  4 #include  5 #include  6  7 #define FIFO_...

    和无名管道的区别:

    文件描述符0代表标准输入文件,一般是键盘;文件描述符1代表标准输出文件,一般是指显示器;文件描述符2代表标准错误输出,一般是指显示器;

    无名管道必须是线程之间有亲原关系,但是有名管道是则解决了这个问题,它是通过路经将其写段和读段联系起来的。

    //读段

    1 #include<stdio.h>
      2 #include<sys/types.h>
      3 #include<unistd.h>
      4 #include<stdlib.h>
      5 #include<fcntl.h>
      6
      7 #define FIFO_NAME    "myfifo"
      8 #define BUF_SIZE      1024
      9 int main(void)
     10 {
     11     int fd;
     12     char buf[BUF_SIZE];
     13     umask(0);
     14     //打开管道的时候会阻塞,知道有写方代开管道。
     15     fd = open(FIFO_NAME,O_RDONLY);
     16     read(fd,buf,BUF_SIZE);
     17     close(fd);
     18     exit(0);
     19 }                                         

                                   
    //写段

               1 #include<stdio.h>
      2 #include<unistd.h>
      3 #include<stdlib.h>
      4 #include<fcntl.h>
      5 #include<string.h>
      6
      7 #define FIFO_NAME "myfifo"
      8 #define BUF_SIZE 1024
      9 int main(void)
     10 {
     11     int fd;
     12     char buf[BUF_SIZE]="hello write,i come from process named process!";
     13     int flag=0;
     14     //umask(0);和0666也就是~0&0666之后就是对文件的操作权限。
     15     umask(0);
     16     //mkfifo()相当于是用来创建管道的。
     17     if(mkfifo(FIFO_NAME,S_IFIFO | 0666) == -1)
     18     {
     19         perror("mkfifo error!");
     20         exit(1);
     21     }
     22     //打开管道的时候是会阻塞的直到有读放打开管道(阻塞的时候,是不会继续执行下面的代码的。)
     23     if(fd = open(FIFO_NAME,O_WRONLY) == -1)
     24     {
     25         perror("fopen error!");
     26         exit(1);
     27     }
     28     write(fd,buf,strlen(buf)+1);
     29     close(fd);
     30     exit(0);
     31 }                                                                                                     
    ~       


    展开全文
  • 文章目录1,有名管道的特点2,有名管道的创建mkfifo()3,有名管道读写---示例 1,有名管道的特点 对应管道文件,可用于任意进程之间进行通信:有名管道创建好之后,在系统中有实际的文件和有名管道对应,...
  • 有名管道

    2020-11-26 12:47:19
    文章目录有名管道的创建 有名管道的创建 方法1:用shell命令mkfifo创建有名管道 mkfifo 文件名 方法2:使用函数mkfifo #include <sys/types.h> #include <sys/stat.h> int mkfifo(const char *...
  • 创建有名管道

    2012-10-12 16:52:44
    有名管道fifo管道在文件系统中是可见的 ...mode 用来指定创建管道的读写执行权限,一般设置为mode_t mode = 0666;   利用命令行中一个参数来创建一个有名管道 #include #include #include #i
  • 头文件 #include <sys/types.h> #include <sys/stat.h> 函数声明 int mkfifo(const char *pathname, mode_t mode);...成功返回0,失败返回-1并设置errno ... ~umask)的有名管道文件 目的 解决没有血缘...
  • 有名管道的概念及创建及使用 1概念:它是一种文件类型,在文件系统中可以看到。程序中可以查看文件stat结构中st_mode成员的值来判断文件是否是FIFO文件。创建一个FIFO文件类似于创建文件,FIFO文件就像普通文件一样...
  • C语言有名管道fifo的创建及运用

    千次阅读 2013-08-03 20:03:56
    fifo.c用来创建有名管道fifo(最先编译) write.c用来向管道写入数据 read.c用来从管道读出数据 ================================================== //文件1:fifo.c #include #include #include #...
  • 主要思路:建立一个公共管道,所有与服务器建立连接先要通过这个管道相服务器发送消息,然后服务器以客户端前 4 个字符与特定字符拼接形成新的有名管道,与之交互.最后全部关闭 出现debug: Sever.c fork之后...
  • 有名管道为什么叫“有名管道”有名管道特点能够用于非亲缘进程之间的通信进入阻塞读端口被关闭的处理有名管道的使用步骤有名管道APIAPI说明有名管道实现进程的单向通信代码演示小结:图解分析 有名管道 为什么叫...
  • 创建两个有名管道来实现不同进程间全双工通信。 两个进程聊天程序:一个server端,一个client端。 例子用到了read函数: read函数只是一个通用读文件设备接口。是否阻塞需要由设备属性和设定所决定。...
  • 有名管道的通信

    2017-03-25 17:31:04
    创建有名管道的进程叫做服务器进程,存取管道的其他进程叫做客户进程。通信双方必须首先创建有名管道后,才能打开管道进行读写。当文件不再需要时,要显示删除。 进程间使用有名管道实现通信时,必须有三次同步。 第...
  • 1、创建管道的时候,使用的函数:int mkfifo(const char *pathname, mode_t mode); 2、删除管道的时候,使用的函数:int unlink(const char *path); 3、这两个函数的返回值,如果是-1,说明失败。 步骤: 1、...
  • 创建一个有名管道,解决无血缘关系的进程之间的通信; 创建管道的函数 #include #include int mkfifo(const char *pathname, mode_t mode); 首先创建一个有名管道myfifo 命令是: mkfifo myfifo 也可以直接...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 792
精华内容 316
关键字:

有名管道的创建