%20%E9%96%A2%E6%95%B0%E3%81%A7%20cat%20%E3%82%92%E4%BD%BF%E7%94%A8%E3%81%97%E3%81%A6%E3%83%95%E3%82%A1%E3%82%A4%E3%83%AB%E3%82%92%E3%82%B3%E3%83%94%E3%83%BC%E3%81%99%E3%82%8B.png)
フルパスのファイルをコピーし、execlを使用してCプログラムの名前を変更するには?このディレクティブを使用できますか?
execl("/bin/cat","cat",path_source,">",path_destination,NULL);
答え1
公開したコードは、次のシェルコマンドを模倣するように設計されているようです。
cat path_source >path_destination
しかし、この場合引数では>
ありません。代わりに、単一の引数で実行され、標準出力が接続されている
cat
シェルによって解釈されます。 (だからCコードは。)cat
path_source
path_destination
cat path_source '>' path_destination
上記のコマンドを模倣する1つの方法cat
は、シェルコマンド()を含む文字列を設定し、"cat ... >..."
execを使用してそれをパラメータとして渡すことです/bin/sh -c
。しかし、どれほど信頼性が高く安全なのかわからない場合は、信頼性が高く安全にすることは困難です。ファイル名が特定の制約に対して検証されていることを確認してください。
ファイル名のみを変更するには、の標準機能を使用することをお勧めrename
しますstdio.h
。そうでない場合は、質問を明確にしてください。
答え2
これは宿題のように聞こえるので、意図的にあいまいに話しています。
出力リダイレクト演算子を使用するときのシェルの動作を模倣することが要件のようです。execl()
呼び出しプロセスの標準出力がターゲット出力ファイルのオープンファイル記述子になるように呼び出す前に、標準ファイル記述子を操作する必要があります。これにより、catが標準出力に書き込むときにコンテンツがターゲットファイルに移動されます。