1

我正在编写自己的 unix 终端,但在执行命令时遇到了问题:

首先,我获取用户输入并将其存储到缓冲区中,然后将单词分开并将它们存储到我的 argv[] 数组中。即命令是“firefox”来启动存储在 argv[0] 中的 firefox

如何启动命令?这就是我想要做的,但我得到了错误:

void launchProcess(char *command[], char *file){
        pid_t pid;
        pid = fork();
        if (pid == -1) {
                perror("Error when forking");
                exit(EXIT_FAILURE);
        }
        if (pid == 0){                  
                fprintf(stderr, "Child pid = %d\n", getpid());
                execv(file, command);
            }

当我打电话时:

launchProcess(commandArgv, "STANDARD");

我收到以下错误:错误:launchProcess 的类型冲突

4

3 回答 3

8

如果你有一个冲突类型错误,你应该确保你列出的函数与它的声明具有相同的类型。

此外,您可能已经知道,但execv需要一个完全限定的可执行文件路径,所以像“STANDARD”这样的值是行不通的;execvp如果您希望它使用变量PATH来确定二进制文件的位置,请使用。您还应该确保argv数组中的最后一个值是NULL. 最后,一定要检查 ; 的返回值execv。它很可能会失败,例如,如果用户试图执行一个不存在的程序。

于 2009-09-23T02:51:40.407 回答
2

您需要对函数进行原型设计:添加“void launchProcess(char *command[], char *file);” 在您的主要功能之上。

您的数据类型看起来正确,但基于参数名称:“文件”和“命令”,看起来您可能以错误的方式使用该函数。

这是一个不带参数执行 ls 函数的示例。

字符 *args[] = { NULL }; execv("/bin/ls", args);

于 2009-09-23T03:31:24.023 回答
1

这些关于 exec 和 wait 的说明可能会有所帮助。

于 2009-09-23T03:08:38.220 回答