問題タブ [dup]
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 - 行 > 1 の場合の C dup2 上書きファイルのバグ
infile を outfile に連結する次の簡単なプログラムがあります
ここで、infile の内容が
そしてアウトファイルは
プログラムを実行した後、outfile の内容の最後に余分な「e」が追加されます。
また、出力ファイルが代わりに
あれは。。。になる
なにが問題ですか?
c - dup() とキャッシュフラッシュ
私は C の初心者で、 を使用しようとしていますdup()
。この関数をテストするプログラムを作成しました。結果は、期待したものとは少し異なります。
コード:
プログラムは、複製された fd を介して書き込みを試み、複製された fd を閉じてから、元の fd を介して読み取りを試みます。
複製された fd を閉じると、io キャッシュが自動的にフラッシュされると予想していましたが、そうではありません。fflush()
コード内の関数を削除すると、元の fd は複製された fd によって書き込まれたコンテンツを読み取ることができなくなります。すでに閉鎖されています。
私の質問は:
これは、複製された fd を閉じると、自動的にフラッシュされないということですか?
@編集:
申し訳ありませんが、私の間違いです。理由が見つかりました。最初のプログラムでは次のようになっています。
しかし、持っていません:
使用後はfclose(f_dup);
交換close(f_dup);
して動作します。
したがって、複製された fd は、適切な方法で閉じると自動的にフラッシュされます。 write()
&close()
はペアであり、fwrite()
&fclose()
はペアであり、それらを混在させるべきではありません。
実際、コードでは、複製された fd_dup をwrite()
&close()
で直接使用することができ、新しいものを作成する必要はまったくありませんFILE
。
したがって、コードは次のようになります。
c - dup() と popen() が別のプロセスから呼び出されたときにプロセスが終了できないのはなぜですか?
- 私は
popen()
別のプログラムとdup()
stdoutのプログラムを持っています - 別のプロセス (PHP の例など)から、またはSSH 経由で呼び出された場合、プロセスは終了しません。
process_test.c
:
でコンパイルしgcc process_test.c
、次で実行します。
./a.out
→正常終了ruby -e 'system("./a.out");'
→正常終了php -r passthry("./a.out");
->ハングするssh remotehost ./a.out
->ハングするdup
dup を標準出力したり閉じたりしないと、ハングしません
これは、私が見つけた最も短い再現可能なコードであり、よりよく理解したい動作を示しています。
fork/pcntl/etc を使用して、複数の PHP アプリケーション/フレームワークからこれを抽出するのに何時間もかかりました。つまり、私がこれを書いたり、でっち上げたりしたわけではありません。しかし、明らかに、私がすべてをバラバラにしたため、その全体の感覚が失われました。
質問
- 一部の呼び出しがハングする (php、ssh) 場合とそうでない場合 (ruby) があるのはなぜですか?
- popen の後に fd を閉じても、プログラムがハングします。なぜ?
linux - Linux でのファイル記述子の重複数のカウント
dup
Linux では、コマンド familyを使用してファイル記述子を複製できます。
システム コールを使用して、ファイル記述子の重複数を取得する方法はありますか?
c - 古い記述子を新しい記述子に接続する方法は?
関数と同じようにファイルを開いたhell.txt
としopen()
ます。
次に、記述子を として返すと考えて4
ください。hi.txt
すでに記述子を占有しているので、または関数を使用せずに ファイル3
を接続したい。hell.txt
3
dup2
fcntl()
その2つの機能を使わずに変更することは可能ですか?
c - Cのカスタムシェルでリダイレクト( ">" と "<" )を実行する
「<」コマンドと「>」コマンドだけでリダイレクトを処理できる単純なカスタム シェルを C で作成することになっています。
open(fd, filename, flags)
これを行うために、各コマンドを (文字列の配列で) 解析し、文字 '<' と '>' をチェックしてから、読み取りまたは書き込みのためにファイル名を開きます。
これらのコマンド (% はシェルを意味します) を発行すると、次のような出力が得られるはずです。
ただし、これらのコマンド、および実際にはすべてのコマンドを発行すると、リダイレクトが無視されるように見えます (ただし、無視されませんか?)。同じコマンドを発行すると、次のようになります。
奇妙な部分は、「output.txt」というファイルを作成し、「hello > output.txt」と書き込むことです。
これは、入力リダイレクタと出力リダイレクタの両方で発生します。以下は、出力コマンドを開いて実行するためのコードです。
open_write_file()
ファイル名をフラグ付きO_WRONLY | O_TRUNC | O_CREAT, S_RUSR | S_IRGRP | S_IWGRP | S_IWUSR
で開き、正しく開くことを確認するためにエラー チェックを行うことに注意してください。これを解決して、実際に必要なコマンドを実際に実行するにはどうすればよいですか?
c - dup と dup2 による複数のリダイレクト
シェルの一部を実装します。その一つがパイプです。解析中に、dup2 で入出力をリダイレクトするコマンドを実行します。具体的には、次のことを行います (簡単にするためにここではエラー チェックを記述しませんが、コード内のエラーをチェックします)。解析が始まる前に私は持っています
コマンドの実行:
パイプが処理されると、最後のコマンドの出力が にあるp
ので、それを stdout に書き込もうとします。
しかし、出力を書き込んでから永久にループしますが、その理由がわかりません。1 つの解決策は、すべてのコマンドを保存し、最後のコマンドの出力をリダイレクトしないことですが、その場で実行したいと考えています。
c - Linux cのファイル記述子からstdinをリダイレクトします
次のコードの何が問題なのか理解できません。まったく同じアクションを 2 回実行します。初めて機能し、2 番目に失敗します。
- FDを開く
- 標準入力に複製します。
- 標準入力を閉じる
- 元の fd を閉じる
ステージ 4 で 2 回目にエラーが発生しました。これは、FD が既に閉じられていることを意味します。