タグ付けされた質問 「file-descriptors」

3
どの「ファイル記述子」が同じ「オープンファイル記述」を共有しているかを調べる
私が(Bourneのようなシェルで)する場合: exec 3> file 4>&3 5> file 6>> file ファイル記述子3と4は、4がdup()3から編集されたため、同じ開いているファイルの説明を共有します(同じプロパティ、ファイル内の同じオフセット...)。そのプロセスのファイル記述子5と6は、異なるオープンファイル記述上にあります(たとえば、それぞれファイル内に独自のポインターがあります)。 これで、lsof出力で表示されるのは次のとおりです。 zsh 21519 stephane 3w REG 254,2 0 10505865 /home/stephane/file zsh 21519 stephane 4w REG 254,2 0 10505865 /home/stephane/file zsh 21519 stephane 5w REG 254,2 0 10505865 /home/stephane/file zsh 21519 stephane 6w REG 254,2 0 10505865 /home/stephane/file それは少し良いですlsof +fg: zsh …

3
ファイル記述子を移動するための実用
bashのmanページによると: リダイレクト演算子 [n]<&digit- ファイル記述子digitをfile descriptor nに移動するか、n指定されていない場合は標準入力(ファイル記述子0)に移動します 。digitに複製された後に閉じられnます。 ファイル記述子を別の記述子に「移動する」とはどういう意味ですか?そのような実践の典型的な状況は何ですか?

2
ファイル記述子をclose()するとどうなりますか?
ファイル記述子で全体像を取得しようとしています。最初にこれらのファイル記述子を持つprocess1があるとします。 _process1_ | | | 0 stdin | | 1 stdout | | 2 stderr | |__________| 次に、ファイル記述子1を閉じます。 close(1); ファイル記述子1 は、カーネルのOpen Files Tableのstdout FILE構造体に変換(ポイント)します。 上記のコードでは、ファイル記述子1がプロセスのテーブルから削除され、次のようになります。 _process1_ | | | 0 stdin | | 2 stderr | |__________| しかし、カーネルではどうなりますか?んstdoutFILE構造体は、割り当て解除を取得しますか?stdoutが特別なファイル(モニター)であり、おそらく他のプロセスで使用されている場合、それはどのように可能ですか?単なる通常のファイル(たとえば.txt)であるFILE構造についてはどうですか?そのようなファイルが他のプロセスで使用されている場合はどうなりますか?

3
なぜfork()はファイル記述子を返すように設計されているのですか?
彼の上に関するウェブページの自己パイプのトリック、ダン・バーンスタインはと競合状態を説明select()し、信号、回避策を提供していますし、その結論を もちろん、正しいことはfork()プロセスIDではなくファイル記述子を返すことです。 彼はこれによって何を意味しselect()ますか?シグナルハンドラを使用してそれらの状態変化を通知する代わりに、子プロセスで状態変化を処理することができるということですか?

3
コード「{exec> / dev / null; }> / dev / null」内部で何が起きているのでしょうか?
execリダイレクションを含むコマンドリストをリダイレクトする場合、exec> / dev / nullは後で適用されるようには見えません: { exec >/dev/null; } >/dev/null; echo "Hi" 「こんにちは」と印刷されます。 {}コマンドリストはパイプラインの一部でない限り、サブシェルとは見なされないためexec >/dev/null、現在のシェル環境内でコマンドリストを適用する必要があるという印象を受けました。 これを次のように変更すると: { exec >/dev/null; } 2>/dev/null; echo "Hi" 期待どおりの出力はありません。将来のコマンドでも、ファイル記述子1は/ dev / nullをポイントしたままです。これは再実行によって示されます: { exec >/dev/null; } >/dev/null; echo "Hi" 出力されません。 私は台本を作ってそれを追跡しようとしましたが、ここで何が起こっているのか正確にはわかりません。 このスクリプトの各ポイントで、STDOUTファイル記述子はどうなりますか? 編集:私のstrace出力の追加: read(255, "#!/usr/bin/env bash\n{ exec 1>/de"..., 65) = 65 open("/dev/null", O_WRONLY|O_CREAT|O_TRUNC, 0666) = …

2
ファイル記述子とフォーク
子がフォークされた場合、子は親のファイル記述子を継承します。子がファイル記述子を閉じるとどうなりますか?子供が書き込みを開始した場合、親の最後でファイルはどうなりますか?これらの不整合を管理するのは誰ですか、カーネルまたはユーザーですか? プロセスがcloseファイル記述子を介して特定の開いているファイルを閉じる関数を呼び出すとき。プロセスのファイルテーブルでは、参照カウントが1つ減少します。しかし、親と子の両方が同じファイルを保持しているため、参照カウントは2になり、クローズ後は1に減少します。ゼロではないので、プロセスは引き続き問題なくファイルを使用し続けます。 Terrence Chan UNIXシステムプログラミング(ファイルのUNIXカーネルサポート)を参照してください。

2
SSHがバックグラウンドプロセスを待たないのはなぜですか?
ssh -tバックグラウンドジョブが完了するのを待たないのはなぜですか? 例: ssh user@example 'sleep 2 &' sshは2秒後に戻るため、これは期待どおりに機能しますが、 ssh user@example -t 'sleep 2 &' sleep終了するのを待たずにすぐに戻ります。 誰もがこの理由を説明できますか?ssh -t戻る前にすべてのバックグラウンドプロセスが完了するのを待つ方法はありますか? 私のユースケースは、でスクリプトを開始することです。ssh -tこのスクリプトは、メインスクリプトの終了後も存続する必要があるいくつかのバックグラウンドジョブを開始します。でssh -t、これは、これまでは不可能です。

1
exec 3 <&1は何をしますか?
exec現在のシェルでI / Oリダイレクションを実行できることは理解していますが、次のような使用方法しか見ていません。 exec 6&lt;&amp;0 # Link file descriptor #6 with stdin. # Saves stdin. exec 6&gt;&amp;1 # Link file descriptor #6 with stdout. # Saves stdout. それから、私はそれ&lt;が入力ストリーム用で&gt;あり、出力ストリーム用であることを理解しています。それではどうしexec 3&lt;&amp;1ますか? PS:Batsのソースコードからこれを見つけました

2
WLANインターフェイスの速度を見つける方法
ファイル記述子を使用してネットワークインターフェイスの速度を見つけようとしています。をethX呼び出すのは簡単cat /sys/class/net/eth0/speedです。残念ながら、この方法はワイヤレスインターフェイスでは機能しません。呼び出す/sys/class/net/wlan0/speedとエラーが発生します:引数が無効です。 だから、あなた/sys/class/net/eth0/speedはWLANインターフェースのようなアナログを知っていますか?

1
ulimitの修正:ファイルを開く:制限を変更できません:操作は許可されていません
これをさまざまなGNU / Linuxインストールでテストしました。 perl -e 'while(1){open($a{$b++}, "&lt;" ,"/dev/null") or die $b;print " $b"}' システムAおよびD 私がヒットした最初の制限は1024です。これは、/ etc / security / limits.confに次のように置くことで簡単に引き上げられます。 * hard nofile 1048576 次に実行します: ulimit -n 1048576 echo 99999999 | sudo tee /proc/sys/fs/file-max テストは1048576に進みます。 ただし、1048576を超える値に上げることはできないようです。limits.confに1048577を入れても、単に無視されます。 何が原因ですか? システムB システムBIでは、1048576に到達することさえできません。 echo 99999999 | sudo tee /proc/sys/fs/file-max /etc/security/limits.conf: * hard nofile 1048576 …

3
SSH:stdin、stdout、stderrに加えて、追加の「パイプ」fdsを提供します
SSHでホストに接続する場合、通常3「パイプ」は、ホストとゲストとの間に設けられているstdin、stdoutとstderr。 追加のファイル記述子のフォワード(3およびフォワード)を作成するコマンドラインオプションはありますか? たとえば、私はやりたい ssh --forwardfd=10:3 remotehost 'echo test &gt;&amp;3' ローカルで開いたファイル記述子に「テスト」を出力します10。

7
ファイル記述子が有効かどうかのテスト
bashスクリプトに、ファイル記述子(FD)が開いているときに、3以上の追加情報を出力させたいと思います。FDが開いているかどうかをテストするために、次のトリックを考案しました。 if (printf '' 1&gt;&amp;3) 2&gt;&amp;-; then # File descriptor 3 is open else # File descriptor 3 is not open fi 私のニーズにはこれで十分ですが、FDが有効かどうかをテストするより慣用的な方法があるかどうかについて知りたいです。私は特にのマッピングが存在するか否かについての興味fcntl(1)(FDフラグの検索を可能にするシェルコマンドにシステムコールを、O_WRONLY及び O_RDWRFDが書き込み可能であるかどうかをテストし、O_RDONLY及び O_RDWRFDが読み取り可能であるかどうかをテストします)。

2
ファイル記述子とファイル名
ファイル記述子とファイル名の間にはどのような違いと関係があるのだろうと思いました。それらはすべてファイルへのアクセスに使用されますか?はいの場合、同じように? たとえば、/dev/fd/0、/dev/stdin、および/proc/self/fd/0すべてへのリンクです/dev/pts/2。これらの4つのファイル記述子、またはファイル名ですか?

3
ログプログラムはどのようにして削除されたファイルにログを記録し続けることができますか?
以下からのUnixパワーツール、第3版:代わりにファイルを削除するの、それを空のセクションを: アクティブなプロセスでファイルが開かれている場合(ログファイルでは珍しいことではありません)、ファイルを削除して新しいファイルを作成しても、ログプログラムには影響しません。これらのメッセージは、リンクされなくなったファイルに移動し続けるだけです。ファイルを空にしても関連付けは解除されないため、ロギングプログラムに影響を与えることなくファイルをクリアします。 (重点鉱山) プログラムが削除されたファイルにログを記録し続ける理由がわかりません。ファイル記述子エントリがプロセステーブルから削除されていないためですか?


弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.