设为首页 加入收藏

TOP

C++执行Linux Bash命令的方法教程
2018-01-30 12:42:01 】 浏览:182
Tags:执行 Linux Bash 命令 方法 教程

方法一:fopen()函数

#include<cstdlib>
#include<string>
#include<cstdio>
#include<cstring>
#include<iostream>
#include<algorithm>
using namespace std;

const int N = 300;

void Test(void){
    char line[N];
    FILE *fp;
    string cmd = "ps -ef| grep java | awk '{print $2}'";
    ////引号内是你的linux指令
    // 系统调用
    const char *sysCommand = cmd.data();
    if ((fp = popen(sysCommand, "r")) == NULL) {
        cout << "error" << endl;
        return;
    }
    while (fgets(line, sizeof(line)-1, fp) != NULL){
        cout << line ;
    }
    pclose(fp);
}

int main(){
    Test();

    return 0;
}

注意:

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

popen()会调用fork()产生子进程,然后从子进程中调用ps -ef| grep java | awk ‘{print $2}’来执行参数command的指令。参数type可使用“r”代表读取,“w”代表写入。popen()会建立管道连到子进程的标准输

出设备或标准输入设备,然后返回一个文件指针。随后进程便可利

用此文件指针来读取子进程的输出设备或是写入到子进程的标准输

入设备中。此外,所有使用文件指针(FILE*)操作的函数也都可以使

用,除了fclose()以外。

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

或者,更简单的:

方法二:system()函数

    #include <cstdlib>
    int main()
    {   
        system("ps -ef| grep java");
        //括号内是你的linux指令
        return 0;
   }

注意:system()会调用fork()产生子进程,由子进程来调用”ps -ef| grep java ” 这个string来执行参数string字符串所代表的命令,此命令执行完后随即返回原调用的进程。所以相比于直接执行 ps -ef| grep java , 用这个system()调用会多一个进程id。

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

】【打印繁体】【投稿】【收藏】 【推荐】【举报】【评论】 【关闭】 【返回顶部
上一篇苹果和虫子问题C++ 下一篇c++函数重载实例讲解

最新文章

热门文章

Hot 文章

Python

C 语言

C++基础

大数据基础

linux编程基础

C/C++面试题目