gpt4 book ai didi

c - 为什么 ls 不能与 execvp 一起工作?

转载 作者:塔克拉玛干 更新时间:2023-11-02 23:55:30 25 4
gpt4 key购买 nike

我有一项任务要求我编写一个迷你 shell - 可以获取执行命令、执行它并等待更多命令的东西。

当我将命令 ls . 传递给这个 mini-shell 时,它会打印当前目录的竞赛。当我传递给它 ls 时,它什么也不打印。为什么?

这是我的代码:

#include <stdio.h>
#include <sys/types.h>
#include <sys/wait.h>
#include <string.h>
#include <unistd.h>
#include <assert.h>
#include <stdlib.h>
#include <stdbool.h>
#define MAX_CMD_SIZE 40
char** parse(char*);//will parse the arguments for the execv/excevp commands.

int main(int argc, char** argv)
{
bool debug = false;
assert(argc <= 2);
if (argc == 2)
{
//check for string -debug
debug = true;
}
if (debug)
printf("INFO: Father started PID[%d]\n", getpid());
char *command = malloc(MAX_CMD_SIZE);
while(true)
{
printf("minishell> ");
fgets(command, MAX_CMD_SIZE, stdin);
if (strcmp(command, "exit\n") == 0)
return 0;
pid_t pid = fork();
assert(pid >= 0);
if (pid == 0) //child
{
if (debug)
printf("INFO: Child started PID[%d]\n", getpid());
char** buf = parse(command);
if (debug)
{
int i;
for (i = 0; buf[i]; i++)
printf("INFO: buf[%d] = %s\n",i,buf[i]);
}
execvp(buf[0],buf);
return 0;
}
else //father
{
int status;
wait(&status);
if (debug)
printf("INFO: Child with PID[%d]terminated, continue waiting commands\n", pid);
}
}
}

char** parse(char *string)
{
char** ret = malloc(sizeof(char*));
ret[0] = strtok(string, " ");
int i = 0;
for (; ret[i]; ret[i] = strtok(NULL, " \n"))
{
ret = realloc(ret, sizeof(char*) * ++i);
}

return ret;
}

最佳答案

您的 parse() 命令在最后一个参数中包含一个 \n :)

因此,使用单个 ls,您实际上是在执行 ls\n,它不在 PATH 中(当然)

问题是在第一个 strtok() 调用中,您只传递 "" 作为分隔符。使用 "\n"(就像在后续调用中一样),问题就消失了。

你也可以通过 chomping \n 来修复它:

int l = strlen (string);
if (l > 0 && string [l - 1] == '\n') string [l - 1] = '\0';

并且只使用 "" 作为分隔符。

关于c - 为什么 ls 不能与 execvp 一起工作?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20052486/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com