/*********************************************************************
 * 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. float 覆盖元素的问题

    <span class="right-span"><a href="/xxx/" class="btn">增加Ser ...

  2. C# lazy<T>的用法

    .NET 4.0中加入了lazy<T>(懒对象),其实叫懒对象感觉不对,更应该叫延迟对象加载. 正如我们所知,对象的加载是需要消耗时间的,特别是对于大对象来说消耗的时间更多.lazy可以实 ...

  3. error C2664: “LoadLibraryW”: 不能将参数 1 从“const char *”转换为“LPCWSTR”

    在使用VS2010编写运行时动态链接dll文件时出现的一个问题,问题解决得益于此文章: http://blog.sina.com.cn/s/blog_6a2236590100xbgl.html 通过调 ...

  4. BZOJ AC300题留念

  5. 如何抓取Thread Dump小结(转)

    当系统性能出现问题时,需要从各个方面来查看网络环境.主机资源.查看最经变更的代码等.如果是想从代码层面解决问题,那么最有效的方法就是查看相关dump文件.如果是使用IBM JDK(我默认你是在aix环 ...

  6. Mockito--完整功能介绍(转)

    public interface DBAccess { int delete(String moi,String moc) throws Exception; void create(String m ...

  7. mysqli_set_charset和SET NAMES优劣分析

    bool mysqli_set_charset ( mysqli $link , string $charset ) 这应该是首选的用于改变字符编码的方法,不建议使用 mysqli_query()执行 ...

  8. northern truck 是什么牌子?具体_百度知道

    northern truck 是什么牌子?具体_百度知道 northern truck 是什么牌子?具体

  9. 简单字符串处理 hdu2532 Engine

    本来可以把这篇文章放入上一篇文章里,不过做这个题花了一点时间,也有一点收获,同时觉得网上的这个题目可供参考的文章有些少,那么就单独成篇吧. 首先分析下题目思路: 这个题目是个模拟题,步骤也很清晰. 首 ...

  10. python中eval, exec, execfile,和compile [转载]

    eval(str [,globals [,locals ]])函数将字符串str当成有效Python表达式来求值,并返回计算结果. 同样地, exec语句将字符串str当成有效Python代码来执行. ...