运行 'grep' 命令使用 exec 函数

Running 'grep' command using exec functions

我正在尝试 运行 使用 execvp 的 grep 命令。我必须将输出保存到 output.txt 这样的输出文件中。我试过的代码如下:

#include<iostream>
#include<unistd.h>
#include<stdio.h>
#include<stdlib.h>
#include<sys/types.h>
#include<sys/wait.h>
using namespace std;
int main(){
    pid_t pid = fork();
    int status = 0;
    char* args[] = {"grep", "-n", "out", "*", ">", "output.txt", NULL};
    //char* args[] = {"out", "/os_lab/assign_01/*", "/usr", NULL};
    if(pid == 0){
        cout<<"I am Child Process\n";
        status = 2;
        execvp("grep", args);
    }
    else if(pid > 0){
        cout<<"I am Parent Process\n";
        wait(&status);
    }   
    else{
        cout<<"Error in system call\n";
    }

    return 0;
}

当我运行这段代码时,终端输出如下:

I am Parent Process
I am Child Process
grep: *: No such file or directory
grep: >: No such file or directory

execvp() 函数直接调用程序并使用提供的参数执行它。 wildcards* 的使用由 shell 终端提供,因此 grep* 理解为一个文件 grep'ed .

如果您想使用通配符和运算符 > 调用 grap,您应该在 C++ 上使用函数 system()

以下代码应该有效:

#include<iostream>
#include<unistd.h>
#include<stdio.h>
#include<stdlib.h>
#include<sys/types.h>
#include<sys/wait.h>
using namespace std;
int main(){
    pid_t pid = fork();
    int status = 0;
    //char* args[] = {"grep", "-n", "out", "*", ">", "output.txt", NULL};

    
    //char* args[] = {"out", "/os_lab/assign_01/*", "/usr", NULL};
    if(pid == 0){
        cout<<"I am Child Process\n";
        status = 2;
        //execvp("grep", args);
        system("grep -n out * > output.txt");
    }
    else if(pid > 0){
        cout<<"I am Parent Process\n";
        wait(&status);
    }   
    else{
        cout<<"Error in system call\n";
    }

    return 0;
}