概述
前言
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
信号会被暂时搁置,SIGINT
和SIGQUIT
信号则会被忽略。 - 返回值:
如果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] = '