精华内容
下载资源
问答
  • linux read 从管道读取
    千次阅读
    2019-02-11 00:15:05

    管道读取写端已经关闭的管道,当数据全部读完后,写端返回0

    #include <unistd.h>
    #include <stdlib.h>
    #include <stdio.h>
    #include <string.h>
    
    int main(void)
    {
    	int fd[2];
    	if(pipe(fd) < 0)
    	{
    		perror("pipe error");
    		exit(1);
    	}
    	pid_t pid;
    	if((pid = fork())<0)
    	{
    		perror("fork error");
    		exit(1);
    	}
    	else if(pid>0)
    	{
    		sleep(5);
    		close(fd[1]);
    		while(1)
    		{
    			char c;
    			if(read(fd[0],&c,1) == 0)
    			{
    				printf("\nwrite-end of pipe closed\n");
    				break;
    			}
    			else
    			{
    				printf("%c",c);
    			}
    		}
    		close(fd[0]);
    		wait(0);
    
    	}
    
    	else
    	{
    		close(fd[0]);
    		char *s = "1234";
    		write(fd[1], s, sizeof(s));
    		close(fd[1]);
    	}
    }
    
    
    

     

    更多相关内容
  • Linux read命令用于标准输入读取数值。 read 内部命令被用来标准输入读取单行数据。这个命令可以用来读取键盘输入,当使用重定向的时候,可以读取文件中的一行数据。 语法 read [-ers] [-a aname] [-d delim...

    Linux read命令用于从标准输入读取数值。

    read 内部命令被用来从标准输入读取单行数据。这个命令可以用来读取键盘输入,当使用重定向的时候,可以读取文件中的一行数据。

    语法

    read [-ers] [-a aname] [-d delim] [-i text] [-n nchars] [-N nchars] [-p prompt] [-t timeout] [-u fd] [name ...]

    参数说明:

    • -a 后跟一个变量,该变量会被认为是个数组,然后给其赋值,默认是以空格为分割符。
    • -d 后面跟一个标志符,其实只有其后的第一个字符有用,作为结束的标志。
    • -p 后面跟提示信息,即在输入前打印提示信息。
    • -e 在输入的时候可以使用命令补全功能。
    • -n 后跟一个数字,定义输入文本的长度,很实用。
    • -r 屏蔽\,如果没有该选项,则\作为一个转义字符,有的话 \就是个正常的字符了。
    • -s 安静模式,在输入字符时不再屏幕上显示,例如login时输入密码。
    • -t 后面跟秒数,定义输入字符的等待时间。
    • -u 后面跟fd,从文件描述符中读入,该文件描述符可以是exec新开启的。

    实例

    1、简单读取

    #!/bin/bash
    
    #这里默认会换行  
    echo "输入网站名: "  
    #读取从键盘的输入  
    read website  
    echo "你输入的网站名是 $website"  
    exit 0  #退出

    测试结果为:

    输入网站名: 
    www.qq.com
    你输入的网站名是 www.qq.com

    2、-p 参数,允许在 read 命令行中直接指定一个提示

    #!/bin/bash
    
    read -p "输入网站名:" website
    echo "你输入的网站名是 $website" 
    exit 0

    测试结果为:

    输入网站名:www.qq.com
    你输入的网站名是 www.qq.com

    3、-t 参数指定 read 命令等待输入的秒数

    当计时满时,read命令返回一个非零退出状态。

    #!/bin/bash
    
    if read -t 5 -p "输入网站名:" website
    then
        echo "你输入的网站名是 $website"
    else
        echo "\n抱歉,你输入超时了。"
    fi
    exit 0

    执行程序不输入,等待 5 秒后:

    输入网站名:
    抱歉,你输入超时了

    4、使用 -n 参数设置 read 命令计数输入的字符。

    当输入的字符数目达到预定数目时,自动退出,并将输入的数据赋值给变量。

    #!/bin/bash
    
    read -n1 -p "Do you want to continue [Y/N]?" answer
    case $answer in
    Y | y)
          echo "fine ,continue";;
    N | n)
          echo "ok,good bye";;
    *)
         echo "error choice";;
    
    esac
    exit 0

    该例子使用了-n 选项,后接数值 1,指示 read 命令只要接受到一个字符就退出。只要按下一个字符进行回答,read 命令立即接受输入并将其传给变量,无需按回车键。

    只接收 2 个输入就退出:

    #!/bin/bash
    
    read -n2 -p "请随便输入两个字符: " any
    echo "\n您输入的两个字符是:$any"
    exit 0

    执行程序输入两个字符:

    请随便输入两个字符: 12
    您输入的两个字符是:12

    5、-s 选项能够使 read 命令中输入的数据不显示在命令终端上

    (实际上,数据是显示的,只是 read 命令将文本颜色设置成与背景相同的颜色)。输入密码常用这个选项。

    #!/bin/bash
    
    read  -s  -p "请输入您的密码:" pass
    echo "\n您输入的密码是 $pass"
    exit 0

    执行程序输入密码后是不显示的:

    请输入您的密码:
    您输入的密码是 1234

    6.一次读取多个变量

    7.读取文件

    每次调用 read 命令都会读取文件中的 "一行" 文本。当文件没有可读的行时,read 命令将以非零状态退出。

    通过什么样的方法将文件中的数据传给 read 呢?使用 cat 命令并通过管道将结果直接传送给包含 read 命令的 while 命令。

    测试文件 test.txt 内容如下:

    123
    456
    runoob

    测试代码:

    #!/bin/bash
      
    count=1    # 赋值语句,不加空格
    cat test.txt | while read line      # cat 命令的输出作为read命令的输入,read读到>的值放在line中
    do
       echo "Line $count:$line"
       count=$[ $count + 1 ]          # 注意中括号中的空格。
    done
    echo "finish"
    exit 0

    执行结果为:

    Line 1:123
    Line 2:456
    Line 3:runoob
    finish

    使用 -e 参数,以下实例输入字符 a 后按下 Tab 键就会输出相关的文件名(该目录存在的):

    $ read -e -p "输入文件名:" str 
    输入文件名:a
    a.out    a.py     a.pyc    abc.txt  
    输入文件名:a
    展开全文
  • //从管道读取数据 33 printf("the parent str is %s\n",str_par); 34 } 35 } 36 } 运行结果: hello ths son str is hello the parent str is hello ^C 这里输出后有两次换行,一次是代码里写着的'/n',另一次是在...

    实现代码: 

      1 #include<stdio.h>
      2 #include<sys/types.h>
      3 #include<unistd.h>
      4 #include<stdlib.h>
      5 int main(int argc,char const *argv[])
      6 {
      7     pid_t pid;
      8     int fd[2];
      9     pipe(fd);
     10     pid=fork();
     11     if(pid==-1)
     12     {
     13         perror("fail to fork");
     14         exit(1);
     15     }
     16     if(pid==0)
     17     {
     18         while(1)
     19         {
     20             char str_son[10];
     21             fgets(str_son,10,stdin);
     22             //这里也可以用read从终端读取数据:read(0,str,10);
     23             printf("ths son str is %s\n",str_son);
     24             write(fd[1],str_son,10);//向管道写入数据
     25         }
     26     }
     27     else
     28     {
     29         while(1)
     30         {
     31             char str_par[10];
     32             read(fd[0],str_par,10);//从管道读取数据
     33             printf("the parent str is %s\n",str_par);
     34         }
     35     }
     36 }
    

    运行结果:

    hello
    ths son str is hello
    
    the parent str is hello
    
    ^C
    
    

    这里输出后有两次换行,一次是代码里写着的'/n',另一次是在终端按下回车后产生的,fegts会把回车符按字符存储起来。

    展开全文
  • 管道是半双工通信,数据流只能写端流向读端 ps aux | grep mypipe ps aux命令通过写端往管道中写,grep通过读端进行读,数据流向是写端到读端 PCB角度去理解管道: 当前进程调用pipe函数,进程里有一个task_...

    管道阻塞特性(10个):

    1.管道是半双工通信,数据流只能从写端流向读端

    ps aux | grep mypipe
    ps aux命令通过写端往管道中写,grep通过读端进行读,数据流向是从写端到读端

    从PCB角度去理解管道:

    • 当前进程调用pipe函数,进程里有一个task_struct结构体;
    • task_struct结构体中有一个struct files_struct* files的指针;
    • 该指针指向对应的结构体struct files_struct;
    • 在这个结构体中有一个fd_array的数组;
    • 数组的每一个元素是struct_file*的结构指针 ;
    • 数组的下标为文件描述符,012分别对应标准输入、输出、错误;
      在刚写的代码里3和4是fd[0]和fd[1],如果在创建代码前打开其它文件,那么3和4对应的就不是管道;

    fd[0]和[1]对应的是内核中的一块缓冲区,f[0]相当于在缓冲区读,fd[1]相当于往缓冲区里写,该缓冲区就有读写两端

    2.匿名管道在内核中创建的缓冲区是没有标识符(没有名字)

    • 导致其它进程无法直接找到这个缓冲区;
    • 但是创建的进程可以通过两个读写端的文件描述符访问
    • 假设a进程创建管道,但其它进程不能使用该管道,但是管道是用来进程间通信,所以这就引出第三个特性

    3.匿名管道只支持具有亲缘性关系的进程进行进程间的通信

    原理:

    • 用父子进程,子进程会拷贝父进程的PCB中的3,4文件描述符,
    • 父子进程的fd[0]同时指向管道读端,fd[1]同时指向管道写端;
    • 此时父子进程可以通信

    在进行父子进程间通信时,一定要父进程先创建管道,再创建子进程,此时子进程的文件描述符表当中才会有匿名管道的读写两端的文件描述符
    代码:
    在这里插入图片描述
    运行结果:
    在这里插入图片描述

    现让父进程进行写子进程进行读,操作该缓冲区;
    代码:
    在这里插入图片描述

    4.当文件描述符保持基础属性(阻塞属性),调用read函数读空管道时,read函数就会阻塞

    • 文件描述符的基础属性是阻塞属性
    • 父子进程是抢占式运行的,为防止进程读到空管道;
    • 并且文件描述符保持基础属性(阻塞属性),调用read函数读空管道时,read函数就会阻塞;
    • 等待父进程写了之后再读取返回(阻塞属性不止应用于管道);

    5.管道的默认大小为 65536字节 → 2^16 → 64k

    如何测试一个管道的大小:代码如下
    最后count有多少个就有多少个字节
    在这里插入图片描述

    所以管道的默认大小是64k

    6.当文件描述符保持基础属性(阻塞属性),一直调用write函数将管道写满时,write函数会阻塞

    上述程序并没有停止,用命令查看程序正在写阻塞
    在这里插入图片描述

    7.管道的生命周期跟随进程

    创建管道的进程结束,管道也就不存在了

    8.管道提供字节流服务

    字节流:描述的是前后两个数据间是没有明显边界的

    字节流缺点:

    • 用户用write函数两次写入字符串,对于管道来说两次输入的数据没有明显边界对用户来说是两次输入,有明显界限
    • read可以读任意字节大小,在读取时无法区分两次输入,前后两次输入粘连在一起,read的返回值是读取到数据的字节数

    字节流优点:

    • 可以接收任意字节大小,由用户指定

    9.从管道中读取的方式:读取数据是直接将数据拿走,并不是拷贝

    验证:再次用read函数读取,管道为空,函数会阻塞不会执行后面语句

    10.对管道进行读写的时,读写的字节大小未超过pipe_size,则管道保证读写的原子性原子性

    原子性:要么已操作完成,要么未开始,不存在中间状态

    pipe size的大小是(512字节*8)=4096字节在这里插入图片描述

    展开全文
  • linux按行读取 (while read line与for-loop)

    千次阅读 2021-05-10 09:53:07
    linux下一般用while read line与for循环按行读取文件。现有如下test.txt文件:1. while read linewhile read line; doecho $linedone < test.txt输出结果与上图一致。这里也可以写为:cat test.txt | while ...
  • Linux管道

    千次阅读 2022-03-07 08:41:20
    命名匿名管道的基本知识与一下验证~~
  • 方法1:while循环中执行效率最高,最常用的方法。function while_read_LINE_bottm(){While read LINEdoecho $LINEdone <... filename(待读取的文件)注释:习惯把这种方式叫做read釜底抽薪,因为这种方式在结...
  • linux-有名管道

    2021-05-17 22:14:20
    命名管道特点:当写进程向管道中写数据的时候,如果没有进程读取这些数据,写进程会堵塞当读取管道中的数据的时候,如果没有数据,读取进程会被堵塞当写进程堵塞的时候,有读进程读取数据,那么写进程恢复正常当读...
  • Linux学习之有名管道

    千次阅读 2022-04-11 16:14:26
    Linux学习之有名管道的使用举例,和使用过程中的一些小问题
  • Linux 管道文件

    2021-05-10 22:12:59
    管道Linux中很重要的一种通信方式,是把一个程序的输出直接连接到另一个...Linux管道的实现机制本质上说,管道也是一种文件,但它又和一般的文件有所不同,管道可以克服使用文件进行通信的两个问题,具体表现为...
  • 方法1:while循环中执行效率最高,最常用的方法。function while_read_line_bottom(){while read linedoecho $linedone < $FILENAME}注释:我习惯把这种方式叫做read釜底抽薪,因为...管道法: cat $FILENAME |...
  • 管道两端可分别用描述字fd[0]以及fd[1]来描述,需要注意的是,管道的两端是...如果试图从管道写端读取数据,或者向管道读端写入数据都将导致错误发生。一般文件 的I/O函数都可以用于管道,如close、read、write等等。
  • 浅谈Linux管道

    千次阅读 2021-05-17 13:47:34
    管道是UNIX环境中历史最悠久的进程间通信方式,本质上说,管道也是一种文件,也是遵循UNIX的“一切皆文件”的原则设计的。虽然实现形态上是文件,但是管道本身并不占用磁盘或者其他外部存储的空间。在Linux的实现...
  • linux管道使用_如何在Linux上使用管道

    千次阅读 2020-10-07 18:38:47
    linux管道使用Fatmawati Achmad Zaenuri/Shutterstock.comFatmawati Achmad Zaenuri / Shutterstock.comUse Linux pipes to choreograph how command-line utilities collaborate. Simplify complex processes and ...
  • do\\line为一个变量,表示读取到一行的字符循环体done使用read由标准输入读取数据,放入变量line中,如果读到的数据非空,就进入循环。示例:取得/etc/passwd的用户名及shell#!/bin/bash#IFS=':'##改变字段分隔符...
  • Linux 管道通信

    千次阅读 2022-03-17 15:58:28
    3. 规定数据从管道的写端流入管道读端流出。 管道的原理: 管道实为内核使用环形队列机制,借助内核缓冲区(4k)实现。 管道 分为标准流管道,无名管道(PIPE),命名管道(FIFO) 管道的局限性: ① 数据自己读不...
  • Linuxread命令详解

    千次阅读 2022-03-11 14:11:16
    read 命令接收标准输入(键盘)的输入,或者其他文件描述符的输入。得到输入后,read 命令将数据放入一个标准变量中。 read 命令格式如下: #read [选项] [变量名] 选项: -a 后跟一个变量,该变量会被认为是个...
  • Linux进程间通信——管道通信详解

    千次阅读 2021-11-25 21:44:00
    进程间通信:管道引言进程间通信管道 引言 进程是相互独立的,每个进程都有自己的虚拟地址空间,虚拟地址空间通过页表的映射,映射到自己的物理内存上,互不影响。正因为如此,进程间通信就变得很麻烦,操作系统为了...
  • 文章目录前言进程间通信的目的管道匿名管道管道特点在文件描述符角度理解管道 前言 进程间的通信,其实就是两个进程需要进行交流,另一个角度上想:进程本身就是程序员给开辟的,所以进程间通信也就是程序员的通信...
  • Linux read 命令

    2021-05-17 22:40:24
    Linux read 命令Linux read命令用于标准输入读取数值。read 内部命令被用来标准输入读取单行数据。这个命令可以用来读取键盘输入,当使用重定向的时候,可以读取文件中的一行数据。语法read[-ers][-aaname][-...
  • Linux管道

    千次阅读 2022-02-25 19:29:41
    Linux进程间通信------管道
  • linux管道符详解

    千次阅读 多人点赞 2021-10-28 16:23:30
    linux管道符 ’ | ’ 操作详解 管道符主要用于多重命令处理,前面命令的标准输出作为后面命令的标准输入。简单点说就是,就像工厂的流水线一样,进行完一道工序后,继续传送给下一道工序处理… 举个栗子:对如下...
  • LinuxLinux管道

    万次阅读 多人点赞 2018-08-14 20:28:25
    管道Linux由Unix那里继承过来的进程间的通信机制,它是Unix早期的一个重要通信机制。其思想是,在内存中创建一个共享文件,从而使通信双方利用这个共享文件来传递信息。由于这种方式具有单向传递数据的特点,所以...
  • Linux 下有名(命名)管道文件读写操作 操作平台:Ubuntu 12.04 有名管道 1、查看命令:man 3 mkfifo 2、头文件:#include <sys/types.h> #include <sys/stat.h> 3、函数原型:int mkfifo(const char *...
  • Linux之命名管道及其使用

    千次阅读 2019-04-13 13:15:10
    管道 匿名管道:可以用于有血缘关系之间的进程间的通信(pipe) ...命名管道:为管道创建一个管道文件,这个管道文件就是管道的名字,但实质还是内核中的缓冲区。 建立管道文件 #include <sys/types.h>...
  • 1. 概念 有名管道又称为FIFO文件,因为... fifo文件里面的内容被读取后,就从管道中消失了。但是普通文件里面的内容读取后还存在; 2. 创建有名管道(fifo文件) 2.1 函数原型 #include <sys/stat.h> int mk
  • Linux-while read的用法

    2021-11-17 11:39:25
    while read的用法一 读取文件中的内容二 用管道读取文件中的内容三 用for读取文件中的内容 一 读取文件中的内容 二 用管道读取文件中的内容 三 用for读取文件中的内容
  • Linux 管道文件

    千次阅读 2021-08-22 12:20:02
    管道分为无名管道和有名管道两种管道管道文件是建立在内存之上可以同时被两个进程访问的文件。 先来说说有名管道: mkfifo函数创建有名管道,属于系统调用。 在linux操作系统中为实现下述功能, 先创建一个有名...
  • linux-读取/写入C中的二进制文件有没有人有可以写入二进制文件的代码示例。 还有可以读取二进制文件并输出到屏幕的代码。 看例子,我可以写文件了,但是当我尝试文件中读取文件时,它不能正确输出。4个解决方案86 ...
  • 3、一个管道是一个字节流,使用管道时不存在消息或者消息边界的概念,从管道读取数据 的进程可以读取任意大小的数据块,而不管写入进程写入管道的数据块的大小是多少。 4、通过管道传递的数据是顺序的,管道中...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 44,310
精华内容 17,724
关键字:

linux read 从管道读取