C-执行副总裁+;壳
我现在的程序有点困难。我正在尝试编写一个运行shell命令的程序,但是我认为我使用了错误的execvp,并且传入了错误的参数。当我键入ls时,它会说无法访问,是否没有这样的文件或目录?我看过很多例子,并试图模仿它们,但没有成功 此外,我的退出检查被完全跳过,我不相信“等待”功能正在等待C-执行副总裁+;壳,c,shell,exec,C,Shell,Exec,我现在的程序有点困难。我正在尝试编写一个运行shell命令的程序,但是我认为我使用了错误的execvp,并且传入了错误的参数。当我键入ls时,它会说无法访问,是否没有这样的文件或目录?我看过很多例子,并试图模仿它们,但没有成功 此外,我的退出检查被完全跳过,我不相信“等待”功能正在等待 #include <stdlib.h> #include <stdio.h> #include <unistd.h> #include <string.h> #in
#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;
}
#包括
#包括
#包括
#包括
#包括
#包括
#包括
#包括
#包括
#包括
int main(int args,char*argv[])
{
字符输入[1024];
字符*参数[100];
char*指令;
int-doExit=0;
while(doExit!=1){
printf(“\n”);
printf(“欢迎来到myShell\n”);
printf(“?:”);
fgets(输入,1024,标准输入);
字符*令牌;
整数计数=1;
int argscont=1;
令牌=strtok(输入“”);
while(令牌!=NULL){
如果(计数=1){
指令=strdup(令牌);
参数[0]=strdup(指令);
++计数;
}
否则{
参数[argsCount]=strdup(令牌);
++阿格斯孔特;
}
令牌=strtok(空,“”);
}
参数[argsCount]='\0';
printf(“%s\n”,指令);
if(strcmp(参数[0],“退出”)==0){
doExit=1;
出口(1);
}
pid_t pid=fork();//创建子对象
智力状态;
int i=0;
printf(“参数:\n”);
对于(i=0;i=0){
如果(pid==0){
printf(“我是孩子。\n”);
printf(“%s\n”,指令);
int result=execvp(指令、参数);
如果(结果<0){
printf(“***错误:exec失败\n”);
出口(1);
}
}
否则如果(pid>=0){
printf(“我是父母。\n”);
while(等待(&status)!=pid){
;
}
}
}
否则{
printf(“错误:Fork未成功。\n”);
出口(1);
}
printf(“\n”);
}
返回0;
}
使用:
以及:
因此,input
末尾的换行符将被视为令牌分隔符,而不包括在令牌中
另一个错误:
i < sizeof(arguments)
这样,您就可以知道参数中是否包含了诸如换行符之类的额外字符。这是您2小时前在中发布的同一个程序吗?最好您进行诊断打印;不过,你可能应该在用叉子之前做。你也应该理顺你的逻辑。有三种情况:错误、子项、父项。你应该有
if(pid<0){…error…}else if(pid==0){…child…}else{…parent…}
。也许>>@Barmar:差不多,但不完全。这有一些错误的诊断打印位置。无论如何,另一个问题被删除了。您将“ls\n”
放在指令中,因为您的strtok()
只使用空格作为分隔符,而不是换行符。谢谢。这解决了我只使用ls的问题,但现在当我尝试运行ls-la时,它会说参数[1]处的参数是“ls-la”,execvp返回-1并失败。您需要两次指定blank(和tab)和换行符,而不仅仅是blank或newline作为分隔符。您真的丢失了-
?我不!我还将fgets()
行更改为if(fgets(input,sizeof(input),stdin)==0)中断代码>以正常处理EOF。并不是每个人都键入exit
退出shell。啊,对不起,这是一个输入错误。好吧,我来玩玩。我整天都埋头于ExtJS工作,C不是我的拿手好戏。。谢谢你的帮助。
token = strtok(NULL, " \n\t");
i < sizeof(arguments)
i < sizeof(arguments)/sizeof(*arguments)
printf("'%s'\n", arguments[i]);