背景:项目有个功能是查看版本号(像什么内核版本号、驱动版本号,等等),是通过管道来实现的,网上也有这方面的介绍,就不多说了。
在一次测试过程中,发现不断查看版本号竟然会导致系统复位(比如查看20次、40次、100次),这个bug发现晚的原因是没有谁那么无聊连续查看100次版本号,当然,发现也是碰巧在几次查看之后系统就挂了。后来发现是因为某个地方卡住导致某个线程超时而复位。后来跟踪到了这个管道函数中来。解决的方法是使用读取文件的方法来获取系统版本号(如内核版本)。不过真正原因还没有找到,可能出在popen这类函数中。
下面给出示例代码:

#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <unistd.h>
#include <signal.h>

static void OnSignal(int signalno)
{
    printf("receive signal num: %d\n", signalno);
    int bExit = true;
    for (int i = 0; i < 100; i++)
    {
        if (signalno == 17 || signalno == 13)
        {
            bExit = false;
            break;
        }
    }
    if (bExit)
    {
        printf("exit process.\n");
    }
}

// 通过管道读取执行命令后的信息
void GetSystemCmdInfo(const char* cmd, char* buf, int len)
{
    char info[256] = {0};

FILE* fp = popen(cmd, "r");
    if (fp)
    {
        fread(info, 1, sizeof(info), fp);

if ( buf != NULL && len > (int)strlen(info) )
        {
            strcpy(buf, info);
        }
        pclose(fp);
    }
}

// 通过文件读取到信息
// 这种方法是读文件,上面的方法是执行命令,两者不是一回事
void ReadKernelVersion(char* file, char* buf, int len)
{
    FILE* fp = NULL;
    char info[256] = {0};
    fp = fopen(file, "r");
    if (fp == NULL)
    {
        perror("open file error");
        return;
    }
    fread(info, 1, sizeof(info), fp);
    if ( buf != NULL && len > (int)strlen(info) )
    {
        strcpy(buf, info);
    }
    fclose(fp);
}

int main(void)
{
    char szValue[512] = {0};
    char buf[1024] = {0};
    int iLen = 0;
    for (int i = 0; i < 255; i++)
    {
        if (i != SIGILL && i != SIGBUS && i != SIGSEGV)
        {
            signal(i, OnSignal);
        }
    }
    // 执行此函数时,会有SIGCHLD信号
    GetSystemCmdInfo("cat /proc/version", szValue, sizeof(szValue));
    //ReadKernelVersion("/proc/version", szValue, sizeof(szValue));
    iLen = sprintf(buf, "[Kernel ver]: %s\r\n", szValue);
    printf("%s", buf);

return 0;
}

popen算是重型武器了,一般的小场合可不必使用,像查看内核版本,可能使用cat /proc/version命令,也可以读取/proc/version文件。
还是那名话说得好,具体情况具体分析,因地制宜采用不同的策略方能制胜。

语法高亮由迟思堂工作室强力支持

声明:本文仅为学习之目的,代码仅是示例性代码,网络上也能找到类似用法,无意亦无胆涉及过多其它代码。
                                                                                                                                                                                                                  李迟 代码随笔 即日

Linux管道函数使用相关推荐

  1. Linux系统函数之IO函数

    技术交流 QQ 群:1027579432,欢迎你的加入! 欢迎关注我的微信公众号:CurryCoder的程序人生 1.标准C库IO函数工作流程 IO缓冲区的作用? 大部分硬盘都是机械硬盘,读取寻道时间 ...

  2. linux 管道--转

    linux 管道 管道是Linux中很重要的一种通信方式,是把一个程序的输出直接连接到另一个程序的输入,常说的管道多是指无名管道,无名管道只能用于具有亲缘关系的进程之间,这是它与有名管道的最大区别. ...

  3. linux系统调用函数---12

    Linux应用编程学习笔记                                 周学伟 一.系统调用文件编程   1.文件打开函数 /*************************** ...

  4. linux c语言内核函数手册,Linux C函数实例速查手册

    函数学习目录: 第1章 初级I/O函数 1.1 close函数:关闭已经打开的文件 1.2 creat函数:创建一个文件 1.3 dup函数:复制文件描述符 1.4 dup2函数:复制文件描述符到指定 ...

  5. Linux管道到底能有多快?

    [CSDN 编者按]本文作者通过一个示例程序,演示了通过Linux管道读写数据的性能优化过程,使吞吐量从最初的 3.5GiB/s,提高到最终的 65GiB/s.即便只是一个小例子,可它涉及的知识点却不 ...

  6. Linux管道初步了解

    inux 管道 管道是Linux中很重要的一种通信方式,是把一个程序的输出直接连接到另一个程序的输入,常说的管道多是指无名管道,无名管道只能用于具有亲缘关系的进程之间,这是它与有名管道的最大区别. 有 ...

  7. linux中管道的概念,浅谈Linux管道

    管道(pipe)是一个我们在学习Linux命令行的时候就会引入的一个很重要的概念.管道是UNIX环境中历史最悠久的进程间通信方式,从本质上说,管道也是一种文件,也是遵循UNIX的"一切皆文件 ...

  8. linux——管道详解

    管道是Linux中很重要的一种通信方式,是把一个程序的输出直接连接到另一个程序的输入,常说的管道多是指无名管道,无名管道只能用于具有亲缘关系的进程之间,这是它与有名管道的最大区别.有名管道叫named ...

  9. Linux 系统函数

    Linux 系统函数 可以使用 man 2 函数名 查看 系统函数 也可以在 文件内 使用 2+ shift +k 进入指定函数 (前提是光标停在指定函数上) open 函数 int open(con ...

最新文章

  1. 使用Remix编译和部署以太坊智能合约
  2. Android Stdio 插件谷歌兼容库Appcompat
  3. 图解iPhone开发新手教程
  4. hotelling变换_基于Hotelling-T²的偏最小二乘(PLS)中的变量选择
  5. kite 使用 go_使用Apache Storm和Kite SDK Morphlines的可配置ETL处理
  6. IIS添加直接下载的文件类型
  7. html实现页面弹球,使用html+css+js实现弹球游戏
  8. Java学习笔记(3)——资源管理
  9. html跳转多个域名自动选择,nginx实现两个域名之间跳转配置
  10. 信息学奥赛一本通,题解列表
  11. 计算机万维考试题,计算机培训 万维考试系统选择题题库(含参考答案).pdf
  12. RHEL5.4配置自动挂载器
  13. 系统架构设计师考试题库笔记重点3:嵌入式系统设计
  14. php菱形,PHP 打印菱形
  15. VBS:基本输出函数
  16. Selenium QQ自动化登录
  17. React-Antd-表单-必选样式
  18. CVPR2017论文
  19. 2020清华深圳国际研究院 计算机线上夏令营总结
  20. BPM流程平台_K2+QAD:助力企业实现精益化管理_业务流程管理系统

热门文章

  1. 一蔚来ES8汽车疑似失控 将地下车库墙撞穿
  2. Instagram CEO:苹果iPad用户数少 不值得开发App
  3. 北京冬奥会闭幕 冰墩墩概念股怎么样了?
  4. 诺贝尔奖发了120年,钱怎么越花越多?
  5. 造车大军再添一员!消息称滴滴正式启动造车项目
  6. 华为P50系列已适配鸿蒙OS 2.0 Beta2:有望4月亮相
  7. 北京环球度假区:尚未发布票务信息,未面向公众销售任何门票
  8. 炒股炒成亿万富翁? 胡润财富报告称人数还不少
  9. 任正非之女姚安娜正式出道
  10. 人民用不起的共享充电宝,可能还被植入了木马,这三类要慎用!