1

私が持っているコードはここにあります。基本的に、カスタム シェルはコマンドとして echo、cd、および quit を取得し、コマンドの子を fork する必要があります。コンパイル時にエラーはありませんが、実行されていません。「echo hello」と言って、引数をエコーし​​ません...それは正しい関数とすべてに入りますが、エラーを特定することはできません。私は execlp 関数で間違いを犯していると推測しています。誰かが私を助けてくれますか?

#include <stdio.h>
#include <sys/types.h>
#include <sys/wait.h>
#include <unistd.h>
#include <string.h>

int main()
{

    char command[256];
    char * parsedCmd;
    char * argument;

    //char *sep[]=" ";

    while (1<2)
    {
        printf("\nOS Assignment 1@user: ");
        fgets(command, sizeof(command), stdin); 

        parsedCmd=strtok(command, " ");
        argument=strtok(NULL, " ");

        //printf("\n%s\n", argument);

        if (strncmp("quit", command, 4)==0)
            break;
        if (strncmp("cd", parsedCmd, 2)==0)
        {
            printf("\nExecuting cd\n");
            execCD(argument);   
        }
        if (strncmp("echo", parsedCmd, 4)==0)
        {
            printf("\nEchoing now...\n");
            shellEcho(argument);
        }       
        else
            printf("\nOur shell is simple. Try either cd, echo or quit :) ...\n");  
    }   
}

int execCD(char *receive)
{
    printf("\nExecuting cd as Child...\n"); 
    printf("\nDirectory to cd is %s\n", receive);
    pid_t pid;

    pid=fork();

    if (pid<0)
    {
        fprintf(stderr, "\nFork Failed\n");
        return 1;
    }

    else if (pid==0)
    {
        execlp(receive, "cd", NULL);
    }

    else
    {
        wait(NULL);
        printf("Child Complete");
    }

    return 0;
}

int shellEcho(char *receive)
{
    printf("\nExecuting echo as Child...\n");   

    pid_t pid;

    pid=fork();

    if (pid<0)
    {
        fprintf(stderr, "\nFork Failed\n");
        return 1;
    }

    else if (pid==0)
    {
        execlp(receive, "echo", NULL);
    }

    else
    {
        wait(NULL);
        printf("Child Complete");
    }

    return 0;
}
4

1 に答える 1

2

execlpあなたは後方への議論を持っています。また、慣例により、"echo" を 2 回指定する必要があることに注意してください。1 回目は実行するプログラムの名前として、2 回目は 0 番目の引数 (通常はプログラムの名前ですが、必ずしもそうではありません) として指定します。

int shellEcho(char *receive)
{
    printf("\nExecuting echo as Child...\n");   
    pid_t pid;
    pid=fork();

    if (pid<0) {
        fprintf(stderr, "\nFork Failed\n");
        return 1;
    } else if (pid==0) {
        execlp("echo", "echo", receive, NULL);
    } else {
        wait(NULL);
        printf("Child Complete");
    }

    return 0;
}

また、"cd" はシェルで実装する必要があるため、実行できないことに注意してください (実行できる別のプログラムではありません)。ここでそれをさらに追求するよりも、その問題について先生と話し合う方がおそらく適切です.

于 2012-09-26T20:56:58.460 に答える