2016-03-27 4 views
4

私は指定されたファイル名にコマンドの出力を書き込むリダイレクト関数を書いています。例えば自分のlinuxシェルのI/Oリダイレクトを書く '>' function

echo Hello World > hello.txtはhello.txtに 'Hello Worldの' を書くでしょう。

ls -al > file_list.txtは、現在のディレクトリ内のすべてのファイル/ディレクトリ名のリストをfile_list.txtに書き込みます。

My機能は、これまでのように定義されます。args[count]">"ある

int my_redirect(char **args, int count) { 
    if (count == 0 || args[count + 1] == NULL) { 
     printf("The redirect function must follow a command and be followed by a target filename.\n"); 
     return 1; 
    } 
    char *filename = args[count + 1]; 

    //Concatenates each argument into a string separated by spaces to form the command 
    char *command = (char *) malloc(256); 
    for (int i = 0; i < (count); i++) { 
     if (i == 0) { 
      strcpy(command, args[i]); 
      strcat(command, " "); 
     } 
     else if (i == count - 1) { 
      strcat(command, args[i]); 
     } 
     else { 
      strcat(command, args[i]); 
      strcat(command, " "); 
     } 
    } 

    //command execution to file goes here 

    free(command); 
    return 1; 
} 

args[0]からargs[count - 1]までの文字列のコマンドをargs[count + 1]にあるファイルに実行するにはどうすればよいですか?

EDIT

これらは我々が与えられた命令です:。

「ファイルに標準出力のリダイレクトを追加することで、あなたのシェルを向上させる機能1.のために行を解析完了した後にのみ試み>コマンドの前にすべてを取り、ファイル名の後ろに最初の単語を置きます(<、>>など)。

標準出力はファイル記述子1に書き出されます(stdinは0、stderrは2)。この作業は、ファイルを開いてファイルをコピーすることで実現できますdup2システムコールで1を超える記述子。

int f = open(filename , O_WRONLY|O_CREAT|O_TRUNC, 0666) ; 
dup2(f , 1) ; 

注:システムコールここではfopen開いているライブラリではないラッパーを使用する」

+2

私はここに割り当ての全体を求めているようです。あなた自身で何かを思いついてみるべきです、そして、あなたが立ち往生するならば、より具体的な質問をしてください。 – Kenster

+2

出発点として、実際のシェルは 'fork()'を呼び出して子プロセスを作成します。子供の中では、 'dup2()'サンプルのようなものを使って出力ファイルを開き、それをstdoutに割り当てます。次に、実際にコマンドを実行するために 'execve()'や[他のexec関数の1つ](http://linux.die.net/man/3/execv)を呼び出します(特にexecvpを見てください) 。 exec関数は、引数リストの形式でコマンドを受け取ります。したがって、それらを連結して単一の文字列にする必要はありません。 – Kenster

答えて

0

あなたは特別な方法でこの問題を解決するために許可されているので、キャプチャのように、問題の狭い範囲でのみ動作する場合あなたは<stdio.h>からpopen()機能を使用して車輪の再発明を避けることができ、ファイルへのコマンドの標準出力、プログラムの

スケッチ:。

  1. は、出力ファイル名に
  2. を決定
  3. を書くための
  4. オープン出力ファイルは、コマンドを決定し、引数
  5. >までの引数からコマンド文字列を構築します。
  6. コールcmdストリームからFILE *cmd = popen(command, "r");
  7. 読むライン、cmdストリームにEOFされていないが、出力ファイル
  8. 後藤6に書き込みます。
  9. pclose(cmd)fclose出力ストリーム

あなたのインストラクターがあなたがフォーク、DUP、友人を使用するように期待していない場合にのみ、これを行います。

関連する問題