system函数返回值

article/2025/8/22 17:08:04

  system(执行shell 命令)

  相关函数  fork,execve,waitpid,popen

  表头文件  #include<stdlib.h>

  定义函数  int system(const char * string);

  函数说明  system()会调用fork()产生子进程,由子进程来调用/bin/sh-c string来执行参数string字符串所代表的命令,此命令执行完后随即返回原调用的进程。在调用system()期间SIGCHLD 信号会被暂时搁置,SIGINT和SIGQUIT 信号则会被忽略。

  返回值  如果system()在调用/bin/sh时失败则返回127,其他失败原因返回-1。若参数string为空指针(NULL),则返回非零值。如果system()调用成功则最后会返回执行shell命令后的返回值,但是此返回值也有可能为system()调用/bin/sh失败所返回的127,因此最好能再检查errno 来确认执行成功。

  附加说明  在编写具有SUID/SGID权限的程序时请勿使用system(),system()会继承环境变量,通过环境变量可能会造成系统安全的问题。

  范例  #include<stdlib.h>

  main()

  {

  system(“ls -al /etc/passwd /etc/shadow”);

  }

  执行  -rw-r--r-- 1 root root 705 Sep 3 13 :52 /etc/passwd

  -r--------- 1 root root 572 Sep 2 15 :34 /etc/shadow


       Upon successful completion, the system subroutine returns the exit status of the shell. The exit status of the shell
       is returned in the same manner as a call to the wait or waitpid subroutine, using the structures in the sys/wait.h
       file.

       If the String parameter is a null pointer and a command processor is available, the system subroutine returns a
       nonzero value. If the fork subroutine fails or if the exit status of the shell cannot be obtained, the system
       subroutine returns a value of -1. If the exec l subroutine fails, the system subroutine returns a value of 127. In
       all cases, the errno global variable is set to indicate the error.

----------------------------------------------------------------------------------------------------------------------------------------------------

linux中system函数的返回值

刚用到system函数,要根据其返回值来做进一步操作,可是system的返回值并不等于其调用的程序的返回值,man了没看懂,后来在网上搜索了一下,终于看到了一个DX的理解,记录之。

引自:原文

要分成两部分来说:
1,在程序中,用exit来设置进程的退出值时,虽然该函数的参数类型为int型,但再父进程中只能取到其值的低8位.所以用exit返回值时,高于255的值是没有意义的.

2,对于system函数,返回值是由两部分组成的,低8位值表示所执行的脚本在执行过程中所接收到的信号值,其余的位表示的脚本exit退出时所设置的值,

即脚本内exit退出是的值的低8位,在system返回值的低9-16位


这样我们就可以通过右移操作来得到exit的值了。

 

----------------------------------------------------------------------------------------------------------------------------------------------------

 

以下转自:http://zhangwenxin82.blog.163.com/blog/static/1145959562010323103241387/

 

1,在程序中,用exit来设置进程的退出值时,虽然该函数的参数类型为int型,但再父进程中只能取到其值的低8位.所以用exit返回值时,高于255的值是没有意义的.

2,对于system函数,返回值是由两部分组成的,低8位值表示所执行的脚本在执行过程中所接收到的信号值,其余的位表示的脚本exit退出时所设置的值,

即脚本内exit退出是的值的低8位,在system返回值的低9-16位.

Linux中调用 system的返回值   system函数返回值 - wilson - Wilsons blogsystem函数返回值 - wilson - Wilsons blog  CSDN Blog推出文章指数概念,文章指数是对Blog文章综合评分后推算出的,综合评分项分别是该文章的点击量,回复次数,被网摘收录数量,文章长度和文章类型;满分100,每月更新一次.

包含文件
#include <stdio.h>
#include <stdlib.h>
#include <errno.h>
先写一个被调用的函数
==================================
#include <iostream>
int main()
{
printf("Return 10./n");
return 10;
}
==================================
编译后生成一个"rt"的可执行文件
运行结果
==================================
Return 10.
==================================
再写一个调用system的程序
==================================
#include <stdio.h>;
#include <stdlib.h>;
#include <sys/wait.h>;
#include <sys/types.h>;

int main()
{

        pid_t status ;

       int errno = 0 ;
        status = system("./rt") ;

printf("wifexited(status):%d/n",WIFEXITED(status));
printf("WEXITSTATUS(status):%d/n",WEXITSTATUS(status));
        if (status == -1)
                printf("system error!") ;

        if (WIFEXITED(status)){
                printf("cp exit normal![%d]/n", errno) ;
                printf("exit staus = [%X]/n", WEXITSTATUS(status)) ;
        }else
                printf("cp exit illegal![%d]/n", errno) ;
}
~
[tiantao@probe sys_test]$ cat sys_test.cpp
#include <stdio.h>;
#include <stdlib.h>;
#include <sys/wait.h>;
#include <sys/types.h>;

int main()
{
       
        pid_t status ;
       
       int errno = 0 ;
        status = system("./rt") ;
       
printf("wifexited(status):%d/n",WIFEXITED(status));//非零代表system执行正常
printf("WEXITSTATUS(status):%d/n",WEXITSTATUS(status));//是指令的返回值
        if (status == -1)
                printf("system error!") ;
       
        if (WIFEXITED(status)){
                printf("cp exit normal![%d]/n", errno) ;
                printf("exit staus = [%X]/n", WEXITSTATUS(status)) ;
        }else
                printf("cp exit illegal![%d]/n", errno) ;
}

==================================
编译后运行结果
==================================
Return 10.
wifexited(status):1
WEXITSTATUS(status):10
cp exit normal![0]
exit staus = [A]
==================================
可以看到:
WEXITSTATUS(status)可以得到调用程序的返回值。


http://chatgpt.dhexx.cn/article/A2m6GMVo.shtml

相关文章

c++system函数

希望各位给个赞&#xff0c;来个关注&#xff0c;100%回关 前言 system是一个比较常用的函数&#xff0c;说白了就是dos指令&#xff0c;下面说几个常用的 所需头文件&#xff1a;windows.h 1.system("cls") cls的作用是清屏,会把控制台都清空 #include<iostream&…

system函数

system函数的头文件: #include<stdlib.h>(我喜欢用万能头) 这是一个很好的用来 坑人 的函数 system(“cls”)可以实现清屏操作 #include<bits/stdc.h> #include<windows.h>//Sleep函数 using namespace std; int main() { cout<<“abcdefg”; Sleep(50…

system 函数常用方法

Hello&#xff0c;又见到你了&#xff0c;今天继续来介绍system函数的用法&#xff1b; 如果你的扫毒软件拦截了这个&#xff0c;说是病毒&#xff0c;不用怕&#xff0c;把它关了&#xff0c;我保证它不是病毒&#xff0c;关了之后就可以用了 1&#xff0c;首先登场的就是 sys…

对于强化学习的梳理

强化学习&#xff08;增强学习&#xff09; 概述 知识联系 强化学习是属于机器学习的一种&#xff0c;机器学习主要分监督学习、非监督学习、半监督学习、增强学习。 强化学习的核心逻辑&#xff0c;那就是智能体&#xff08;Agent&#xff09;可以在环境&#xff08;Envir…

多智能体强化学习:合作关系设定下的多智能体强化学习

0 前言 在多智能体系统中&#xff0c;一个智能体未必能观测到全局状态 S。设第 i 号智能体有一个局部观测&#xff0c;它是S的一部分。 我们假设所有的局部观测的总和构成了全局状态 1 合作关系设定下的策略学习 MARL 中的 完全合作关系 (Fully-Cooperative) 意思是所有智能…

强化学习基础

https://www.toutiao.com/a6641864763305361927/ 2019-01-02 19:47:27 内容目录&#xff1a; 一、强化学习的成功 二、概念和基础 2.1设计强化学习系统 2.2人工智能环境类型 三、问题公式化 3.1数学公式 3.2马尔可夫决策过程 3.3价值函数 四、RL训练术语 4.1基于模型…

强化学习基础05——gym

OpenAI gym OpenAI gym是强化学习最常用的标准库&#xff0c;如果研究强化学习&#xff0c;肯定会用到gym。 gym有几大类控制问题&#xff0c;第一种是经典控制问题,比如cart pole和pendulum。 Cart pole要求给小车一个左右的力&#xff0c;移动小车&#xff0c;让他们的杆子…

联邦强化学习

本博客地址&#xff1a;https://security.blog.csdn.net/article/details/123710121 一、联邦强化学习介绍 强化学习&#xff08;RL&#xff09;是机器学习的一个分支&#xff0c;主要研究序列决策问题&#xff0c;强化学习系统通常由一个动态环境和与环境进行交互的一个或多…

初探强化学习(7)基于模型的强化学习的应用综述

本文是直接翻译一篇文章的&#xff0c;我先把原文地址放在这里。 原文名字为&#xff1a;Survey of Model-Based Reinforcement Learning: Applications on Robotics 这是一个2017年的论文 1. Introduction 强化学习&#xff08;Regulation Learning&#xff0c;RL&#xff0…

强化学习常见案例

文章目录 1. 有趣的强化学习视频1.1 小红小蓝捉迷藏1.2 红球绿球1.3 OpenAI机器人跑步1.4 OpenAI赛艇游戏&#xff08;CoastRunners&#xff09; 2.可以交互操作的游戏2.1 GridWorld2.2 Puck world 入门强化学习的时候&#xff0c;看到许多教程都给了很多强化学习的例子&#x…

多任务深度强化学习入门

理论概述 多任务深度强化学习&#xff0c;英文Multi-Task Deep Reinforcement Learning &#xff0c;简称MTDRL或MTRL。于MARL不同&#xff0c;它可以是单智能体多任务的情况&#xff0c;也可以是多智能体多任务的情况。 现在的深度强化学习领域虽然在很多特定任务上有着超越…

初探强化学习(11)Dyna类型的强化学习

为什么研究Dyna类型的强化学习呢&#xff1f; 主要是因为这个类型的强化学习是融合了model-based和model free两个类型的强化学习。 主要参考的博客是这个。说实话&#xff0c;我也是时隔三天后&#xff0c;第三次看了这个博客才彻底明白的。至于为什么名师&#xff0c;是因为我…

强化学习笔记:强化学习的约束

1 所需的样本数量过大 深度强化学习一个严重的问题在于需要巨大的样本量。举个例子&#xff0c;玩Atari游戏 图 19.17 中纵轴是算法的分数与 人类分数的比值&#xff0c; 100% 表示达到人类玩家的水准。 图中横轴是收集到的游戏帧数&#xff0c;即样本数量。 Rainbow DQN 需…

强化学习的模型

文章目录 前言一、强化学习是什么&#xff1f;二、基本模型1.基本框架2.学习过程 三.马尔科夫决策过程&#xff08;Markov Decision Process. MDP&#xff09;1.马尔科夫性质2.MDP的基本组成部分3.MDP的基本流程 四、基于模型和免模型的强化学习1.模型2.基于模型的强化学习&…

深度强化学习调研

深度强化学习&#xff08;DRL&#xff09; &#xff08;一&#xff09;强化学习 强化学习&#xff08;Reinforcement Learning&#xff0c;简称RL&#xff09;是机器学习领域的一个研究热点&#xff0c;当前已经广泛应用于工业制造、仿真模拟、机器人控制、优化与调度、游戏博…

强化学习总结

强化学习 一、强化学习概述 1.强化学习简介 强化学习最早可以追溯到早期控制论以及统计、心理学、神经科学、计算机科学等学科的一些研究。在最近的五到十年中&#xff0c;强化学习在机器学习和人工智能研究者中得到了大量的关注&#xff0c;它描绘了一种在不进行具体指导的情…

强化学习介绍

文章目录 1 什么是强化学习&#xff1f;2 强化学习的特征与特点3 强化学习的要素与框架3.1 Policy3.2 Reward3.3 Value3.4 model3.5 Return(cumulative future reward) 回报|未来累积回报3.6 Discounted return 折扣回报 4 强化学习流程5 例子 马里奥 &#xff08;一定要看&…

强化学习(Q-learning)

强化学习RF简介 强化学习是机器学习中的一种重要类型&#xff0c;一个其中特工通过 执行操作并查看查询查询结果来学习如何在环境中表现行为。 机器学习算法可以分为3种&#xff1a;有监督学习&#xff08;Supervised Learning&#xff09;、无监督学习&#xff08;Unsupervi…

强化学习简介

强化学习简介 强化学习(Reinforcement Learning&#xff0c;RL)是机器学习中的一个领域&#xff0c;是学习做什么&#xff08;即如何把当前的情景映射成动作&#xff09;才能使得数值化的收益最大化,学习者不会被告知应该采取什么动作&#xff0c;而是必须自己通过尝试去发现哪…

强化学习(一):简介——什么是强化学习?

本文将介绍强化学习的基本含义&#xff0c;了解什么是强化学习、强化学习的概念与基本框架以及强化学习中常见的问题类型。 什么是强化学习&#xff1f; 强化学习&#xff08;Reinforcement Learning, RL&#xff09;&#xff0c;又称再励学习、评价学习或增强学习&#xff0c…