如何使用execvp()函数

26
用户将读取一行文本,我将保留第一个单词作为execvp的命令。比如说,如果他输入"cat file.txt",那么命令就是cat。但我不确定如何使用execvp(),我读了一些教程但仍然不理解。

用户将读取一行文本,我将保留第一个单词作为execvp的命令。

比如说,如果他输入"cat file.txt",那么命令就是cat。但我不确定如何使用execvp(),我读了一些教程但仍然不理解。

#include <stdio.h>
#include <stdlib.h>

int main()
{
    char *buf;
    char command[32];
    char name[32];
    char *pointer;
    char line[80];
    printf(">");

    while((buf = readline(""))!=NULL){   
        if (strcmp(buf,"exit")==0)
        break;

        if(buf[0]!=NULL)
        add_history(buf);

        pointer = strtok(buf, " ");
        if(pointer != NULL){
            strcpy(command, pointer);
        }

        pid_t pid;

        int  status;

        if ((pid = fork()) < 0) {     
            printf("*** ERROR: forking child process failed\n");
            exit(1);
        }
        else if (pid == 0) {          
            if (execvp(command, buf) < 0) {     
                printf("*** ERROR: exec failed\n");
                exit(1);
            }
        }
        else                                  
        while (wait(&status) != pid)       
            ;
        free(buf);
        printf(">");
    }///end While
    return 0;
}

1
你是说你不懂吗?请具体说明一下。 - SSC
2
我不知道在execvp中需要传递哪些参数。 - Axl
2个回答

61

第一个参数是您想要执行的文件,第二个参数是一个由以空字符结尾的字符串组成的数组,表示在man页中指定的文件所需的适当参数。

例如:

char *cmd = "ls";
char *argv[3];
argv[0] = "ls";
argv[1] = "-la";
argv[2] = NULL;

execvp(cmd, argv); //This will run "ls -la" as if it were a command

2
这段代码有点用,但我该如何让*argv包含cmd后面的其余行呢?就像这样分割令牌:pointer = strtok(buf, " ");如果(pointer!= NULL){strcpy(command,pointer);}pointer = strtok(NULL," ");如果(pointer!= NULL){strcpy(name,pointer);}我可以这样做char * argv [3] = {name,“\ 0”};execvp(command,name);吗? - Axl
1
@Axl 不确定你在问什么。这是一个单独的问题吗? - Ricky Mutschlechner
5
我想我现在明白了 - 你正在尝试创建一个shell,对吗?只需编写一个函数,在接收用户输入后将其拆分。因此,如果用户输入“ls -la”,请编写一个函数,将该字符串按空格拆分,然后设置cmd = split [0],argv [0] = split [0],argv [1] = split [2],而argv [3] = NULL,则适当。这有帮助吗? - Ricky Mutschlechner
1
只需要进行一个小的修正,即字符数组指针的初始化: 第一行应该是:char *cmd = "ls"; - Aditya Gaykar
我知道这是一个相当老的帖子,但我仍然不知道如何处理当我想要在当前正在运行的程序中使用execvp启动第二个程序。为此,我有两个程序的单独路径。例如:Project3\x64\Debug\Project3.exe和Project4\x64\Debug\Project4.exe。 - Andreas
显示剩余4条评论

0
在 C++ 中,当使用 execvp 时,需要特别注意字符串类型:
#include <iostream>
#include <string>
#include <cstring>
#include <stdio.h>
#include <unistd.h>
using namespace std;

const size_t MAX_ARGC = 15; // 1 command + # of arguments
char* argv[MAX_ARGC + 1]; // Needs +1 because of the null terminator at the end
// c_str() converts string to const char*, strdup converts const char* to char*
argv[0] = strdup(command.c_str());

// start filling up the arguments after the first command
size_t arg_i = 1;
while (cin && arg_i < MAX_ARGC) {
    string arg;
    cin >> arg;
    if (arg.empty()) {
        argv[arg_i] = nullptr;
        break;
    } else {
        argv[arg_i] = strdup(arg.c_str());
    }
    ++arg_i;
}

// Run the command with arguments
if (execvp(command.c_str(), argv) == -1) {
    // Print error if command not found
    cerr << "command '" << command << "' not found\n";
}

參考資料: execlp、execvp的用法和範例


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接