我得到了编写一个简单的linux shell的任务, 这是到目前为止的代码:
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <unistd.h>
#include <sys/wait.h>
#include <sys/types.h>
int main(int argc,char argv[])
{
char *token;
char command[50];
char tmp[256];
char *arg_command[]={"",0};
int pid,status,flag=0;
char *path = (char*)getenv("PATH");
while(1) // run always
{
printf("\n");
printf(getenv("PWD")); //print current dir
printf(": ");
gets(command);
if (strcmp(command,"exit")==0) //check for exit command
{
printf("bye\n");
break;
}
strcpy(tmp,path);
token = strtok(path,":");
while(token!=NULL)
{
arg_command[0] = command;
pid = fork();
if(pid>=0)
{
printf("\npid is:%d\n",pid);
if (pid==0) // child process is invoked
{
strcat(token,"/");
execv(strcat(token,command),arg_command);
exit(0);
}
else //parent process
{
wait(&status);
if(status==0)
}
}
else
{
printf("fork faild");
}
token = strtok(NULL,":");
}
if (flag == 1)
{
printf("no files or folders match this command\n");
}
strcpy(path,tmp);
}
return 0;
}
我的问题是如何知道execv是否能够执行命令 因为我想在用户输入错误命令时输出错误。 我也有一面旗帜,但因为我无法检查execv我无法使用它。
答案 0 :(得分:0)
与大多数Unix / POSIX函数一样,exec
*如果失败则返回错误代码(-1)。然后errno
将告诉您失败的原因。
事实上,如果他们回来了,那就出问题了。否则,当前进程被替换,这意味着执行后没有代码(在您的情况下为exit(0)
)。