0

我得到了写一个简单的 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 我无法使用它。

4

1 回答 1

0

与大多数 Unix/POSIX 函数一样,exec* 如果失败,则返回错误代码 (-1)。errno然后会告诉你为什么失败。

事实上,如果他们回来了,那就出问题了。否则,当前进程将被替换,这意味着之后不会执行任何代码(exit(0)在您的情况下)。

于 2013-11-11T15:31:21.963 回答