gpt4 book ai didi

c - 从用户输入获取shell命令并执行C程序

转载 作者:行者123 更新时间:2023-11-30 18:05:58 24 4
gpt4 key购买 nike

目前正在开发接收 Linux shell 输入命令并执行它们创建子进程的程序。

#include <sys/types.h>
#include <sys/wait.h>
#include <stdlib.h>
#include <stdio.h>
#include <errno.h>

int main(int argc, char * argv[])
{
int pid, status;
if (argc < 2) {
printf("Usage: %s command, [arg1 [arg2]...]\n", argv[0]);
return EXIT_FAILURE;
}
printf("Starting %s...\n", argv[1]);
pid = fork();
if (pid == 0) {
execvp(argv[1], &argv[1]);
perror("execvp");
return EXIT_FAILURE; // Never get there normally
} else {
if (wait(&status) == -1) {
perror("wait");
return EXIT_FAILURE;
}
}
return EXIT_SUCCESS;
}

适用于像./program command arg这样的输入,但需要接收带有args的各种命令,例如:./program command arg command arg .....

有什么建议吗?

最佳答案

shell 是一个复杂的软件,我最近必须为操作系统类实现一个 shell,这很困难;我们只需要控制每个输入的一个命令(尽管我们还必须实现 I/O 重定向和管道,并且必须手动进行路径搜索,然后使用 execv() 执行)。

您将遇到的问题在于,实际上没有任何方法可以判断命令行参数数组中的下一个 arg 字符串是命令还是前一个命令的参数。区分命令及其参数的唯一方法是您知道它将交替 command arg command arg ... ,或者每个命令有一些其他标准化参数数量(这不是很有用),或者在命令之间有一个分隔符,如分号: command arg; command arg arg arg; ...

如果您知道它会交替,那么您可以像这样循环遍历参数:

for(int i = 1; i < argc; i += 2)
{
//command is argv[i], arg is argv[i + 1]
}

一种更好的方法是创建一个输入提示,然后每行处理一个命令,而不是使用命令行参数,就像正常的 shell 使用一样。

关于c - 从用户输入获取shell命令并执行C程序,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5903719/

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