2012-01-11 3 views
2

は、私は、プロセスを実行するためにexeclpを使用のexeclpの複数の「プログラム」

cat file.tar | base64 | myprogram -c "| base64 -d | tar -zvt " 

ような何かを実行したいです。

私はcatのようなものを実行しようとすると動作しますが、私がbase64 -d | tar -zvtを実行しようとすると動作しません。

私はbashコマンドを見て、私はbashを実行して他のプログラムを実行するように指示することができたことを知りました。だから、のようなものです:

execlp ("bash", "-c", "base64 -d | tar -zvt", NULL); 

私は、端末上でそれを実行した場合、それはうまく動作しますが、execlpを使用すると、それはいけない仕事。 私がexeclp("cat", "cat", NULL)を使用すると動作します。

誰かがexeclpの-c paramを使用して複数の「プログラム」を実行する方法を知っていますか? 私はパイプとフォークを使用しているので、私はシステムを使用できません。

execlp( "bash"、 "bash"、 "-c"、 "base64"、NULL)を使用しようとすると、何も起こりません。 私がexeclp( "cat"、NULL)を使用しているなら、それは大丈夫です。 私はstdinに書いています...私はbash -c base64の問題かどうかわかりません。端末エコー "asd" |それがうまくいけ 「猫」-c bashの

+1

私は[以前の回答で](http:// stackoverflow。あなたの任意の数をどのようにチェーンすることができますか?/ 7281894/how-do-i-chain-stdout-in-one-child-process-to-other-child-in-c/7282296#7282296)パイプで処理する。希望が役立ちます。 –

+0

私はそれについて考えました、ビット私はbashでそれを解決しようとしています、私はそれを行うことはできません複数のパイプ方法を試してみましょう:(...ありがとう – Lefsler

答えて

4

最初の「引数は、」あなたのような何かを呼び出す必要がありますので、argv[0]どうなるかである:上記の関数が何をするのか

execlp("bash", "bash", "-c", "base64 -d | tar -zvt", NULL); 

編集小さな説明:execファミリの関数がプログラムを実行します。上記の呼び出しでは、問題のプログラムは "bash"(最初の引数)です。 Bashは他のすべてのプログラムと同様に、プログラムの開始点であるmain関数を持っています。他のすべてのmain関数と同様に、Bashの関数は2つの引数を受け取ります。一般にargcargvと呼ばれます。 argvはゼロ終端文字列の配列で、argcargv配列のエントリ数です。 argcは常に1以上です。つまり、argv[0]には常に1つのエントリがあります。この最初のエントリはプログラムの "名前"であり、プログラムファイルのパスが最も一般的です。コマンドラインのその他のプログラム引数はすべてargv[1]argv[argc - 1]になります。

execlpは、実行するプログラムを見つけるために最初の引数を使用し、他のすべての引数は与えられた順序でプログラムargvの配列に入れられます。第二場合

argv[0] = "bash" 
argv[1] = "-c" 
argv[2] = "base64 -d | tar -zvt" 

また、バッシュのargcが3

に設定されます。これはexeclpへの上記の呼び出しは、プログラム「bashの」と呼ぶと、これにバッシュのargv配列を設定することを意味します"bash""foo"に変更された場合、Bashのargv[0]"foo"に設定されます。

これが少しクリアすることを願っています。

+0

なぜ私はbashを2回呼び出す必要がありますか? – Lefsler

+1

@ user1109847あなたはbashを一度呼び出すだけですが、bashの 'main()'関数にゼロ引数を含める必要があります。 –

+0

私はbashを使ってbashを再呼び出ししますか? – Lefsler

関連する問題