我是靠谱客的博主 淡然薯片,最近开发中收集的这篇文章主要介绍system函数封装,觉得挺不错的,现在分享给大家,希望可以做个参考。

概述

前言

system()系统函数在编程过程中经常被调用,在linux下,可以用来执行shell命令,但在平常的工作中,我们很多时候需要执行的shell命令需要接收用户的输入,并对shell命令执行后的返回结果再做相应处理,此时,我们需要对system函数做一下封装。

用法实例及说明

获取Ubuntu下指定网口的相关信息

  • 编程环境: ubuntu
  • 相关函数: fork,execve,waitpid,popen
  • 表头文件: #include <stdlib.h>
  • 定义函数: int system(const char * string);
  • 函数说明:
    system()会调用fork()产生子进程,由子进程来调用/bin/sh-c string来执行参数string字符串所代表的命令,此命令执行完后随即返回原调用的进程。在调用system()期间SIGCHLD 信号会被暂时搁置,SIGINTSIGQUIT 信号则会被忽略。
  • 返回值:
    如果fork()失败 返回-1:出现错误
    如果exec()失败,表示不能执行Shell,返回值相当于Shell执行了exit(127)
    如果执行成功则返回子Shell的终止状态
    如果system()在调用/bin/sh时失败则返回127,其他失败原因返回-1。若参数string为空指针(NULL),则返回非零值>;。如果system()调用成功则最后会返回执行shell命令后的返回值,但是此返回值也有可能为 system()调用/bin/sh失败所返回的127,因此最好能再检查errno 来确认执行成功。

函数接口

  • void do_system(const char* format, ...)
  • int get_cmd_value (char *cmd_str, char *value, int len)
  • void get_cmd_result(const char *cmd, char *result)

接口函数实现

/**********************************************************************************************
*
function:system()函数封装,获取指定网卡信息
*
author:yahai.zhang
*
time: 2018.9.2
*
File Name:sys.c
**********************************************************************************************/
#include <stdio.h>
#include <stdlib.h>
#include <errno.h>
#include <string.h>
#include <stdarg.h>
#include <sys/wait.h>
#define CMD_LEN 32
#define BUF_LEN 2048
int debug_print = 1;
static void dpf(const char *format, ...)
{
if(debug_print){
va_list args;
va_start(args, format);
vprintf(format,args);
va_end(args);
}
}
static int _system(char *cmdbuf)
{
int stat;
stat = system(cmdbuf);
if(WIFEXITED(stat))
{
if(WEXITSTATUS(stat) == 0)
{
dpf("cmd ok:%s n", cmdbuf);
return 1;
}
else
{
dpf("cmd err:%s, wexitstaus [0x%x] n", cmdbuf, WEXITSTATUS(stat));
return 0;
}
}
dpf("cmd err:%s, wifexited [0x%x]n", cmdbuf, WIFEXITED(stat));
return 0;
}
void do_system(const char* format, ...)
{
char cmdstr[BUFSIZ];
va_list
args;
memset(cmdstr, 0, sizeof(cmdstr));
va_start(args,format);
vsnprintf(cmdstr, sizeof(cmdstr)-1, format,
args);
va_end(args);
_system(cmdstr);
}
int get_cmd_value (char *cmd_str, char *value, int len)
{
FILE *fp=NULL;
if(cmd_str == NULL ||value == NULL) {
return -1;
}
memset(value, 0, len);
fp = popen(cmd_str, "r");
if(fp) {
fgets(value, len, fp);
if(value[strlen(value)-1] == 'n') {
value[strlen(value)-1] = '';
}
pclose(fp);
return 0;
} else {
dpf("cmd:%s error!%sn",cmd_str,strerror(errno));
return -1;
}
}
void get_cmd_result(const char *cmd, char *result)
{
char line[256] = {0};
char tempresult[BUF_LEN] = {0};
FILE *ptr;
fflush(stdout);
if((ptr = popen(cmd, "r")) != NULL){
while(!feof(ptr)){
if(fgets(line, sizeof(line), ptr) != NULL){
strcat(tempresult, line);
}
}
pclose(ptr);
ptr = NULL;
if ( tempresult[strlen(tempresult) - 1] == 'n'
){
tempresult[strlen(tempresult) - 1] = ''; //remove n
}
}else{
printf("popen %s errorn", cmd);
}
fflush(stdout);
strcpy(result, tempresult);
return;
}
int main()
{
char *interface = "ens33";
char cmd[CMD_LEN] = {0};
char value[BUF_LEN] = {0};
do_system("ifconfig %s", interface);
sprintf(cmd, "ifconfig %s", interface);
get_cmd_value(cmd, value, sizeof(value));
dpf(""%s" return value:%s n",cmd, value);
memset(value, 0, sizeof(value));
get_cmd_result(cmd, value);
dpf(""%s" return value:%s n",cmd, value);
}

编译

gcc sys.c -o sys

运行情况

system封装函数获取网卡接口信息

最后

以上就是淡然薯片为你收集整理的system函数封装的全部内容,希望文章能够帮你解决system函数封装所遇到的程序开发问题。

如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。

本图文内容来源于网友提供,作为学习参考使用,或来自网络收集整理,版权属于原作者所有。
点赞(63)

评论列表共有 0 条评论

立即
投稿
返回
顶部