[英]C - Execvp + Shell
我现在对我的程序有些困难。 我正在尝试编写一个运行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;
}
采用:
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]);
通过这种方式,您将能够判断参数中是否包含newline等额外字符。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.