我现在对我的程序有些困难。我正在尝试编写一个运行shell命令的程序,但我相信我使用execvp错误并传入错误的参数。当我输入ls它说无法访问时,没有这样的文件或目录?我已经看了很多例子,试图模仿它们,但没有占上风。
我的退出检查也被完全跳过了,我不相信“等待”功能正在等待。
#include <stdlib.h>
#include <stdio.h>
#include <unistd.h>
#include <string.h>
#include <unistd.h>
#include <sys/types.h>
#include <string.h>
#include <sys/stat.h>
#include <fcntl.h>
#include <sys/wait.h>
int main(int args, char* argv[])
{
char input[1024];
char *arguments[100];
char* directive;
int doExit = 0;
while(doExit != 1){
printf("\n");
printf("Welcome to myShell\n");
printf("? : ");
fgets(input, 1024, stdin);
char *token;
int count = 1;
int argsCount = 1;
token = strtok(input, " ");
while(token != NULL){
if(count == 1){
directive = strdup(token);
arguments[0] = strdup(directive);
++count;
}
else{
arguments[argsCount] = strdup(token);
++argsCount;
}
token = strtok(NULL, " ");
}
arguments[argsCount] = '\0';
printf("%s\n", directive);
if(strcmp(arguments[0], "exit") == 0){
doExit = 1;
exit(1);
}
pid_t pid = fork(); // create child
int status;
int i = 0;
printf("Arguments:\n");
for(i =0; i < sizeof(arguments) && arguments[i] != NULL; ++i){
printf("%s\n", arguments[i]);
}
if(pid >= 0){
if(pid == 0){
printf("I am the child.\n");
printf("%s\n", directive);
int result = execvp(directive, arguments);
if(result < 0){
printf("*** ERROR: exec failed\n");
exit(1);
}
}
else if(pid >= 0){
printf("I am the parent.\n");
while (wait(&status) != pid){
;
}
}
}
else{
printf("Error: Fork was unsuccessful.\n");
exit(1);
}
printf("\n");
}
return 0;
}
答案 0 :(得分:2)
使用:
token = strtok(input, " \n\t");
和
token = strtok(NULL, " \n\t");
这样input
末尾的换行符将被视为令牌分隔符,不包含在令牌中。
另一个错误:
i < sizeof(arguments)
应该是:
i < sizeof(arguments)/sizeof(*arguments)
因为sizeof
以字节为单位返回大小,而不是数组中元素的数量。
我建议您更改诊断printfs以在字符串周围添加字符,例如:
printf("'%s'\n", arguments[i]);
通过这种方式,您将能够判断参数中是否包含新行等额外字符。