2017-02-14 10 views
0

私はexeclの動作に問題があります。execl()が動作するのに問題があります

pid_t pid = fork(); 

if(pid<0) { 
perror("fork error\n"); 

} else if(pid== 0){ 
execl("/home/"user name"/opSys", "ps", ">>", "test.txt", (char*)NULL); 

} else { 

int returnStatus; 
waitpid(pid, &returnStatus, 0); 

} 

コマンドを実行してテキストファイルに出力しようとしていますが、何も起こりません。私はグーグルで、さまざまなエグゼクティブなど、私が見つけたものを試しています。私はexeclp()を試してみましたが、psのファイルをファイルに入れないようにしようとしました。

これが解決された場合はお詫び申し上げますが、それは私には間違いないが、私のために働く解決策は見つからない。 ありがとうございます。

+1

は 'この'「/ホーム/」ユーザ名「/オプシス」私に説明してください。 –

+0

ポストにスペルミスがありましたが、修正しました。 – lostknight

+3

>> >>はシェル演算子です。 'execl'はそれを理解しません。それはシェルではなく 'opSys'プログラムに' >> 'を渡します。あなたが望むものではありません。 – kaylum

答えて

1

コマンドの>>が出力のリダイレクトを作成すると仮定します。しかし、これはここでは当てはまりません。コマンドラインで与えられた場合、演算子>>シェルによって解釈されます。コマンドはそれまでの引数だけを取得し、それを除外します。シェルは、リダイレクションのためにファイル記述子が適切にマングリングされるように注意します。

あなたの場合、コマンドには3つの引数、つまり、与えられた文字列ps,>>、およびtest.txtが得られます。これは、あなたが多分それは(あなたはおそらく逃した)受信悪い引数について標準エラー出力にエラーメッセージを与え、その後、あまり行っていない、おそらく呼び出しているコマンド

command ps '>>' test.txt 

を入力するようなものです。

私はあなたがあなたのコマンドを解釈し、文字列として、あなたのコマンドに合格するためにシェルを呼び出すようにしようと提案している。

execl("/bin/sh", "-c", "/home/"user name"/opSys ps >> test.txt", 
    (char*)NULL); 
+0

Btw、私はあなたの 'user'と' name'がスペースなしで文字列を評価するいくつかのマクロであることを願っています。そうでなければこれは別の問題であり、スペースをエスケープするためにパスの周りに一重引用符を置く必要があります: '' '/ home /ユーザー名 "/ opSys 'ps >> test.txt"を入力します。 – Alfe

+0

非常にありがとうAlfe、これは私の問題を解決しました。私はexecl( "/ bin/sh"、 "sh" ....)をしなければならなかった。最初に私の問題は修正されました。 – lostknight

関連する問題