unix系统中的system函数

一、前言

本文将介绍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)》

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值