精华内容
下载资源
问答
  • 创建一个有名管道,解决无血缘关系的进程之间的通信; 创建管道的函数 #include #include int mkfifo(const char *pathname, mode_t mode); 首先创建一个有名管道myfifo 命令是: mkfifo myfifo 也可以直接...

    创建一个有名管道,解决无血缘关系的进程之间的通信;

    创建管道的函数

    #include <sys/types.h>
    #include <sys/stat.h>
    int mkfifo(const char *pathname, mode_t mode);

    首先创建一个有名管道myfifo   命令是: mkfifo myfifo

    也可以直接使用上边的函数直接在代码中实现管道。


    然后分别创建两个“.c”文件,fifo_w.c  fifo_r.c 

    fifo_w.c 
    #include <stdio.h>#include <stdlib.h>#include <unistd.h>
    #include <sys/stat.h>#include <fcntl.h>#include <string.h>
    void sys_err(char *str, int exitno)
    {
    	perror(str);
    	exit(exitno);
    }
    int main(int argc, char *argv[])
    {
    	int fd;
    	char buf[1024] = "hello xuxing\n";
    	if (argc < 2) {
    		printf("./a.out filename\n");
    		exit(1);
    	}
    	//fd = open(argv[1], O_RDONLY);
    	fd = open(argv[1], O_WRONLY);
    	if (fd < 0) {
    		sys_err("open", 1);
    	}
    	write(fd, buf, strlen(buf));
    	close(fd);
    	return 0;
    }
    

    fifo_r.c 
    #include <stdio.h>#include <stdlib.h>#include <unistd.h>
    #include <sys/stat.h>#include <fcntl.h>#include <string.h>#include <sys/types.h>
    void sys_err(char *str, int exitno)
    {
    	perror(str);
    	exit(exitno);
    }
    int main(int argc, char *argv[])
    {
    	int fd, len;
    	char buf[1024];
    
    	if (argc < 2) {
    		printf("./a.out filename\n");
    		exit(1);
    	}
    	fd = open(argv[1], O_RDONLY);
    	//fd = open(argv[1], O_WRONLY);
    	if (fd < 0) {
    
    		sys_err("open", 1);
    	}
    	len = read(fd, buf, sizeof(buf)); //读文件
    	write(STDOUT_FILENO, buf, len);   //打印读取的内容
    	close(fd);
    
    	return 0;
    }


    运行结果:

     



    创建的有名管道缓存的内容是不会存在磁盘中的。他只是在内核中的缓存中。







    展开全文
  • linux ipc 有名管道

    2020-08-27 11:06:42
    1、有名管道linux系统下的一种ipc通信机制。 2、命名管道也被称为FIFO文件,是一种特殊的文件。 作用 1、有名管道是相对于无名管道而产生的,我们知道无名管道只能亲信进程间可以使用,而有名管道在互不相干...

    介绍

       1、有名管道是linux系统下的一种ipc通信机制。
    
       2、命名管道也被称为FIFO文件,是一种特殊的文件。
    

    作用

      1、有名管道是相对于无名管道而产生的,我们知道无名管道只能亲信进程间可以使用,而有名管道在互不相干的两个进程之间可以实现数据交换。
    

    关键方法

     int mkfifo(const char *filename, mode_t  mode)
     
     参数:filename 有名管道文件名(包括路径);mode 权限(读写0666)
     
     注意点:
       
        以O_WRONLY打开管道,读阻塞
       
        以O_RDWR打开管道,当管道中没有数据,读阻塞
       
       //当进程用open打开有名管道用只读方式打开的话,则返回的文件描述符就代表管道的读端
    

    用列

    读取输入写入有名管道中

    #include <stdio.h>
    #include <stdlib.h>
    #include <sys/types.h>
    #include <sys/stat.h>
    #include <sys/types.h>
    #include <sys/stat.h>
    #include <fcntl.h>
    #include <errno.h>
    #include <unistd.h>
    int main(int argc, const char *argv[])
    {
        char buf[50] = {0};
        if(mkfifo("./nameFifo",0777) != 0 ) //创建有名管道
        {
            if(errno == EEXIST)
            {
                printf("File exists\n");
            }
            else
            {
                perror("mkfifo fail ");
                exit(1);
            }
        }
    
        int fd_fifo;
        fd_fifo = open("./nameFifo",O_WRONLY);//只写方式打开,管道描述符
        if(fd_fifo < 0)
        {
            perror("open fifo fail: ");
            exit(1);
        }
    
        int c ,rc;
        while((c = getchar()) > 0)
        {
            rc = write(fd_fifo, &c, 1);
            if(rc == -1)
            {
                printf("write error\n");
                close(fd_fifo);//关掉写
                exit(1);
            }
        }
        close(fd_fifo);
        return 0;
    }
    
    

    读取有名管道写入输出中

    /* 功能:实现在有名管道中读取数据,写到文件中
     * */
    #include <stdio.h>
    #include <stdlib.h>
    #include <sys/types.h>
    #include <sys/stat.h>
    #include <sys/types.h>
    #include <sys/stat.h>
    #include <fcntl.h>
    #include <errno.h>
    #include <unistd.h>
    #include <string.h>
    
    int main(int argc, const char *argv[])
    {
        char buf[20];
        memset(buf,0,sizeof(buf)*20);
        if(mkfifo("./nameFifo",0777) != 0 ) //创建有名管道
        {
            if(errno == EEXIST) //有名管道存在的情况
            {
                printf("File exists\n");
            }
            else
            {
                perror("mkfifo fail ");
                exit(1);
            }
        }
        
        int fd_fifo;  //此处fd_r是指有名管道,在有名管道中读取数据,写到文件中
    
        fd_fifo = open("./nameFifo",O_RDONLY);//读方式打开
        if(fd_fifo < 0)
        {
            perror("open fifo fail: ");
            exit(1);
        }
    
        //fifo 中循环读取数据,然后写到文件中
        int rc;
        while(1)
        {
            rc = read(fd_fifo,buf,20); //读有名管道内容,返回读取多少个数据
            if (rc <= 0 ) {
                close(fd_fifo);//关掉写
                exit(1);
            }
            printf("read context : %s", buf);
            memset(buf,0,sizeof(buf)*20);
    
        }
        close(fd_fifo);
        return 0;
    }
    

    执行结果
    在这里插入图片描述

    展开全文
  • Linux之在命令行下创建有名管道FIFO

    千次阅读 2019-07-06 08:58:16
    命令行下创建有名管道myfifo,ls –l查看,分别在两个终端运行cat < myfifo 和echo hello > myfifo分析执行情况,将cat在后台运行,echo在前台运行,执行情况如何?分析FIFO的打开规则。 先让我们来创建一个...

    命令行下创建有名管道myfifo,ls –l查看,分别在两个终端运行cat < myfifo 和echo hello > myfifo分析执行情况,将cat在后台运行,echo在前台运行,执行情况如何?分析FIFO的打开规则。

    先让我们来创建一个命名管道named_FIFO,并用ls -l命令查看是否创建成功.

     

    分别在两个终端运行cat < named_FIFO 和echo hello > named_FIFO.

    此时如果继续向命名管道发送数据,则前台进程会阻塞.

    展开全文
  • Linux有名管道

    2013-11-09 20:44:30
    Linux有名管道  从linux中管道的创建过程我们可以看出,管道只可以在父子或者有血缘关系的 进程中进行通信,因为其以无名文件的形式存在文件系统中。为了克服这个问题,Linux 中发展了有名管道(FIFOS).有名...

    Linux的有名管道

            从linux中管道的创建过程我们可以看出,管道只可以在父子或者有血缘关系的
    进程中进行通信,因为其以无名文件的形式存在文件系统中。为了克服这个问题,Linux
    中发展了有名管道(FIFOS).有名管道以一种特殊的文件设备存在,这样它既有了
    管道的功能,同时又有了文件的特点,这样我们就可以通过像操作普通文件那样去操作
    管道,从而实现了非父子关系的进程间的通信。
          在linux中我们通过mknod进行创建有名管道:
    mknod(char *pathname,mode_t mode,devt dev).
    有名管道创建后,我们就可以像操作文件那样,使用fopen打开管道,然后读写。

    有名管道注意事项:
    1:有名管道必须同时有读写两个进程。如果一个进程试图向一个没有读入端的有名管道写数据
    一个SIGPIPE信号就会产生。
    2:管道的独立性。所谓的独立性是指这个操作不会被打断。比如如果管道的最大buf是512,那么
    在一次读写的时候是不会被打断的,那么如果大于512,则会被分为多次,这样读写就可能会被打断
    中间就可能被插入其他进程的数据,从而造成混乱。这个要特别注意。

    展开全文
  • int mkfifo(const char *pathname, mode_t mode);int mknod(const char *pathname, mode_t mode, ...在有名管道(named pipe或FIFO)提出来之后,该限制得到了克服。FIFO不同于管道之处在于它提供一个路径与之关联,以...
  • 文章目录1,有名管道的特点2,有名管道创建mkfifo()3,有名管道读写---示例 1,有名管道的特点 对应管道文件,可用于任意进程之间进行通信:有名管道创建好之后,在系统中有实际的文件和有名管道对应,...
  • linux fifo 有名管道

    千次阅读 2013-08-11 22:42:56
    1、创建有名管道 mkfifo int mkfifo(const char *filename,mode_t mode)  filename:要创建的管道  mode: O_RDONLY:读管道  O_WRONLY:写管道  O_RDWR:读写管道  O_NONBLOCK:非阻塞  O_CREAT:如果该...
  • 管道创建以后会产生两个文件描述符,一个是读端,另一个是写端;管道里的数据只能从写端被写入,从读端被读出;1.2 管道原理管道是内核的一块缓冲区,更具体一些,是一个环形队列。数据从队列的一端写入数据...
  • linux有名管道

    2017-08-07 08:21:00
    有名管道1、查看命令:man 3 mkfifo 2、头文件:#include <sys/types.h> #include <sys/stat.h> 3、函数原型:int mkfifo(const char *pathname, mode_t mode);a、*pathname:有名管道的名字 例如:/...
  • linux有名管道

    2019-08-03 19:42:13
    正由于这无名管道的缺点,对无名管道进行改进:有名管道。 所谓的有名,即文件系统中存在这个一样文件节点,每一个文件节点都有一个inode号 而且这是一个特殊的文件类型:p管道类型。 创建这个文件节点,不可以...
  • 1.进程间的通信方式有五种,分别为:管道,信号量,共享内存,消息队列和套接字.本次主要介绍管道. 2.管道分为有名管道和无名管道两种,它们的区别是: 有名管道又...6.mkfifo fifo:创建有名管道文件fifo; pipe():创建无名管道
  • 该楼层疑似违规已被系统折叠隐藏此楼查看此楼linux有名管道通信实验分享到:本文关键字: 有名管道...实验内容 这里采用管道函数创建有名管道(并不是在控制台下输入命令),而且使用select()函数替代poll()函数实现多...
  • linux有名管道的使用

    千次阅读 2016-10-25 16:25:22
    有名管道又称为FIFO,是进程间通信的一种方式。FIFO具有以下特点:  1.全双工的通信模式,数据先进先出;  2.可以用于任意的进程之间,通过指定相同的管道文件进行通信;  3.文件名存在文件系统中,而管道中的...
  • #include <stdio.h> #include "stdlib.h" #include "unistd.h" int main() { int fd[2]; if (pipe(fd) < 0) { perror("Fail to create pipe");... * create child process (Linux): * .
  • Linux 有名管道

    2018-03-30 19:59:37
    1.进程间通信一般有六种方式:信号、管道、信号量、消息队列、共享内 存、套接字。 2.管道的产生原因 ... 为了解决管道不能提供非父/子关系进程间通信的缺陷,在管道的基础上发展了有名管 道...而有名管道在Li
  • linux无名管道和有名管道
  • 有名管道:可以在任意进程之间传输。 mkfifo() 函数 头文件 #include<sys/types.h> #include<sys/state.h> 函数原型 filename就是有名管道的名字,mode表示rwx权限 int mkfifo(const char *filename,...
  • linux C++ 有名管道

    2014-07-17 10:08:13
    匿名管道呢,只能使用在有亲缘关系的进程之间,比如父子进程个兄弟进程,等等,但是对于
  • 实验内容这里采用管道函数创建有名管道(不是在控制台下输入命令mknod),而且使用select()函数替代poll()函数实现多路复用。如果对管道通信的知识忘了的话,请...
  • 1、创建管道的时候,使用的函数:int mkfifo(const char *pathname, mode_t mode); 2、删除管道的时候,使用的函数:int unlink(const char *path); 3、这两个函数的返回值,如果是-1,说明失败。 步骤: 1、...
  • 头文件 #include <sys/types.h> #include <sys/stat.h> 函数声明 int mkfifo(const char *pathname, mode_t mode);...成功返回0,失败返回-1并设置errno ... ~umask)的有名管道文件 目的 解决没有血缘...
  • 创建有名管道,并在两个控制台窗口中使用管道进行通信。 步骤: 1、创建管道,并查看管道信息: [negivup@negivup mycode]$ mkfifo fifo 这是创建管道的命令 [negivup@negivup mycode]$ ls -l
  • linux有名管道学习

    2014-06-07 22:41:59
    server: #include #include #include #include #include #include #include #define FIFO_SERVER "/home/addia/myfifo" main(int argc,char** argv) { int fd; char w_buf[100];... /*打开管道
  • 有名管道(FIFO)首先将上一节的有关有名管道的定义再贴出来有名管道是对无名管道的一种改进,它具有以下特点:① 它可以使互不相关的两个进程间实现彼此通信;② 该管道可以通过路径名来指出,并且在文件系统中是可见...
  • Linux: 是一套免费使用和自由传播的类Unix操作系统,是一个基于POSIX和UNIX的多用户、多任务、支持多线程和多CPU的操作系统。它能运行主要的UNIX工具软件、应用程序和网络协议。它支持32位和64位硬件。Linux继承了...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 8,847
精华内容 3,538
关键字:

linux创建有名管道

linux 订阅