問題タブ [dup2]
For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.
c - Cでfork()、pipe()、dup2()、exec()に問題がある
これが私のコードです:
(コードは、以下の2つの回答によって提案された変更を反映するように更新されましたが、それでも正常に機能しません...)
これが失敗するテストケースは次のとおりです。
問題は、その後シェルに戻る必要があることです。「シェル>」がさらに入力を待っているのが見えるはずです。また、「[4804] TERMINATED(Status:0)」(ただし、pidが異なる)のようなメッセージが表示されないことにも気付くでしょう。これは、2番目のプロセスが終了しなかったことを意味します。
これは機能するため、grepと関係があると思います。
2つの「終了」メッセージを簡単に確認できます...
だから、私のコードの何が問題になっていますか?
c - C でのこの複数のパイプ コードは理にかなっていますか?
私はこれについて数日かけて質問を作成しました。私の解決策は、受け入れられた回答で提案されたものです。しかし、私の友人は次の解決策を思いついた:
以下の回答の提案を反映するために、コードが数回更新されていることに注意してください (編集リビジョンを確認してください)。新しい回答をする場合は、問題の多い古いコードではなく、この新しいコードを念頭に置いてください。
これは、bash のようにパイプを介して一連のコマンドをシミュレートします。たとえば、次のようになります。cmd2 | ... | cmd_n. ご覧のとおり、コマンドは実際には引数から読み取られるため、「シミュレート」と言います。簡単なシェルプロンプトをコーディングする時間を割くために...
もちろん、エラー処理のように修正したり追加したりする問題がいくつかありますが、それはここでのポイントではありません。コードはある程度理解できたと思いますが、それでも、この全体がどのように機能するかについて多くの混乱を招きます。
私は何かが欠けているのでしょうか、それともこれは本当にうまくいき、問題を解決するためのきれいできれいな解決策ですか? そうでない場合、誰かがこのコードの重大な問題を指摘できますか?
c - 同時に読み取るための複数の開いているファイル
dup2を使用して入力ファイルから読み取り、exec関数の入力にリダイレクトしたいと思います。しかし、私の問題は、3つの実行中のプロセスがあり、それらすべてが同じ入力ファイルを開く必要がありますが、それらは異なるジョブを実行することです。そのような場合、あなたは何を提案しますか?「catdata.txt」を使用して他の3つのプロセスの入力をフィードできるかどうかはわかりませんが、その方法はわかりません。
c - スレッドフィードその他のマルチスレッド
フォークを使用して 2 つのプロセス間のパイプを開くのは簡単ですが、開いたパイプをスレッドに渡す方法はわかります。PROGRAM AからPROGRAM Bに「複数のスレッドで」渡す必要があると仮定すると、PROGRAM Bはその出力をPROGRAM Cに送信します
編集:コードを変更して読みやすくした後、再び来ます。
c - dup2 の後、ストリームにはまだ古いコンテンツが含まれていますか?
私がそうするなら:
私はこの時点で見つけています..標準入力には、まだ消費していない2行が含まれています。何故ですか?何度リダイレクトしてもバッファが1つしかないから?残りの 2 行を取り除くにはどうすればよいですか?
c - C:dup2()でスタックしました:-(
パイプを使ってシェル(cmd)インターフェースをエミュレートするプログラムを用意しました。プログラムには2つのバージョンがあります。1。1つのパイプを使用する(親から子への通信のパイプを使用)2。二重のパイプを使用する(親から子へのパイプと子から親への通信に2つのパイプを使用)。
したがって、最初のプログラムは目的のインターフェイスを提供し、希望どおりに機能しますが、2番目のプログラム(dup2()などを使用)で同じ結果(インターフェイス)に到達することはできません。
だから、私はあなたの助けを中継し、両方のコードを以下に置きます。
BS:次のコマンドを使用して、同じ方法で両方のプログラムをコンパイルして試すことができます。
$ gcc prog1.c -o prog1
次に実行しましょう:
$ ./prog1
次に、新しいターミナルを実行して、input.txtにデータを書き込んでみましょう。
$ echo pwd> input.txt
そして、最初のターミナルで結果を見てください。
(これは最初のプログラムでは正常に機能しますが、2番目のプログラムでも同じインターフェイスでこれを機能させる必要があります)
最初のプログラムのコード(WORKING FINE):
2番目のプログラムのコード(少し修正する必要があります):
c - dup2のトラブル
Ben Voigt の回答をコードに組み込んだ後、動作するように見えます
元の質問:
dup2 を使用して次のことを試みています。
- 「ls -al」の出力を「grep foo」への入力として渡します。
- その出力が「grep bar」の入力になります。
- 最終的に標準出力に出力します。
最終的な出力は(空白)、ファイル「in」は(空白)、ファイル「out」には「ls -al」の出力があります。
何が起こっているのでしょうか?
c - 配管にdup2を使用
dup2 を使用して次のコマンドを実行するにはどうすればよいですか?
c - popen() は、pipe() + fork() のような双方向パイプを作成できますか?
C++ (主に C) でシミュレートされたファイル システムにパイピングを実装しています。ホストシェルでコマンドを実行する必要がありますが、シミュレートされたファイルシステムでパイプ自体を実行します。
pipe()
、fork()
、およびsystem()
システム コールを使用してこれを実現できますが、 popen()
(パイプの作成、プロセスのフォーク、シェルへのコマンドの受け渡しを処理する) を使用することをお勧めします。パイプの親プロセスから書き込み、子プロセス側で読み取り、子から出力を書き戻し、最後に親からその出力を読み取る必要があるため、これは不可能かもしれません。私のシステムの man ページにpopen()
は、双方向パイプが可能であると書かれていますが、私のコードは、単方向パイプのみをサポートする古いバージョンのシステムで実行する必要があります。
上記の個別の呼び出しを使用して、パイプを開閉してこれを実現できます。それは可能popen()
ですか?
些細な例として、実行するls -l | grep .txt | grep cmds
には次のことを行う必要があります。
ls -l
ホスト上で実行するパイプとプロセスを開きます。その出力を読み返すls -l
の出力をシミュレーターにパイプで戻します- パイプとプロセスを開き、パイプさ
grep .txt
れた出力でホスト上で実行しますls -l
- この出力をシミュレーターにパイプで戻します (ここで立ち往生)
- パイプとプロセスを開き、パイプさ
grep cmds
れた出力でホスト上で実行しますgrep .txt
- この出力をシミュレーターに戻して出力します
マン・ポペン
Mac OS X の場合:
関数は
popen()
、双方向パイプを作成し、フォークし、シェルを呼び出すことによって、プロセスを「開きます」。親プロセスの以前の呼び出しによって開かれたストリームpopen()
は、新しい子プロセスで閉じられます。歴史的にpopen()
、単方向パイプで実装されていました。したがって、 の多くの実装ではpopen()
、 mode 引数のみで読み取りまたは書き込みを指定できますが、両方は指定できません。は双方向パイプを使用して実装されるようになったためpopen()
、mode 引数は双方向データ フローを要求する場合があります。mode 引数はヌル終了文字列へのポインタで、読み取りの場合は 'r'、書き込みの場合は 'w'、読み取りと書き込みの場合は 'r+' でなければなりません。
c++ - トラブルパイプライン 3 つのコマンド「dmesg|sort|more」c++
あるコマンドの出力を別のコマンドの入力にパイプすることに成功し、2 番目のコマンドの出力を画面に表示しました。
これを 3 つの連続したコマンドで実行したいと考えています。(実際には、実行時にプログラムに渡される N 個のコマンドでそれを実行したいと考えています。
これは、3 つのコマンドをまとめてパイプライン処理する試みです。
更新:最新の試みを反映するように質問を更新しました。
簡単にするために、すべての値をハードコーディングしました。プログラムは「dmesg|more」の出力であるべきものを表示しますが、ソート部分を実行せずにフリーズします。左下にdmesgなどの物乞いが見えますが、それ以上は見れません。
何か案は?