gpt4 book ai didi

C execlp() 没有正确解析参数字符串

转载 作者:太空宇宙 更新时间:2023-11-04 02:17:52 24 4
gpt4 key购买 nike

我正在为必须使用 exec() 或其变体之一来执行外部命令的操作系统类构建一个 shell。目前,我正在使用 execlp(command,command_parameters, (char *) NULL)。这运行命令很好(例如 ls 返回标准目录列表),但似乎没有解析任何参数(例如运行 mkdir hello 抛出错误“你好:缺少操作数...尝试“hello --help”了解更多信息)。我错过了什么?

            else // Try to handle an external command
{
char *command_parameters = malloc(sizeof(raw_command)-sizeof(command));
strcpy(command_parameters, raw_command+strlen(command)+1);
pmesg(1, "Command is %s.\n", command);
pmesg(1, "The command parameters are %s.\n", command_parameters);
pid_t pid = fork();
pmesg(1, "Process forked. ID = %i. \n", pid);
int status;
if (fork < 0)
{
printf("Could not fork a process to complete the external command.\n");
exit(EXIT_FAILURE);
}
if (pid == 0) // This is the child process
{
pmesg(1, "This is the child process, running execlp.\n");
if (execlp(command, command_parameters, (char *) NULL) < 0)
{
printf("Could not execute the external command.\n");
exit(EXIT_FAILURE);
}
else { pmesg(1, "Executed the child process.\n"); }
}
else {while(wait(&status) != pid); } // Wait for the child to finish executing
pmesg(1, "The child has finished executing.\n");
}

(pmesg 是一个调试标签,它打印给定特定调试级别的语句)。

谢谢!

最佳答案

这里有几个问题:

  1. execlp( const char *file, const char *arg, ...) 期望参数被拆分并单独传递,而不是作为一个大字符串。
  2. 第一个 arg(在 const char *file 之后)按照惯例是您正在运行的可执行文件的名称,它被放入 argv[0] 中被调用的程序。因此,第一个参数需要放在后面。

例如:

execlp( command, command, arg1, arg2, ..., (char *)NULL );

用你所拥有的,像这样去做:

execlp( command, command, command_parameters, (char *)NULL );

可能会按原样解决您的问题,"mkdir", "hello",但您仍然没有拆分 command_parameters 字符串,因此,如果不修改具有多个参数的命令,它将无法工作。

编辑:附言你的线路

if (fork < 0)

应该是

if (pid < 0)

关于C execlp() 没有正确解析参数字符串,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4744023/

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