zoukankan      html  css  js  c++  java
  • 驱动开发学习笔记. 0.03 如何将可执行文件输出从定向 以及 标准输出重定向和标准输出连到终端的区别

                           驱动开发读书笔记. 0.03 如何将可执行文件输出从定向 以及 标准输出重定向和标准输出连到终端的区别

       《UNIX环境高级编程》里面(第三版 p184),将a.out > temp.out 即可完成 程序输出的重定向,但是我在上机测试的时候并不能,会提示 command not found;网上查询无结果,只有ls  > temp.out 此类 将目录下的文件名输出到temp.out里面,于是灵机一动,想到 ls 是命令, a.out不是命令,但是./aout是命令并带有输出,这样一类比,果然可以了

      $ ./a.out > temp.out

    这样会将输出都重定向到 temp.out里面


    重定向到temp.out的结果(即运行命令 ./a.out > temp.out)

    a write to stdout
    before fork
    pid = 4532,glob = 7,var = 89
    before fork
    pid = 4533,glob = 7,var = 89

    直接输出到终端的结果(即直接运行命令 ./a.out,无重定向)

    a write to stdout
    before fork
    pid = 4625,glob = 7,var = 89
    pid = 4626,glob = 7,var = 89


    代码

     1 #include "unistd.h"
     2 #include "stdio.h"
     3 int globvar=6;
     4 
     5 char buf[]="a write to stdout
    ";
     6 
     7 int main(void)
     8 {
     9     int     var;
    10     pid_t     pid;
    11     
    12     var = 88;
    13     if(write(STDOUT_FILENO,buf,sizeof(buf)-1)!=sizeof(buf)-1)
    14         err_sys("write error");
    15     printf("before fork
    ");
    16     
    17     if(pid = fork()<0){
    18         err_sys("fork error");    
    19     } else if (0 == pid){
    20         globvar++;
    21         var++;
    22     } else {
    23         sleep(2);
    24     }
    25     
    26     printf("pid = %ld,glob = %d,var = %d
    ", (long)getpid(),globvar,var);
    27 
    28     exit(0);
    29 }

    为什么两者会有不同?

    因为 运行./a.out的时候是标准输出连到终端(屏幕输出),printf会将内容送到缓冲区,然后遇到换行符会进行一次冲洗(行缓冲);

    而运行./a.out >temp.out 是将标准输出重定向到一个文件,此时是全缓冲,等到exit 之后才会进行冲洗;

    第一个printf 是在fork之前,重定向的时候缓冲区的数据也会复制到子进程中,所以"before fork" 会被打印两次

  • 相关阅读:
    开源框架---通过Bazel编译使用tensorflow c++ API 记录
    图像处理---视频<->图片
    C++ ---释放内存(new和delete)
    目标检测---搬砖一个ALPR自动车牌识别的环境
    ubuntu系统---ubuntu16.04 + virtualenv + py2.7 + tf1.5.0 + keras2.2.4 + opencv2.4.9 +Numpy1.14
    Ubuntu系统---中英文问题小记
    Ubuntu系统---nvidia驱动下载之问题
    Ubuntu系统---又显示nvidia-smi 未找到命令
    Ubuntu系统---安装English版本之后的一些工作
    Ubuntu系统---安装“搜狗拼音法”导致桌面打不开
  • 原文地址:https://www.cnblogs.com/simonlin/p/5809921.html
Copyright © 2011-2022 走看看