【发布时间】:2015-12-08 08:51:19
【问题描述】:
在这个问题上被困了几个小时。如何在命令提示符程序中读取命令行参数并使用 execv() 系统调用执行它?以下是 YWIMC 为提示符的示例输出。
YWIMC > R /bin/ls
a.out ex2.c ...... //output from the “ls” command
YWIMC > R /bin/ls –l //same as executing “ls –l”
total 144
-rwx------ 1 sooyj compsc 8548 Aug 13 12:06 a.out
-rwx------ 1 sooyj compsc 6388 Aug 13 11:36 alarmClock
.................... //other files not shown
R 命令的语法为 R command_path [arg1 到 arg4],其中它们可以是 0 到 4 个参数。例如。 R /bin/ls 或 R /bin/ls -l
我应该使用 execv(我假设它更适合读取命令行参数,因为它使用 char 数组作为其参数,并且因为我的家庭作业要求我这样做)但我在读取参数时遇到了麻烦在。
当有任意数量的参数(0 到 4)时,我该怎么做? 在阅读参数时,我如何让程序认识到这是我给出的所有参数的结尾? (我遇到了一个问题,即使我将最大值设置为 4,我也会添加无限数量的参数。)以下是我现有的代码,只是我必须将 execl 更改为 execv
else {
result = fork();
if(result != 0) { //Parent Code
childID = wait(&status);
}
else { //Child Code
if(strcmp(filePath, "/bin/ls") == 0) { //specific /bin/ls command
execl("/bin/ls", "ls", NULL);
}
else { //run other programs
execl(filePath, NULL);
}
return 256;
}
【问题讨论】:
-
我不明白——你应该编写一个名为“R”的工具,它只执行它的第一个参数,最多有 4 个参数......或者你应该实现一种“shell”知道“R”作为一个命令来做到这一点?后者会做更多的工作,迫使你做一些字符串处理(应该支持引用和转义吗?)
-
如果是后者,strtok-like function I wrote recently 可能会对您有所帮助,请参阅 here for it's usage
-
有点像后者。编写一个 shell 类型的程序,读入 R 并识别出它是一个“请求”,读取第一个参数是文件路径,读取接下来的 4 个参数,这些参数可能没有到 4 个。我在循环读取时遇到了麻烦0 到 4 个参数,因为我不能只从 main 方法中删除它。
-
是的,那么您的“主要问题”是您自己的命令行解析。在最基本的层面上,使用带有计数器变量的
fgets()和strtok()(参见各自的手册页)。如果您需要支持引用和转义,请参阅我上面链接的函数,以了解扩展strqetok()的可能实现(像 quote 和 escape 这样调用它)。如果你也想支持命令行编辑,fgets()就不用了,那就看看libreadline吧。
标签: c command-line-arguments command-prompt