/*********************************************************************
 * 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. OpenStack里对VPN的支持

    今天翻自己的笔记找到了点去年研究Cloudpipe的东西: 对于用VLAN隔开的项目内主机的访问,可以使用CloudPipe来进行VPN访问 其实就是把OpenStack和OpenVPN集成了一下,给 ...

  2. A - Prime Ring Problem(素数环,深搜,打表)

    Description A ring is compose of n circles as shown in diagram. Put natural number 1, 2, ..., n into ...

  3. BZOJ 3544: [ONTAK2010]Creative Accounting( BST )

    题意 : 一段序列 , 求一段子序列和取余 M 的最大值 其实是一道水题... 前缀和 , 然后就是找 ( sum( r ) - sum( l ) ) % M 的最大值 . 考虑一个 sum( r ) ...

  4. BZOJ 3401: [Usaco2009 Mar]Look Up 仰望( 单调栈 )

    n <= 105 , 其实是10 ^ 5 ....坑...我一开始写了个模拟结果就 RE 了.. 发现这个后写了个单调栈就 A 了... ---------------------------- ...

  5. JavaScript弹出框

    confirm(str); 参数说明: str:在消息对话框中要显示的文本 返回值: Boolean值 返回值: 当用户点击"确定"按钮时,返回true 当用户点击"取消 ...

  6. zk set 方法

    [root@wx03 zook]# cat a4.pl use ZooKeeper; use AnyEvent; use AE; use Data::Dumper; my $zk = ZooKeepe ...

  7. Ubuntu下编译Android JNI最靠谱的方法...

    网上资料太杂乱,搞了大半天都还是没搞懂怎么系统的调用NDK.最后干脆放弃了Win改用Ubuntu编译JNI,虽然编译环境简单了,但是资料却少了不少.几乎没有一篇完整的文章.我想或许是能在Ubuntu下 ...

  8. ArrayList集合--C#

    static void Main(string[] args) { //实例化出一个集合对象 ArrayList list = new ArrayList(); /*添加*/ //--添加单个元素 l ...

  9. BZOJ 1717: [Usaco2006 Dec]Milk Patterns 产奶的模式( 二分答案 + 后缀数组 )

    二分答案m, 后缀数组求出height数组后分组来判断. ------------------------------------------------------------ #include&l ...

  10. 几种能在O(n*log(n))时间排序

    线性时间排序   各种排序算法总结已经介绍了几种能在O(n*log(n))时间内培训n个数的算法.归并排序和堆排序达到了最坏情况下的上界:快速排序在平均情况下达到该上界.这些算法都有一个有趣的性质:在 ...