問題タブ [system-calls]
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.
unix - rename() システムコールが、別のディレクトリに書き込めないディレクトリの移動を禁止するのはなぜですか?
4.2BSD の rename() システムコールでこの設計上の決定がなされた理由を理解しようとしています。ここで解決しようとしているものは何もありません。動作自体の理論的根拠を理解するだけです。
4.2BSD では、ファイルのアトミックな名前変更/移動を許可する目的で rename() syscall が導入されました。4.3BSD-Reno/src/sys/ufs/ufs_vnops.c から:
したがって、このチェックが意図的に追加されたことは明らかです。私の質問は - なぜですか?この動作は直感的なはずですか?
これの影響は、アトミックに書き込むことができる別のディレクトリに書き込むことができないディレクトリ (書き込み可能なディレクトリにある) を移動できないことです。ただし、新しいディレクトリを作成し、リンクを移動して (ディレクトリへの読み取りアクセス権があると仮定して)、ディレクトリの書き込みビットを削除することはできます。アトミックに行うことはできません。
これで、アトミックに移動できない読み取り不可能なコンテンツを含む書き込み不可能なディレクトリが作成されました。ただし、パーミッションを変更し、新しいディレクトリを作成し、ln を使用して新しいリンクを作成し、パーミッションを変更することで、非アトミックに同じ効果を得ることができます。(読者への演習として残しておきます)
. と .. はすでに特別なケースになっているので、ソースが示唆するように、ディレクトリを書き込むことができない場合は「..」を変更できないという直感的なことを特に購入しません。コードの作成者が認識した正しい動作である以外に、これには何か理由がありますか? 書き込み可能なディレクトリ間で (書き込み不可の) ディレクトリをアトミックに移動できるようにした場合、何か悪いことが起こる可能性はありますか?
c - ファイルタイプを取得するために stat() を使用する代わりに?
ファイルの種類を判別できる stat (ほとんどの Unix システムで使用されている) に代わるものはありますか? マンページによると、stat の呼び出しはコストが高く、アプリでかなり頻繁に呼び出す必要があります。
system-calls - sparcアセンブリを使用して高解像度時間を取得するにはどうすればよいですか?
syscall SYS_timeを使用していますが、その解決は1秒です。他に解決策はありますか?
c - C システムコール open / read / write / close および O_CREAT|O_EXCL
次のコードが与えられた場合 (「helloworld」ファイルに「helloworld」を書き込み、テキストを読み取ることになっています):
プログラムを初めて実行すると、出力は次のようになります。
その後、プログラムを実行するたびに、出力は次のようになります。
O_APPEND ファイルを指定したため、テキストが追加されない理由がわかりません。O_CREAT を入れたからでしょうか。ファイルが既に作成されている場合、O_CREAT は無視されるべきではありませんか?
macos - OSXでのXNUカーネルのシステムコールのリストとドキュメント
OSXのXNUカーネルで利用可能なシステムコールのリストとドキュメントを取得する方法を理解しようとしています。私はかなりググってみましたが、役に立つものを見つけることができませんでした。呼び出し規約がBSDと一致することを理解しているので、それは正しいですか?
ありがとう
c - Linux splice() を呼び出すときの引数が無効です
splice syscall を試してみたかったのです。私はこの機能を持っています-あるファイルのコンテンツを別のファイルにコピーする必要があります:
最初の反復で splice を 2 回呼び出すと、毎回 EINVAL ( perror からの無効な引数) が返されます。その理由は何でしょうか?
c - スタックに保存された値を決定する方法は?
私はいくつかの実験を行っており、システムコール中にスタックに保存されているもの (ユーザーランドプロセスの保存された状態) を確認できるようにしたいと考えています。http://lxr.linux.no/#linux+v2.6.30.1/arch/x86/kernel/entry_32.Sによると、レジスタのさまざまな値がスタック ポインタの特定のオフセットに保存されていることがわかります。これは、スタックに保存されているものを調べるために使用しようとしているコードです (これは、私が作成したカスタム システム コールにあります)。
value は unsigned long です。
現時点では、この値は予期されたものではありません (ds のユーザー値として 0 が保存されていることが示されています)。
スタック ポインターのオフセットに正しくアクセスしていますか?
別の可能性として、GDB などのデバッガーを使用して、カーネル内でスタックの内容を調べることはできますか? 私はデバッグにあまり詳しくなく、カーネル内のコードをデバッグする方法がわかりません。どんな助けでも大歓迎です。
windows - システムコールが属する DLL を知るにはどうすればよいですか?
私が持っているプログラムが行うすべての呼び出しの長いリストがあります。私が知る必要があるのは、各呼び出しがどの DLL に属しているかです。どうすればこれを見つけることができますか?
ありがとう、
macos - OSX のユーザー空間から x86 デバッグ レジスタを書き込むにはどうすればよいですか?
OSX ユーザー空間プログラムから、x86 仕様 (DR0-7) で定義されているデバッグ MSR を試してみたいと思います。残念ながら、これらには CPL == 0 (別名リング 0) が必要です。私は OSX syscalls を試してみましたが、kernel_debug
これらにアクセスする方法として実際に飛び出すものは何もありません。
のような高レベルのインターフェースを介してのみ利用できる場合もありますが、それが事実なkernel_debug
のか、それともそれらにアクセスするための魔法の呼び出しが見つからなかっただけなのかは不明です。
私の最終的な目標は、レジスタ自体ではなく、これらのレジスタの機能にアクセスすることです。ハードウェアブレークポイントの設定などの方法について洞察を持っている人はいますか?
linux-kernel - linux-2.6.31 にシステム コールを追加するときに変更が必要なファイルはどこにありますか
システムコールの追加を検索すると、多くの記事が表示されますが、それらは古いバージョンのようであり、簡単なプロセスのようにも思えます。
しかし問題は、記事で提案されているディレクトリがバージョン 2.6.31 に対応していないことです。unistd.h
、syscall_table.S
およびsyscalls.h
またはそれらに対応するファイルがどこにあるか知っている人はいますか?
前もって感謝します。