一、前言
本文将介绍unix系统中的system函数,包括system函数的作用以及使用方法。
二、system函数
简单来说,system函数用于创建一个子进程并让子进程运行新的程序。其原理是依次执行如下操作:
fork() --> execl() --> waitpid()
函数原型如下:
#include <stdlib.h> int system(const char *command);
参数: command:指向一个字符串指针,表示需要执行的命令。如果command为NULL,则若系统支持system函数则会返回非0值。
返回值:
如果命令执行成功,system函数返回命令的退出状态。如果执行失败,则分2种情况:fork失败返回-1,exec失败则返回exit(127)
值得注意的是,常见的system实现,在exec环节并不直接执行我们想要执行的命令,而是通过调用shell来间接执行,形式如下:
execl(“/bin/sh”, “sh”, “-c”, cmdstring, (char*)0);
shell的-c选项表示取下一个命令行参数(cmdstring)作为命令输入。
使用shell有一个好处,那就是shell会帮我们处理命令行字符串,如果直接使用exec执行我们想要的命令,需要自己将以null终止的字符串拆分成一个个的参数。
ps:另外需要注意的一点是,如果一个进程拥有超级用户权限,那么不应该直接调用system,应该单独执行fork、exec,并且在执行exec前要将权限改成普通用户权限。如果直接调用system的话,会使得新建的进程继承父进程的超级用户权限。
参考代码如下:
/*************************************************************************
> File Name: system_test.c
> Author: conbiao
> Created Time: 2024年10月08日 星期二 15时29分36秒
************************************************************************/
/***********************************************************************
* HEADER
**********************************************************************/
#include<stdio.h>
#include<stdlib.h>
/***********************************************************************
* MACRO
**********************************************************************/
/***********************************************************************
* GLOBAL VARIABLE
**********************************************************************/
/***********************************************************************
* FUNCTION DESCRIPTION
**********************************************************************/
/***********************************************************************
* FUNCTION NAME:
***********************************************************************
*
* Summary:
*
* Params:
*
* Return:
*
***********************************************************************/
/***********************************************************************
* MAIN
**********************************************************************/
int main(int argc, char *argv[])
{
int ret = 0;
printf("%s: start!\n",__FILE__);
system("/home/bb-yy/zijide/study/system/linux/unix-like-app/exec/test");
printf("%s: end!\n",__FILE__);
return ret;
}
测试代码如下:
/*************************************************************************
> File Name: test.c
> Author: conbiao
> Created Time: 2024年09月29日 星期日 15时16分00秒
************************************************************************/
/***********************************************************************
* HEADER
**********************************************************************/
#include<stdio.h>
#include<unistd.h>
#include<stdlib.h>
/***********************************************************************
* MACRO
**********************************************************************/
#define FEXECVE
/***********************************************************************
* GLOBAL VARIABLE
**********************************************************************/
/***********************************************************************
* FUNCTION DESCRIPTION
**********************************************************************/
/***********************************************************************
* FUNCTION NAME:
***********************************************************************
*
* Summary:
*
* Params:
*
* Return:
*
***********************************************************************/
/***********************************************************************
* MAIN
**********************************************************************/
int main(int argc, char *argv[])
{
int ret = 0;
#ifdef FEXECVE
printf("\n<%s> Author is: %s\n",__FILE__,getenv("AUTHER"));
#endif
while(1)
{
printf("This is %s!\n",__FILE__);
sleep(1);
}
return ret;
}
运行结果如下:
(2-1)
参考资料:
《UNIX环境高级编程(第3版) (史蒂文斯 (W.Richard Stevens) 拉戈 (Stephen A.Rago))
(Z-Library)》