我是靠谱客的博主 柔弱诺言,最近开发中收集的这篇文章主要介绍C++调用shell脚本并传递参数,觉得挺不错的,现在分享给大家,希望可以做个参考。

概述

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;
}

最后

以上就是柔弱诺言为你收集整理的C++调用shell脚本并传递参数的全部内容,希望文章能够帮你解决C++调用shell脚本并传递参数所遇到的程序开发问题。

如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。

本图文内容来源于网友提供,作为学习参考使用,或来自网络收集整理,版权属于原作者所有。
点赞(49)

评论列表共有 0 条评论

立即
投稿
返回
顶部