C++调用shell脚本并传递参数

2023-05-16

C++调用脚本的两种方式

1. system()

—执行shell命令也就是向dos发送一条指令,
system()会调用fork()产生子进程,由子进程来调用/bin/sh-c string来执行参数string字符串所代表的命令,此命令执行完后随即返回原调用的进程。

//相关函数:fork, execve, waitpid, popen
#include <stdlib.h> //头文件
int system(const char * string);//定义函数
  • 函数说明
    system()会调用fork()产生子进程,由子进程来调用/bin/sh-c string来执行参数string字符串所代表的命令,此命令执行完后随即返回原调用的进程。
  • 返回值
    1、system()在调用/bin/sh时失败则返回127, 其他失败原因返回-1
    2、若参数string 为空指针(NULL), 则返回非零值.
    3、system()调用成功则最后会返回执行shell 命令后的返回值,但是此返回值也有可能为system()调用/bin/sh失败所返回的127,因此最好能再检查errno来确认执行成功
  • 特点
    1、根据返回值判断执行结果比较繁琐
    2、无法去的shell脚本返回值
    3、用system()来调用一个shell命令,或较短的shell脚本。较为方便

2. popen()

进程I/O函数,与pclose函数一起使用

#include <stdio.h> //头文件
//函数定义
/*
函数功能:popen()会调用fork()产生子进程,然后从子进程中调用/bin/sh -c来执行参数command的指令。
	     参数type可使用“r”代表读取,“w”代表写入。
	    依照此type值,popen()会建立管道连到子进程的标准输出设备或标准输入设备,然后返回一个文件指针。
	    随后进程便可利用此文件指针来读取子进程的输出设备或是写入到子进程的标准输入设备中
返回值:若成功则返回文件指针,否则返回NULL,错误原因存于errno中
*/
FILE * popen ( const char * command , const char * type );
/*
函数功能:pclose()用来关闭由popen所建立的管道及文件指针。参数stream为先前由popen()所返回的文件指针
返回值:若成功返回shell的终止状态(也即子进程的终止状态),若出错返回-1,错误原因存于errno中
*/
int pclose ( FILE * stream );
  • 函数说明
    1、popen() 函数通过创建一个管道,调用 fork 产生一个子进程,执行一个 shell 以运行命令来开启一个进程。
    2、这个进程必须由 pclose() 函数关闭,而不是 fclose() 函数。pclose() 函数关闭标准 I/O 流,等待命令执行结束,然后返回 shell 的终止状态。
    3、如果 shell 不能被执行,则 pclose() 返回的终止状态与 shell 已执行 exit 一样

  • 返回值
    调用 fork() 或 pipe() 失败,或者不能分配内存将返回NULL,否则返回标准 I/O 流

  • 特点
    1、用 创建管道 的 方式 启动 一个 进程, 并调用 shell
    2、可在程序内部获取shell执行后的返回内容

c++ 调用shell脚本并传递参数案例

  • test.sh
#! /bin/bash
# 判断门户网站是否能够正常提供服务

#定义变量
#web_server=https://down.sandai.net/thunder11/XunLeiWebSetup11.3.10.1912gw.exe
#访问默认网站
#wget -P /shell/ $web_server &>/dev/null

#访问参数传入网站
wget -P /shell/ $1 &>/dev/null
[ $? -eq 0 ] && echo "当前网站服务是ok" && rm -f /shell/index.* || echo "当前网站服务不ok,请立刻处理"

if [  -e upgrede.txt ]; then
        echo "upgrede system!"
fi
  • main.c
#include <iostream>
#include <cstring>
#include <cstdlib>
#include <unistd.h>

int main()
{
    char strone[]="/root/shellScript/upgradeProgram.sh";//脚本文件所在的完整路径
    char strtwo[]=" https://down.sandai.net/thunder11/XunLeiWebSetup11.3.10.1912gw.exe"; //删除文件中包含dd内容的行
    strcat(strone,strtwo);
    system(strone);
    return 0;
}
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

C++调用shell脚本并传递参数 的相关文章

  • 如何从 C 文件更改终端中的目录

    如何从 C 程序更改将在终端上生效的目录 实际上不要告诉 system 函数或 chdir 函数 这些仅适用于 C 中的进程或子 shell 假设我正在从 bash shell 执行一个 C 程序 其进程 ID 为 10223 那么 我可以
  • 使用 Jenkins 运行 ios-sim

    我正在尝试使用以下命令从命令行启动我的应用程序ios sim https github com downloads pegli ios sim ios sim xcode4 3 tar gz但这就是我得到的 Started by user
  • 使用脚本自动输入 SSH 密码

    我需要创建一个自动向 OpenSSH 输入密码的脚本ssh client 假设我需要通过 SSH 进入myname somehost用密码a1234b 我已经尝试过 bin myssh sh ssh myname somehost a123
  • shell脚本“x$VARIABLE”中x的用途[重复]

    这个问题在这里已经有答案了 我正在查看一些 shell 脚本 comarison shcu 中 x 的用途是什么 if x USER x RUN AS USER then su RUN AS USER c CATALINA HOME bin
  • 是否有可能在linux中找到包含特定文本的文件?

    考虑这种情况 我在文件夹 Example 下有很多文件 如果我需要找到一个包含特定短语 如 Class Example 的文件 我该如何使用 Linux shell 来做到这一点 linux中有类似 定位 的函数可以做到这一点吗 Thank
  • 在powershell中检查文件是否可读且正常

    我是 powershell 新手 我想检查文件是否可读且正常 在 unix 中 我们可以使用 f 和 r 在一行中完成此操作 例如 以下 shell 脚本函数接受文件名作为参数并检查文件的可读性和规律性 与此等效的 powershell 是
  • 列出破折号中当前定义的函数?

    我想列出当前定义的函数dash 有什么办法可以做到这一点吗 我能想到的最接近的是type它可以用来测试一个函数是否存在 但除此之外我很困惑 附 我说的是dash在这里 不是bash or zsh 看看 exec c 似乎没有 没有 表是静态
  • 如何让“grep”从文件中读取模式?

    假设有一个很大的文本文件 我只想打印与某些模式不匹配的行 显然 我可以使用egrep v patter1 pattern2 pattern3 现在 如果所有这些模式都在一个文本文件中怎么办 最好的制作方法是什么egrep从文件中读取模式 g
  • 如何将 bash 脚本的整个输出保存到文件

    我正在尝试将 bash 脚本的整个输出保存到文件中 我目前在代码开头有一个参数 ip 地址 如下所示 bin bash USAGE Usage 0
  • 在 Fish Shell 中设置导出

    我安装了多个版本的 PHP 对于我的正常开发 我总是使用通过自制程序安装的 PHP 5 5 x 在鱼壳里 which php php version gt usr local bin php gt PHP 5 5 8 cli built J
  • 给出 5 个参数,但在终端中只得到 3 个参数

    我想将一个文件传递给一个c 程序 如果我在 IDE 中执行此操作 test string string lt test txt return argc 5 但在终端上我刚刚得到argc 3 看来 这是因为 什么是 lt 意思是 我正在使用
  • shell_exec 的输出被截断为 100 个字符

    当在 shell 中运行以下命令时 curl F file filename http 192 168 0 1 产生以下输出 Accuracy 0 0 1 classification Accuracy 0 0 1 classificati
  • xsel -o 对于 OS X 等效项

    是否有一个等效的解决方案可以在 OS X 中抓取选定的文本 就像适用于 Linux 的 xsel o 一样 只需要当前的选择 这样我就可以在 shell 脚本中使用文本 干杯 埃里克 你也许可以安装xsel在 MacOS 上 更新 根据 A
  • awk: hping: 打印 icmp 发起/接收之间的差异

    我有以下输出hping http ports su net hping在 OpenBSD 上 hping icmp ts www openbsd org HPING www openbsd org re0 129 128 5 194 icm
  • 使用 find - 删除除任何一个之外的所有文件/目录(在 Linux 中)

    如果我们想删除我们使用的所有文件和目录 rm rf 但是 如果我希望一次性删除除一个特定文件之外的所有文件和目录怎么办 有什么命令可以做到这一点吗 rm rf 可以轻松地一次性删除 甚至可以删除我最喜欢的文件 目录 提前致谢 find ht
  • ReferenceError:MongoDB shell 中未定义 require

    我尝试通过 Windows 命令 Windows 8 1 从 Mongo 客户端连接 MongoDB 当我使用require 在 javascript 中 我遇到如下错误 有人有同样的问题吗 我有错过任何一个吗require有关的npm安装
  • Mongodb shell mongo:通常只允许每个套接字地址(协议/网络地址/端口)使用一次。对于套接字:0.0.0.0:27017

    前两天还好好的 现在mongod不起作用 甚至echo ps A grep mongo没有打印任何内容 但它警告错误 每个套接字地址只有一种用途 怎么杀掉它 我也尝试过不同的随机端口 他们怎么可能也失败呢 D mongodb win32 x
  • 通过powershell运行ADB命令

    所以我尝试通过 powershell 脚本运行一些 ADB 命令 这是我正在尝试做的一个简单示例 adb shell echo in adb shell su root echo you are now root ls cd data da
  • 如何在 shell 脚本中操作 $PATH 元素?

    有没有一种惯用的方法从类似 PATH 的 shell 变量中删除元素 这就是我想要的 PATH home joe bin usr local bin usr bin bin path to app bin and remove or rep
  • 如何在 Linux shell 中将十六进制转换为 ASCII 字符?

    假设我有一个字符串5a 这是 ASCII 字母的十六进制表示Z 我需要找到一个 Linux shell 命令 它将接受一个十六进制字符串并输出该十六进制字符串代表的 ASCII 字符 所以如果我这样做 echo 5a command im

随机推荐

  • 李群、李代数在SLAM中的应用

    文章目录 李群 李代数李群 李代书与坐标变换的对应关系SE 3 上的李代数求导数左乘扰动 右乘扰动怎么选取用左or右扰动 xff1f SLAM中的使用重投影误差误差项构建对应C 43 43 代码雅克比矩阵frame i的Ti2w从IMU坐标
  • ubuntu 系统安装与问题汇总

    文章目录 ubuntu 系统前期准备系统安装系统安装后显卡驱动问题设置win与ubuntu系统的启动顺序双系统时间问题系统显卡驱动选择意外状况 黑屏无法开机 重刷系统 ubuntu 系统 前期准备 硬盘分区设置BIOS选项 把快速启动关闭把
  • g2o中的核函数

    文章目录 g2o中的核函数RobustKernelHuber函数 g2o中的核函数 作用限制误差较大的edge对最终优化结果的影响 RobustKernelHuber函数 g2o中的class名称 xff1a class RobustKer
  • Eigen库参考博文

    记录一些看过的相关博客的介绍网站 动态大小的矩阵MatrixXd VectorXd
  • Illegal modifier for parameter *** , only final is permitted”

    大家好 xff0c 我想在main函数中定义一个public变量 xff0c 系统报错说 Illegal modifier for parameter chatRoom only final is permitted xff0c 如果把pu
  • C++基础学习

    文章目录 编译内存相关编译变量与内存分区内存分区变量类型 内存对齐内存泄露智能指针include 34 34 和 lt gt 语言对比c 43 43 11自动类型推导lembda 表达式 xff08 匿名函数 xff09 范围for del
  • C++ STL底层实现

    文章目录 STL库的底层实现arrayvectordequelistforward listset mapunordered map unordered set迭代器 STL库的底层实现 顺序容器 array数组vector向量deque双
  • kali爆破WiFi

    kali暴力破解WiFi密码实验步骤 建议在kali的root模式下进行 实验条件 xff1a window7下的VMware装的kali 2020 某宝买的无线 网卡 xff0c 注意 xff0c 有些厂家的网卡不支持Linux系统 xf
  • Nacos全面解析

    目录 一 Nacos概要 1 Nacos简介 2 Nacos安装 3 Nacos配置外部数据源 二 Nacos应用 1 注册发现 2 负载均衡 3 配置中心 4 多环境切换 5 配置刷新 6 共享 扩展配置 7 灰度发布 一 Nacos概要
  • Mysql性能调优

    目录 一 Mysql架构设计 1 Mysql架构图 二 Mysql常见的存储引擎 1 InnoDB引擎 2 MyISAM存储引擎 3 MEMORY存储引擎 三 Mysql索引 1 索引的分类 2 mysql中空值和null的区别 3 mys
  • Elasticsearch模糊查询精讲

    目录 一 3种模糊查询的区别 以及 常用的查询手段 1 wildcard 2 prefix 3 fuzzy 4 exists query 二 terms set 主要用于数组检索 1 数据准备 2 minimum should match
  • JRebel激活教程

    1 在idea的plugins中搜索jrebel进行安装插件 2 重启idea 3 激活jrebel 下载代理地址 Release v1 4 ilanyu ReverseProxy GitHub 双击下载的exe文件 在idea中找到激活界
  • Invalid bound statement (not found)异常解决

    问题描述以及解决思路 xff1a 1 我这里用的若依微服务框架 2 新建一个user模块ruoyi user 3 启动后报错mapper映射有问题Invalid bound statement not found 截图如下 4 报错后就开始
  • Linux防火墙添加白名单

    查看防火墙状态 systemctl status firewalld 开启防火墙 systemctl start firewalld service 开机启动防火墙 systemctl enable firewalld service 关闭
  • stream流对集合进行排序,取集合的topN

    package com tangbb test1 import java util ArrayList import java util Comparator import java util List import java util s
  • 1487 北极通讯网络

    1487 北极通讯网络 这个题就是用来维护一个最短路径吧 也不难 xff0c 就是用来求最小生成树的第k条边 并且 xff0c 这貌似和并查集还有一定的关系 我太傻了 xff0c 这里生成树的方法就是krusal xff0c 我居然想 xf
  • mybatis实现批量插入

    1 首先 创建一个简单的insert语句 lt insert id 61 insertname gt insert into names name values value lt insert gt 2 然后在java代码中像下面这样执行批
  • java实现简单的用户登录包含token

    要实现简单的用户登录包含token xff0c 可以按照以下步骤进行 xff1a 创建一个用户表 xff0c 在表中存储用户的用户名和密码等信息 当用户登录时 xff0c 首先检查用户提交的用户名和密码是否正确 xff0c 如果正确则生成一
  • tar.gz压缩,查看,解压

    压缩 span class token function tar span czf jpg tar gz jpg 将目录里所有jpg文件打包成jpg tar后 xff0c 并且将其用gzip压缩 xff0c 生成一个gzip压缩过的包 xf
  • C++调用shell脚本并传递参数

    C 43 43 调用脚本的两种方式 1 system 执行shell命令也就是向dos发送一条指令 xff0c system 会调用fork 产生子进程 xff0c 由子进程来调用 bin sh c string来执行参数string字符串