問題タブ [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 - stdout を C の 2 つの場所にリダイレクトすることは可能ですか?
私はしばらくこれにこだわっていますが、stdout を 2 つの異なる場所にリダイレクトすることは可能ですか? 練習用に独自のシェルを作成しており、現在、ps aux | wc -l
またはのようなコマンドを実行できますps aux | wc -l > output.file
。ただし、 を実行しようとするps aux > file.out | wc -l
と、2 番目のコマンドは最初のコマンドからの入力を受け取りません。
最後の例では、最初のコマンドが子プロセスで実行され、パイプの一端に出力されます。ロジックは次のようになります。
c - setitimer と dup2 が execvp の後に子プロセスに対して機能するのはなぜですか?
最初に言っておきますが、ここには多くの質問があります。
私の論文のタスクの 1 つは、サブプログラムを実行し、実行時間 (壁時間ではなく user+sys ) が特定の値を超えている場合、または RAM 消費量が別の値を超えている場合にそれを強制終了するプログラムを作成する必要があります。指定された値。
RAMの部分はまだわかりませんが。setitmer と ITIMER_PROF シグナルを使って時間をつぶします。(ITIMER_PROF は、開始時点を設定してから x の時間をカウントするのではなく、実際の CPU 使用率を収集するため)
setitimer を使用する理由は、必要な精度が 2 秒未満であるためです。(EG 1.75 秒 ( 1750000マイクロ秒) 後にプロセスを強制終了します。setrlimit メソッドには 1 秒の 1 つしかありません。
質問 1親プロセスで設定すると、ITIME_PROF を使用した setitimer が機能しないのはなぜですか? 子の CPU/システム コールは収集されませんか?
質問 2なぜこれが機能するのですか!? execvp はすべての関数 (timeout_sigprof、main およびその他) を上書きしませんか? そして、誰かが潜在的に子プログラムのシグナルをキャッチして、元の関数に取って代わることができませんでしたか?
質問 3ここに配置された dup2 が実際に動作し、子の入出力をリダイレクトできるのはなぜですか?
これは、X時間( x = 500ms )後に実行された後にのみ、プログラムを実行して強制終了する、私が書いたコードです。
どんな助け/説明も大歓迎です!
よろしくお願いします。
元
c - stdout をファイルにリダイレクトし、1 行おきに文字列を挿入する
POPENを使用してシステムコマンドを実行するCを使用してプログラムを作成しています。すべてのコマンドの出力をファイルに書き込みます。同じファイルに書き込み、コマンドの出力に番号を付けたいです。
これが私が目指している出力です。
実行したいコマンドが..
1) ls 2) bash -バージョン
したがって、私が望む出力は次のようになります..
これは私が作ったコードです:
}
stdout の出力をファイルにリダイレクトすることができ、これを実現するために dup2 を使用しました。次に、dup2がstdoutをファイルにリダイレクトすることを知って、printfを使用して、ファイルに挿入したい文字列を出力しました(printfの文字列が同じファイルにリダイレクトされ、必要な場所に挿入されると予想していましたしかし、そうではありませんでした。)
これが私が得たものです..はい、出力はファイルとprintfの文字列にリダイレクトされました。しかし、以下に示すように、私が望むようにフォーマットされていません...
どうすればそれができるようになりますか? ありがとうございました!
c++ - 消える子プロセス
私はこの方法を持っています:
デバッグのためだけに print ステートメントを追加しました。ただし、このメソッドを実行すると、これが出力されます。
最初に fork されたプロセス 1454 は、作成直後にメッセージを出力します。ただし、switch ステートメントからのメッセージを出力したり、指定されたプログラム (この場合は cat) を実行したりすることはありません。プロセスはゾンビとしてぶらぶらしません。単に消えます。その結果、2 番目の子プロセスがハングアップし、実際には何もしません。
(また、追加するために、適切なエラー処理をすべてまだ追加していないことを認識しています。関数はまだ完全ではありません)。
c - Fork と dup2 - 子プロセスが終了していません - ファイル記述子に問題がありますか?
宿題用に独自のシェルを作成していて、問題が発生しています。
私のシェル プログラムはcat scores | grep 100
コンソールから入力を取得し、期待どおりに出力を出力しますが、grep
コマンドは終了せず、コマンドから無限に実行されていることがわかりますps
。
編集 - fds のクローズ中にエラーが発生しました。現在、grep コマンドは実行されておらず、コンソール出力は -
grep: (標準入力): 不正なファイル記述子
int array fd[][]
最初のプロセスを分岐する前に、コンソールからコマンドの数を読み取り、必要なパイプを作成して 2 次元に格納しています。
fd[0][0]
最初のパイプの読み取り終了が含まれ、最初のパイプfd[0][1]
の書き込み終了が含まれます。fd[1][0]
2 番目のパイプの読み取り終了が含まれ、2 番目のパイプfd[1][1]
の書き込み終了が含まれます。
新しい各プロセスstdin
は、パイプの読み取り側で前のプロセスと複製しstdout
、パイプの書き込み側で次のプロセスと複製します。
以下は私の機能です:
- argsには、コマンドの引数が含まれます。
- countは、作成する必要があるコマンドの数です。
- posは、入力内のコマンドの位置です
私は問題を理解することができません。これの前に、ハードコードされた値に対して同じアプローチを使用しましたが、機能していました。
/ の理解/実装に欠けているものdup2
とfork
、コマンドが無限に待機しているのはなぜですか?
入力は非常に役立ちます。過去数日間、これに襲われました!
EDIT : close_fds() 関数は以下のとおりです - どのプロセスでも、プロセスをリンクしている両方のパイプを閉じています。
c - プロセス通信: send * コマンド、なぜループするのか
子プロセスを開始しようとしていて、パイプを介してコマンドを送信しています。そして、私が知らない概念が恋しいと思います。
最初のコマンド送信は成功し、もう 1 つは失敗し、無限ループになりました。そして、私はその理由を理解していません。
親.c
child.c
出力は次のとおりです。
-bash-4.1$ ./parent 子プロセス: [61983]
コマンドを入力してください: [allo
]
!
コマンドを入力してください: !
[]
コマンドを入力してください: ^C
-bash-4.1$
プロセスを終了しました。そうしないと、この後に無限ループが発生します。
同様の質問を読んでいますが、答えが見つかりません。できれば、できるだけ簡単に答えてください。
ありがとう。
追伸 はい、これは学校の課題です。私の目標は、同じコマンドを複数の子に送信することです。しかし、私は最初にこのステップから抜け出そうとしています。