私は指定されたファイル名にコマンドの出力を書き込むリダイレクト関数を書いています。例えば自分の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開いているライブラリではないラッパーを使用する」
私はここに割り当ての全体を求めているようです。あなた自身で何かを思いついてみるべきです、そして、あなたが立ち往生するならば、より具体的な質問をしてください。 – Kenster
出発点として、実際のシェルは 'fork()'を呼び出して子プロセスを作成します。子供の中では、 'dup2()'サンプルのようなものを使って出力ファイルを開き、それをstdoutに割り当てます。次に、実際にコマンドを実行するために 'execve()'や[他のexec関数の1つ](http://linux.die.net/man/3/execv)を呼び出します(特にexecvpを見てください) 。 exec関数は、引数リストの形式でコマンドを受け取ります。したがって、それらを連結して単一の文字列にする必要はありません。 – Kenster