C++执行shell命令的多种实现方法

 更新时间:2021年11月24日 10:43:18   作者:wang 恒  
在linux系统下,用C++程序执行shell命令有多种方式,主要介绍了3中方法,具有一定的参考价值,感兴趣的可以了解一下

在linux系统下,用C++程序执行shell命令有多种方式

1、system(执行shell 命令)

相关函数:fork,execve,waitpid,popen

表头文件:#include<stdlib.h>

函数原型:int system(const char * string);

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

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

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

函数说明: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”);
}

2、popen(建立管道I/O)

相关函数:pipe,mkfifo,pclose,fork,system,fopen

表头文件 #include<stdio.h>

函数原型: FILE * popen( const char * command,const char * type);

函数说明 :popen()会调用fork()产生子进程,然后从子进程中调用/bin/sh -c来执行参数command的指令。参数type可使用“r”代表读取,“w”代表写入。依照此type值,popen()会建立管道连到子进程的标准输出设备或标准输入设备,然后返回一个文件指针。随后进程便可利用此文件指针来读取子进程的输出设备或是写入到子进程的标准输入设备中。此外,所有使用文件指针(FILE*)操作的函数也都可以使用,除了fclose()以外。

返回值: 若成功则返回文件指针,否则返回NULL,错误原因存于errno中。错误代码 EINVAL参数type不合法。

注意事项:在编写具SUID/SGID权限的程序时请尽量避免使用popen(),popen()会继承环境变量,通过环境变量可能会造成系统安全的问题。

范例:

#include<stdio.h>
main()
{
	FILE * fp;
	char buffer[80];
	fp=popen(“cat /etc/passwd”,”r”);
	fgets(buffer,sizeof(buffer),fp);
	printf(“%s”,buffer);
	pclose(fp);
}
执行 root :x:0 0: root: /root: /bin/bash

执行 root :x:0 0: root: /root: /bin/bash

3、使用vfork()新建子进程,然后调用exec函数族

#include<unistd.h>
main()
{
    char * argv[ ]={“ls”,”-al”,”/etc/passwd”,(char*) };
    if(vfork() = =0)
    {
        execv(“/bin/ls”,argv);
    }else{        
        printf(“This is the parent process\n”);
    }
} 

到此这篇关于C++执行shell命令的多种实现方法的文章就介绍到这了,更多相关C++执行shell内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

相关文章

  • C++ Qt开发之ComboBox下拉组合框组件用法详解

    C++ Qt开发之ComboBox下拉组合框组件用法详解

    Qt 是一个跨平台C++图形界面开发库,利用Qt可以快速开发跨平台窗体应用程序,在Qt中,ComboBox(组合框)是一种常用的用户界面控件,它提供了一个下拉列表,允许用户从预定义的选项中选择一个,本文给大家介绍QComboBox类的一些常用方法,需要的朋友可以参考下
    2023-12-12
  • C语言模拟实现扫雷游戏

    C语言模拟实现扫雷游戏

    这篇文章主要为大家详细介绍了C语言模拟实现扫雷游戏,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2021-01-01
  • 解析C++中多层派生时的构造函数及一些特殊形式

    解析C++中多层派生时的构造函数及一些特殊形式

    这篇文章主要介绍了解析C++中多层派生时的构造函数及一些特殊形式,特殊形式主要针对基类和子对象类型的构造函数内容,需要的朋友可以参考下
    2015-09-09
  • C++中的循环引用

    C++中的循环引用

    虽然C++11引入了智能指针的,但是开发人员在与内存的斗争问题上并没有解放,如果我门实用不当仍然有内存泄漏问题,其中智能指针的循环引用缺陷是最大的问题。下面通过实例代码给大家介绍c++中的循环引用,一起看看吧
    2017-09-09
  • C语言直接插入排序算法介绍及示例

    C语言直接插入排序算法介绍及示例

    插入排序是把一个记录插入到已排序的有序序列中,使整个序列在插入该记录后仍然有序。插入排序中较简单的种方法是直接插入排序,其插入位置的确定方法是将待插入的记录与有序区中的各记录自右向左依次比较其关键字值的大小
    2022-08-08
  • C语言内存对齐实例详解

    C语言内存对齐实例详解

    这篇文章主要介绍了C语言内存对齐,包括内存对其的基本概念及用法,以及注意事项,并以实例形式加以说明,需要的朋友可以参考下
    2014-09-09
  • Qt+OpenCV利用帧差法实现车辆识别

    Qt+OpenCV利用帧差法实现车辆识别

    所谓帧差法也就是对连续图像帧做差分运算,其结果与定义好的阈值比较,若大于阈值则为运动目标值为1,否则值为0 。本文将利用帧差法实现车辆识别,感兴趣的可以了解一下
    2022-08-08
  • C语言实现学生成绩管理系统项目

    C语言实现学生成绩管理系统项目

    这篇文章主要为大家详细介绍了C语言实现学生成绩管理系统项目,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2022-01-01
  • C语言内存操作函数使用示例梳理讲解

    C语言内存操作函数使用示例梳理讲解

    这篇文章主要介绍了C语言库函数中的内存操作函数memcpy()、memmove()、memset()、memcmp()使用示例分析,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2022-09-09
  • openCV4.1.1+VS2019环境配置详解

    openCV4.1.1+VS2019环境配置详解

    这篇文章主要介绍了openCV4.1.1+VS2019环境配置详解,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2020-08-08

最新评论