6

シェルをコーディングしようとしています。しかし、私のシェルはコマンドを実行しません - ls -l | 以下。私はexecvpを使用しています。コードを以下に示します。

#include <stdio.h>
#include <unistd.h>
#include <string.h>

int main(){
    int pid, status, num, len;
    char str[1000], cwd[100];
    char* word[100];

    getcwd(cwd, sizeof(cwd));

    while(1){
        chdir(cwd);

        printf("%s > ", cwd);

        gets(str);

        pid=vfork();

        if(pid == 0){
            num = 0;
            word[num] = strtok (str, " ");

            while (word[num] != NULL) {
                word[num] = strdup (word[num]);
                len = strlen (word[num]);
                if (strlen (word[num]) > 0)
                    if (word[num][len-1] == '\n')
                        word[num][len-1] = '\0';
                word[++num] = strtok (NULL, " ");
            }

            if(strcmp(word[0], "cd") == 0){
                chdir(word[1]);
                getcwd(cwd, sizeof(cwd));
            }
            else{
                execvp(word[0],word);
            }

            exit(0);
        }
        else{
            wait(&status);
        }
    }

    return 0;
}
4

1 に答える 1

9

ls -l | less実際には、パイプで接続された 2 つのプロセスで構成されるシェル コマンド ラインです。呼び出しはexecvp()、単一のプロセスのみを生成できます。

プログラムからこれを行う場合は、system()呼び出しを使用するか、コマンド ラインを に変更して、シェルを明示的に呼び出す必要がありますsh -c 'ls -l | less'。配列wordは次のようになります。

word[0] = "sh"
word[1] = "-c"
word[2] = "ls -l | less"
word[3] = NULL

[編集] あるいは、シェルが内部で行っていることを行うこともできます: 2 つのプロセスを生成し、それらをパイプで接続します。これには、、、およびコールの使用がfork()含まれますpipe()。ただし、シェルの呼び出しははるかに簡単です。また、対話型プログラムであるため、パフォーマンスについてそれほど心配する必要はありません。100 ミリ秒未満の処理はすべて瞬時に認識されます。dup2()execve()less

于 2013-09-03T23:45:52.967 に答える