/*********************************************************************
 * Author  : Samson
 * Date    : 03/13/2015
 * Test platform:
 *              3.13.0-24-generic
 *              GNU bash, 4.3.11(1)-release
 * *******************************************************************/

在GNU Linux C编程中,要想进行系统命令的运行的话,仅仅提供了system接口,可是此接口并不能得到命令运行后所输出的值。而仅仅可以得到命令是否运行成功的结果。仅仅这种功能还是不够的。有的时候是要必须通过命令的输出来推断下一步的结果或步骤的,那么怎么样可以得到system命令运行的结果呢?那就行使用到popen函数和fgets函数进行命令的输出信息的获取了,实际样例例如以下:

注意:此接口仅仅可以获取命令输出的最后一行的信息。若有多行输出信息将不可以所有获取到,此封装接口仅仅适用于得到命令运行结果的最后一行的信息。

#include <stdio.h>

#include <stdlib.h>

#include <errno.h>

#include <string.h>



int super_system(const char * cmd, char *retmsg, int msg_len)

{

        FILE * fp;

        int res = -1;

        if (cmd == NULL || retmsg == NULL || msg_len < 0)

        {

                printf("Err: Fuc:%s system paramer invalid!\n", __func__);

                return 1;

        }

        if ((fp = popen(cmd, "r") ) == NULL)

        {

                perror("popen");

                printf("Err: Fuc:%s popen error: %s\n", __func__, strerror(errno));

                return 2;

        }

        else

        {

                memset(retmsg, 0, msg_len);

                while(fgets(retmsg, msg_len, fp));

                {

                        printf("Fuc: %s fgets buf is %s\n", __func__, retmsg);

                }

                if ( (res = pclose(fp)) == -1)

                {

                        printf("Fuc:%s close popen file pointer fp error!\n", __func__);

                        return 3;

                }

                //drop #012 from system result retmsg.

                retmsg[strlen(retmsg)-1] = '\0';

                return 0;

        }

}



int main()

{

    char *cmd = "whoami";

    char *cmd1 = "initctl list";

    char retmsg[1024] = {0};

    int ret = 0;

    ret  = super_system(cmd, retmsg, sizeof(retmsg));

    printf("system ret is %d retmsg is \n%s\n", ret, retmsg);

    return 0;

}



main函数中使用了whoami的命令,运行结果即是当前username。

运行结果:

ufo@ufo:~$ ./a.out

Fuc: super_system fgets buf is ufo



system ret is 0 retmsg is

ufo

能够返回运行结果的system函数加强版本号的更多相关文章

  1. 可以返回执行结果的system函数加强版本

    在GNU Linux C编程中,要想进行系统命令的执行的话,只提供了system接口,但是此接口并不能得到命令执行后所输出的值,而只能够得到命令是否执行成功的结果.仅仅这样的功能还是不够的,有的时候是 ...

  2. (转)linux下execl和system函数

    linux下,system函数和execl函数都是用于执行一条系统命令.今天仔细看了system函数的实现,想找出和execl函数的差别. 这里先进行一些背景知识补充: fork(创建一个新的进程): ...

  3. [转]system函数返回值探究

    对于system这个函数的功能早就有一定了解,读书期间,就学习了UNIX系统编程这本书,后来买了APUE.我这个人总是有好读书不求甚解的毛病.对于system函数只知其一,不知其二.后来被人问起相关的 ...

  4. Unix系统中system函数的返回值

    网上关于system函数的返回值说明很多很详细但却不直观,这里搬出apue 3rd Editon中实现system函数的代码来说明其返回值. #include <sys/wait.h> # ...

  5. Linux system函数返回值

    例: status = system("./test.sh"); 1.先统一两个说法: (1)system返回值:指调用system函数后的返回值,比如上例中status为syst ...

  6. Linux system函数详解

    system 功能:system()函数调用"/bin/sh -c command"执行特定的命令,阻塞当前进程直到command命令执行完毕 原型 int system(cons ...

  7. C语言中system()函数的用法总结(转)

    system()函数功能强大,很多人用却对它的原理知之甚少先看linux版system函数的源码: #include <sys/types.h> #include <sys/wait ...

  8. 对于linux下system()函数的深度理解(整理)

    原谅: http://blog.sina.com.cn/s/blog_8043547601017qk0.html 这几天调程序(嵌入式linux),发现程序有时就莫名其妙的死掉,每次都定位在程序中不同 ...

  9. system函数的总结

    最近在看APUE第10章中关于system函数的POSIX.1的实现.关于POSIX.1要求system函数忽略SIGINT和SIGQUIT,并且阻塞信号SIGCHLD的论述,理解得不是很透彻,本文就 ...

随机推荐

  1. Linq实现t-Sql的各种连接

    在ORM框架大行其道的今天,对于.net行业的人,想要学好EF,那Linq的学习在势在必行啊.今天总结下平时比较常用的表连接的用法. Inner Join Linq: var list = (from ...

  2. Java字节码中的方法调用

    invokestatic,用于static修饰的方法.任何时候调用的时候只需要类名+方法名即可,无需new.JVM直接将其映射到方法区,执行速度极快.当该方法需要参数的时候,invokestatic会 ...

  3. SQLite3的使用(用到了dll)good

    1.下载sqlite3相关文件sqlite3.dll.sqlite3.h(可从http://download.csdn.net/detail/mingxia_sui/5249070下载),添加到工程的 ...

  4. 几个BCB例子

    http://blog.163.com/tab_98/blog/static/11924097201511274543737/

  5. c# winform 弹出确认消息框判断是否删除?

    if (MessageBox.Show("确认删除?", "此删除不可恢复", MessageBoxButtons.YesNo) == DialogResult ...

  6. 网页制作之html基础学习5-background-position用法

    我们知道在用图片作为背景的时候,css要这样写,以div容器举例子,也可以是body.td.p等的背景,道理一样. 代码: div{ background:#FFF url(image) no-rep ...

  7. 13 - NSURLConnection

    一.互联网 基本概念: HTTP协议 统一标准获取网络资源(其他设备上的东西) 本机 -> 远程服务器(计算机) URL(http有格式的字符串) 本机 <- 远程服务器(计算机) Fil ...

  8. Could not resolve archetype org.apache.maven.archetypes:maven-archetype-quickstart

    之前都是命令行创建,今天用eclipse装m2eclipse的时候装完后创建项目的时候报错: Could not resolve archetype org.apache.maven.archetyp ...

  9. SqlServer和Oracle中一些常用的sql语句6 存储过程

    --不带参数的存储过程 CREATE procedure proc_sql1 as begin declare @i int set @i=0 while @i<26 begin print c ...

  10. delphi高手突破学习笔记之面向对象类和对象的本质(有汇编解释 good)

    知识点1:堆和栈 每个应用程序可以获得的内存空间分为两种:堆(heap)和栈(stack). 堆又称为“自由存储区”,其中的内存空间的分配与释放是必须由程序员来控制的.例如,用GetMem函数获取了一 ...