0

シンプルな Linux シェルを作成する割り当てを受けました。これまでのコードは次のとおりです。

#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 に答える