【发布时间】:2019-03-23 16:34:11
【问题描述】:
我正在使用 execvp() 来运行一些系统调用。程序适用于有效命令,对于任何不存在的命令都失败,这是完美的。 该程序是,当我在需要额外参数(如 cat)并且我不提供参数的命令上使用 execvp() 时,程序只是从输入中无限读取。
我不确定如何解决这个问题,因为我不知道如何“判断”命令是否不完整。有什么想法吗?
#include <stdlib.h>
#include <stdio.h>
#include <string.h>
#include <fcntl.h>
#include <unistd.h>
int main(int argc, char* argv[]) {
char command[1000];
printf("Enter command: ");
scanf("%[^\n]s", command);
char *temp = strtok(command, " ");
char *commandList[100];
int index = 0;
while (temp != NULL) {
commandList[index] = temp;
index++;
temp = strtok(NULL, " ");
}
commandList[index] = NULL;
execvp(commandList[0], commandList);
printf("Failed");
}
理想的结果是打印“命令不完整”并且进程结束。
【问题讨论】:
-
如果你启动的程序永远不需要从
stdin读取,为什么不在execvp()之前关闭它? -
避免命令从
stdin读取的常用方法是打开STDIN_FILENO到/dev/null -
@EOF — 不简单关闭标准输入的一个原因是程序有权假定标准输入、标准输出和标准错误已正确打开。重定向标准输入使其来自
/dev/null比简单地关闭标准输入要好得多。 -
注意
cat不需要任何额外的参数;当不带参数调用它时,它会在标准输入上读取到 EOF。它完全按照设计工作。最好在stderr而不是stdout上报告错误;最好在错误消息中包含失败的命令名称(以防用户认为他们输入的不是);最好用换行符 (fprintf(stderr, "Failed (%s)\n", commandList[0]);) 结束错误消息。 -
哦,当程序失败时,它应该退出或返回一个非零退出代码(
EXIT_FAILURE来自<stdlib.h>,或者通常是1)。这让调用代码(shell 或其他)知道它没有成功。
标签: c exec system-calls