unix管道的意思是什么

来自:    更新日期:早些时候
~ 管道是UNIX系统最古老的IPC形式。
它有以下两点局限性:数据只能单向流动只能在具有公共祖先的两个进程间使用。通常是父进程通过系统调用pipe()创建管道,然后fork()出子进程,这两个进程就可以通过管道进行通信了。术语定义管道fd:一条管道有两个文件描述符,这两个文件描述符是在调用pipe(fd)创建管道时获取获取的。fd[0]:通过该文件描述符可以从管道中读取数据fd:通过该文件描述符可以向管道写入数据写端进程:只向管道写数据的进程。在使用管道时,先close(fd[0])、再通过write(fd)向管道写数据。读端进程:只从管道读数据的进程。在使用管道时,先close(fd)、在通过read(fd[0])从管道读取数据。代码示例下列代码在linux环境下,粘贴到本地后可以直接编译运行。#include <unistd.h> //declare int pipe(int pipefd);#include <limits.h> //PIPE_BUF#include <stdio.h>#include <sys/wait.h>#include <string.h>#define MSG_FROM_PARENT "Hello, world!"int fd = {0}; //存储管道的两个文件描述符,fd[0] for read, fd for writeint main(int argc, char **argv){int pid = 0;// #define PIPE_BUF4096 printf("PIPE_BUF:[%d]\", PIPE_BUF);if (0 != pipe(fd)){ perror("pipe"); return -1;}pid = fork();if (pid < 0) // fork error{ perror("fork"); return -1;}else if (pid > 0) // branch of parent{ close(fd[0]);// parent close read if (write(fd, MSG_FROM_PARENT, sizeof(MSG_FROM_PARENT)) < 0) { perror("write"); close(fd); return -1; } close(fd); //建议注释掉这行代码,运行查看下效果。有惊喜哟。你会发现printf()中\有将缓冲区刷新的效果 if (waitpid(pid, NULL, 0) < 0) { perror("waitpid"); return -1; } printf("parent exit\");}else // branch of son{ close(fd); char read_buf = {0}; // 故意把buf设的小一点,这样可以多次读取管道,观察更多细节 int readlen = 0; do{ memset(read_buf, 0, sizeof(read_buf)); perror("before read"); readlen = read(fd[0], read_buf, sizeof(read_buf) - 1); if (readlen < 0) {perror("read");close(fd[0]);return -1; } perror("after read"); printf("%s", read_buf); // printf()的fmt如果加上'\',其效果可不只是换行哟。//'\'其实还有fflush(stdout)的作用:将printf缓冲区的数据刷新到stdout(即屏幕)上。 }while (readlen > 0); close(fd[0]); printf("\son exit\");}return 0;}12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182831234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283重点总结如果pipe的一端被关闭 ,以下两条规则将生效:如果写端关闭,那么读端将管道中的数据全部读完后,如果再次调用read,将会返回0。换言之,如果写端进程写完数据后没有关闭pipe的写端文件描述符,那么读端进程在读取一个不再有数据可读的管道时会阻塞。如果读端关闭,那么写端write时,将会产生信号SIGPIPE,如果该信号未被处理,write将返回-1,且errno被置为EPIPE。关于linux信号处理,有时间单写一篇博客总结一下。这里只需要注意,向一个读端关闭的管道写数据,write会返回-1;如果读端没有关闭,但是管道的数据一直没有被读端进程读走,那么当管道中缓存数据达到PIPE_BUF规定的上限时(本示例中打印出的上限是4096 bytes),write会阻塞!以上两条规则告诉我们,不管是读端进程还是写端进程,用完了管道都要记得关闭啊!否则对端进程再次读写管道时会阻塞的!好严重的!


unix管道的意思是什么视频

相关评论:
  • 15996695890unix管道的意思是什么
    卢眨露管道是UNIX系统最古老的IPC形式。它有以下两点局限性:数据只能单向流动只能在具有公共祖先的两个进程间使用。通常是父进程通过系统调用pipe()创建管道,然后fork()出子进程,这两个进程就可以通过管道进行通信了。术语定义管道fd:一条管道有两个文件描述符,这两个文件描述符是在调用pipe(fd)创建管道时...

  • 15996695890unix系统中,哪些可以用于进程间的通信?
    卢眨露一、管道(Pipe):管道可用于具有亲缘关系进程间的通信,允许一个进程和另一个与它有共同祖先的进程之间进行通信。二、命名管道(named pipe):命名管道克服了管道没有名字的限制,因此,除具有管道所具有的功能外,它还允许无亲缘关系进程间的通信。命名管道在文件系统中有对应的文件名。命名管道通过...

  • 15996695890消息队列,信号机制,管道之间的区别?
    卢眨露管道:低级的通信机制,消息队列比管道高级多了,管道分PIPE和FIFO,PIPE是无名的,所以只能在进程内或父子进程间通信,FIFO可任何两个进程间通信了。不过这两个依然比较低级,完成高级的应用服务器还需要消息队列等。扩充:早期unix只有PIPE、FIFO、信号,后来开发了消息队列、信号量、共享内存。希望能帮到...

  • 15996695890进程间通信的主要分类
    卢眨露进程间通信主要包括管道, 系统IPC(包括消息队列,信号,共享存储), 套接字(SOCKET).管道包括三种:1)普通管道PIPE, 通常有两种限制,一是单工,只能单向传输;二是只能在父子或者兄弟进程间使用.2)流管道s_pipe: 去除了第一种限制,为半双工,可以双向传输.3)命名管道:name_pipe, 去除了第二种限制,可以...

  • 15996695890unix中,如何通过管道统计某条语句执行了多少次
    卢眨露无论父子进程中谁要去修改页面,系统就为该进程拷贝一个独立的特定页面,然后再对其进行修改。该进程以后就只使用这个新拷贝的页面而不再是共享的那个,而别的进程则继续使用共享的页面。这项技术就叫随拷随写,因为当有进程要写页面的时候,就需要先拷贝页面。

  • 15996695890UNIX系统中文件分为哪些类型?
    卢眨露· 管道(pipe)和命名管道(named pipe)(也叫FIFO)· 套接字(socket)前三种文件类型是任何Unix 文件系统的基本类型。其实现将在第十七章详细讨论。设备文件与I\/O设备以及集成到内核中的设备驱动程序相关。例如,当程序访问设备文件时,它直接访问与那个文件相关的设备 管道和套接字是用于进程...

  • 15996695890unix中,如何通过管道统计某条语句执行了多少次
    卢眨露当fork()系统调用发生时,子进程会拷贝其父进程的所有页面,并将其加载入操作系统为它分配的一片独立内存中。这些拷贝的动作很消耗时间,而且在某些情况下并不需要这么做。

  • 15996695890env | grep oracle什么意思
    卢眨露这是一条UNIX\/Linux的shell命令。env的意思是打印当前的环境变量,竖线“|”的意思是管道,即将env 命令所打印出来的东西传给竖线之后的命令处理。grep是正则表达式过滤命令。当遇到包含“oracle“的行时会显示该行。整个命令就是显示包含“oracle”关键字的环境变量。

  • 15996695890什么叫网络系统,具体种类及特征是什么
    卢眨露UNIX开创了许多重要的概念。其中最重要的当属管道(Pipe)概念,由管道概念导致了这样的思想:复杂的功能可以通过编制成一组在一起工作的程序来实现。管道连接使得用户需要多少程序就可以使用多少。贯穿UNIX系统的另一个重要概念就是软件工具的概念。应该说,软件工具的概念并不是UNIX系统所独有的,但是比起其他...

  • 15996695890SCO unix 下通过">>"管道符输出文件达到不换行的目的怎么解决?
    卢眨露!\/bin\/shecho "Date is:`date +%y%m%d`" >> test.txt

  • 相关主题精彩

    版权声明:本网站为非赢利性站点,内容来自于网络投稿和网络,若有相关事宜,请联系管理员

    Copyright © 喜物网