当前位置: 首页 > news >正文

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 FEXECVEprintf("\n<%s> Author is: %s\n",__FILE__,getenv("AUTHER"));
#endifwhile(1){printf("This is %s!\n",__FILE__);sleep(1);}return ret;
}

运行结果如下:
在这里插入图片描述

(2-1)

参考资料:

《UNIX环境高级编程(第3版) (史蒂文斯 (W.Richard Stevens) 拉戈 (Stephen A.Rago))
(Z-Library)》


http://www.mrgr.cn/news/45353.html

相关文章:

  • Spring Cloud微服务详解
  • EDA脚本应用领域及使用特点
  • 实战千问2大模型第四天——Qwen2-VL-7B(多模态)lora微调训练和测试
  • python画图|显式和隐式接口The explicit and the implicit interfaces
  • can 总线入门———can简介硬件电路
  • Redis面试篇1
  • 也来猜猜 o1 实现方法
  • OpenCV高级图形用户界面(3)关闭由 OpenCV 创建的指定窗口函数destroyWindow()的使用
  • PCL-点云质心识别
  • 机器学习——强化学习与深度强化学习
  • JioNLP:一款实用的中文NLP预处理工具包
  • gligen安装部署笔记
  • pycharm连接linux服务器需要提前安装ssh服务
  • Collection 框架的结构
  • STM32的时钟复位控制单元(RCU/RCC)技术介绍
  • SpringBoot飘香水果网站:从概念到实现
  • 2024故障测试入门指南!
  • 基于单片机的烧水壶系统设计
  • 如何在VSCode上运行C/C++代码
  • 宠物咖啡馆数字化解决方案:基于SpringBoot的实现