unix系统中的system函数

news2024/11/25 7:39:00

一、前言

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

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/2196811.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

在QT中将Widget提升为自定义的Widget后,无法设置Widget的背景颜色问题解决方法

一、问题 在Qt中将QWidget组件提升为自定义的QWidget后&#xff0c;Widget设置的样式失效&#xff0c;例如设置背景颜色为白色失效。 二、解决方法 将已经提升的QWidget实例对象&#xff0c;脱离父窗体的样式&#xff0c;然后再重新设置自己的样式。

AP8505固定5V输出5V0.2A,SOP7/DIP7非隔离开关电源IC

AP8505基于高压同步整流架构&#xff0c;集成PFM控制器以及500V高可靠性MOSFET&#xff0c;用于外部元器件极精简的小功率非隔离开关电源。AP8505无线门铃芯片内置500V高压启动&#xff0c;实现系统快速启动、超低待机功能。5V非隔离无线门铃芯片AP8505提供了完整的智能化保护功…

基于Python的爬虫设计与数据分析—计算机毕业设计源码37836

目 录 摘要 1 绪论 1.1课题背景 1.2研究目的及意义 1.3爬虫技术 1.4django框架介绍 2 1.5论文结构与章节安排 3 2 基于Python的爬虫设计与数据分析分析 4 2.1 可行性分析 4 2.2 系统流程分析 4 2.2.1数据流程 5 2.2.2业务流程 5 2.3 系统功能分析 5 2.3.1 功能性分析 6 2…

线性代数入门:打开数学的另一扇门

线性代数入门&#xff1a;打开数学的另一扇门 线性代数&#xff0c;作为数学的一个重要分支&#xff0c;它不仅是许多科学和工程领域的核心工具&#xff0c;也是理解现代科技的关键。这篇文章将带你走进线性代数的世界&#xff0c;为你揭开这门学科的神秘面纱。 什么是线性代…

【RAG论文精读1】RAG原始论文-针对知识密集型NLP任务的检索增强生成

目录 一、简介一句话简介作者、引用数、时间论文地址开源代码地址 二、摘要三、引言四、整体架构&#xff08;用一个例子来阐明&#xff09;场景例子&#xff1a;核心点&#xff1a; 五、方法 &#xff08;架构各部分详解&#xff09;5.1 模型1. RAG-Sequence Model2. RAG-Toke…

【面试官】谈谈你对顺序栈和链式栈的认识

思维导图 栈&#xff08;Stack&#xff09;是一种数据结构&#xff0c;遵循后进先出&#xff08;LIFO&#xff09;原则。在java中Stack在java.util.Stack中。 一.常用方法的使用 1. push(E item)&#xff1a;把元素压入栈顶。 代码示例&#xff1a; import java.util.Stack;…

信息学奥赛复赛复习14-CSP-J2021-03网络连接-字符串处理、数据类型溢出、数据结构Map、find函数、substr函数

PDF文档回复:20241007 1 P7911 [CSP-J 2021] 网络连接 [题目描述] TCP/IP 协议是网络通信领域的一项重要协议。今天你的任务&#xff0c;就是尝试利用这个协议&#xff0c;还原一个简化后的网络连接场景。 在本问题中&#xff0c;计算机分为两大类&#xff1a;服务机&#x…

【AI知识点】反向传播(Backpropagation)

反向传播&#xff08;Backpropagation&#xff09; 是训练神经网络的核心算法&#xff0c;它通过反向逐层计算损失函数对每个权重的梯度&#xff0c;来反向逐层更新网络的权重&#xff0c;从而最小化损失函数。 一、反向传播的基本概念 1. 前向传播&#xff08;Forward Propag…

安装DNS

在 CentOS 7 上安装并配置 BIND 以实现 DNS 的正向和反向解析可以按照以下步骤进行&#xff1a; 安装 BIND 打开终端并运行以下命令来安装 BIND 及其工具&#xff1a; yum install bind bind-utils -y配置 BIND 编辑主配置文件&#xff1a; 使用文本编辑器打开 BIND 的主配…

双十一购物清单:这五款爆款科技好物绝不能错过!买到就是赚到!

随着一年一度的双十一购物狂欢节即将拉开帷幕&#xff0c;各大电商平台纷纷推出了一系列优惠活动&#xff0c;吸引着无数消费者的目光。对于科技爱好者而言&#xff0c;这无疑是一个绝佳的机会&#xff0c;能够以优惠的价格购得心仪的电子产品和智能设备。然而&#xff0c;在琳…

HTTPS介绍 --- 超详细保姆级知识讲解

目录 一. 认识HTTPS 二. 使用HTTPS加密的重要性 三. HTTPS的工作流程 四. 常见的加密方式 4.1 对称加密 4.2 非对称加密 五. 数据摘要 && 数据指纹 5.1 数据摘要 5.2 数据签名 六. HTTPS加密过程探究 6.1 方案一&#xff1a;只使用对…

晶体规格书及匹配测试

一、晶体参数介绍 晶体的电气规格相对比较简单,如下: 我们逐一看看每个参数, FL就是晶体的振动频率,这个晶体是24.576MHz的。 CL就是负载电容,决定了晶体频率是否准确,包括外接的实际电容、芯片的等效电容以及PCB走线的寄生电容等,核心参数。 Frequency Tolerance是…

骨传导耳机哪个牌子好?五大精选抢手骨传导耳机分享!

在数字化时代背景下&#xff0c;音乐和音频内容已经成为人们日常生活不可或缺的一部分。随着技术的发展&#xff0c;骨传导耳机凭借其独特的传输方式和健康优势&#xff0c;迅速赢得了市场和消费者的青睐。不同于传统耳机通过空气传导声音&#xff0c;骨传导耳机通过骨骼直接传…

《独自骑行与群骑之旅:探索不同的自由与氛围》

在快节奏的现代生活中&#xff0c;骑行作为一种既环保又健康的出行方式&#xff0c;越来越受到人们的青睐。然而&#xff0c;选择一个人骑车还是加入一群人的行列&#xff0c;这不仅仅是一种出行方式的选择&#xff0c;更是一种生活态度和价值观的体现。本文将探讨这两种骑行方…

【读书笔记·VLSI电路设计方法解密】问题1:什么是芯片

芯片&#xff08;集成电路或IC&#xff09;是在半导体材料的薄基底表面上制造的微型电子电路。在功能上&#xff0c;芯片是一种硬件组件&#xff0c;能够执行某些特定的功能。例如&#xff0c;一个简单的芯片可能被设计用来执行逻辑NOR&#xff08;或非&#xff09;的简单功能&…

如何在VSCode上运行C/C++代码

诸神缄默不语-个人CSDN博文目录 我是Win10&#xff0c;其他系统仅供参考。 文章目录 1. 下载所需插件2. 安装编译器3. 不借助编辑器的cpp代码执行3. 建立VSCode cpp项目3.1 c_cpp_properties.json3.2 settings.json3.3 tasks.json 4. 运行C代码参考资料 1. 下载所需插件 2. 安…

记一次N5105 NAS功耗测量

记一次N5105 NAS功耗测量 一、设备说明 HA500机器&#xff0c;N5105CPU&#xff0c;32GB内存。unraid最新6.12.13系统硬盘有一根500G M2硬盘和一个512G sata接口ssd硬盘&#xff0c;用于组成zfs raid 1&#xff0c;作为cache盘位。另外有三个4T机械硬盘&#xff0c;组成21的形…

鸿蒙应用示例:DevEco Testing 工具的常用功能及使用场景

DevEco Studio 是鸿蒙生态中的集成开发环境(IDE)&#xff0c;而 DevEco Testing 工具则是专门用于测试鸿蒙应用的强大工具。本文将详细介绍 DevEco Testing 中几个常用的测试功能及其使用场景&#xff0c;并给出相应的代码示例。 【1】安装应用 使用场景&#xff1a;在鸿蒙系统…

imx6q 的 header.s的理解

首先是 非设备树的。 就是这三个文件。 header 是配置文件。 .c 文件应该是对这个文件的操作。 那么 header 怎么生成呢? 它这里调整好的 应该参数 应该就是 这个 header.s 了。 但是 这个程序 是 设备树的 流程 ,不知道 对于 非设备树 是不是 适用。 然后是设备树的。 设…

基于Arduino的遥控自平衡小车

基于Arduino的遥控自平衡小车 一、项目简介二、所需材料三、理论支持四、外壳设计五、线路连接六、检查MPU6050连接七、烧录库八、PID控制设置九、设置传感器参数十、无线移动控制十一、超声波模块 一、项目简介 一个使用Arduino Nano、MPU-6050以及便宜的6伏直流齿轮电机的自…