0

Linux シェルをシミュレートする ac プログラムを作成しています。

リダイレクト記号、つまり > 記号を使用して I/O リダイレクトを実装するために、freopen を使用して stdout をユーザーが指定したファイルに置き換えます。コマンドが次の場合:

environ > bla.txt

私のシェルは、環境変数を stdout ではなく bla.txt ファイルに出力します。

ただし、「bla.txt」ファイルを作成する代わりに、作成されるファイルは「bla.txt?」です。

の背後にある謎を解ける人はいますか? ファイル名に追加?

I/O リダイレクトのみのコードは次のとおりです。

 char *inFile;   

pid_t pid;      
int rc;        

/* keep reading input until "quit" command or eof of redirected input */
while (!feof(stdin)) 
{
    /* get command line from input */
    if (fgets (buf, MAX_BUFFER, stdin ))    // read a line
    { 

        inFile = strstr(buf, ">");          // look for redirection arrow > in the command
        if(inFile != NULL)                 
        {
            pid = fork();

            if(pid == 0)                            
                freopen( inFile+2, "w", stdout);    
            else if(pid == -1)      
                syserr("fork");     
            else
                waitpid(pid,&rc,0);        
        }
     }
}

解決策をグーグルで調べてみましたが、何も見つかりません。他のスタックオーバーフローの質問も調べてみましたが、答えが見つかりません。

ありがとう。

4

2 に答える 2

4

fgetsマニュアルページから:

fgets() stream から最大で size 未満の 1 文字を読み取り、s が指すバッファーに格納します。EOF または改行の後、読み取りは停止します。 改行が読み取られると、バッファに格納されます。[...]

文字列から行末マーカーを削除する必要があります。そうしないと、それを含むファイル名になってしまいます (ほとんどのシェル/実装では、デフォルトlsでそれが a に置き換え?られます)。

于 2013-04-28T06:14:30.713 に答える