タグ付けされた質問 「system-calls」

プログラムがシステムコールを使用してカーネルAPIと対話する方法の詳細、利用可能なコール、それらの機能などに関する質問。


2
fork()とvfork()の違いは何ですか?
fork()とvfork()の違いを詳細に理解したいと思います。マニュアルページを完全に消化できませんでした。 また、同僚のコメントの1つを明確にしたいと思います。「現在のLinuxにはvfork()はありません。たとえそれを呼び出しても、内部的にfork()を呼び出します。」

2
Linuxの「トラス-T」および「トラス-U」と同等ですか?
LinuxでSolarisユーティリティのオプション-Tと-Uオプションと同等の機能はありますか?truss これらは、トレースされたアプリケーションによって呼び出されたときに停止するシステムコール(-T)またはライブラリ関数(-U)を指定することです。 または、別の言い方をすれば、特定のシステム呼び出しまたは特定の共有ライブラリー関数呼び出しを行うとすぐに、トレースされたアプリケーションによって開始されたプロセスを(SIGSTOPによって強制終了されるかのように)停止させたいと思います。 straceおよびltraceLinux上のSolarisの機能セットの多くを提供しtruss、彼らはそれをやっているようには見えません。 例えば: truss -f -T open cmd strace -f cmd実行中のプロセスcmdまたはその子孫のいずれかがopenシステムコールを実行した場合、すぐに停止されることを除きます(そして、都合の良いときに後で再開できます)。 いくつかのケースでは、私が使用できるgdbのをcatch syscall、私は便利なフォークに従うと、すべてのフォークのプロセスのためにそれをやって継続した後もそれをやって続けることができます解決策を探していたexecveの。 私は同じ機能を提供するユーティリティを思い出すようです.1つ(またはその同じユーティリティのオプション)でも、そのようないくつかのsyscallのいくつかの発生の間のシングルステップアプリケーションに、そのようなメモリが私に失敗しています、私も確信できませんそれはLinuxでした。

4
vforkまたはforkの子がexit()ではなく_exit()を呼び出す必要があるのはなぜですか?
のマニュアルページからvfork(): vfork()は、子がexecve(2)または_exit(2)を呼び出すまで親が一時停止されるという点でfork()とは異なります。子は、execve()が子によって発行されるまで、スタックを含むすべてのメモリを親と共有します。子は現在の関数から戻ったり、exit()を呼び出したりしてはなりませんが、_exit()を呼び出すことはできます。 なぜ子供が使用する必要があり_exit()、単純に呼び出すのではなくexit()?私は、これは両方に適用され願っていますvfork()とfork()。
12 c  system-calls  fork  exit 

2
ファイル挿入システムコールがないのはなぜですか
私の理解では、ファイルを操作するためのLinuxにはsys_write syscallしかありません。これはファイルの内容を上書きします(最後にある場合は拡張します)。 Linuxのファイルにコンテンツを挿入または削除するためのsyscallがないのはなぜですか? 現在のすべてのファイルシステムでは、ファイルを連続メモリブロックに格納する必要がないため、効率的な実装が可能です。(ファイルは断片化されます。) 「書き込み時のコピー」または「透過的なファイル圧縮」などのファイルシステム機能では、コンテンツを挿入する現在の方法は非常に非効率的です。

2
ロード可能なカーネルモジュールを使用してLinux 3.2.xに新しいシステムコールを追加する[終了]
閉まっている。この質問はトピック外です。現在、回答を受け付けていません。 この質問を改善したいですか? 質問を更新して、 Unix&Linux Stack Exchangeのトピックとなるようにしてください。 7年前に閉鎖されました。 Linuxカーネル3.2.xに特定の新しいシステムコールを追加したいが、ロード可能なカーネルモジュールとして(カーネルを何度も再コンパイルしたくないため) 私はインターネットやSOでも多くの投稿を読みましたが、一部の場所では、システムコールをロード可能なモジュールとして実装することは不可能であると主張しています。 どっち?可能な場合はどうすればよいですか?



1
Linuxの再起動システムコールでの「魔法の引数」の用途は何ですか?
Linuxのソースコード、より具体的にはシステムコールのコードを読んでいるときに、httpsys_reboot://lxr.free-electrons.com/source/kernel/reboot.c#L199の実装に遭遇しました。 199 SYSCALL_DEFINE4(reboot, int, magic1, int, magic2, unsigned int, cmd, 200 void __user *, arg) 201 { 202 ... ... 286 } 真ん中には、次の特定のコードがあります。 209 210 /* For safety, we require "magic" arguments. */ 211 if (magic1 != LINUX_REBOOT_MAGIC1 || 212 (magic2 != LINUX_REBOOT_MAGIC2 && 213 magic2 != LINUX_REBOOT_MAGIC2A && 214 …

1
なぜrmdirと2つの別々のシステムコールのリンクを解除するのですか?
ここに私がしばらく疑問に思った何かがあります: [15:40:50][/tmp]$ mkdir a [15:40:52][/tmp]$ strace rmdir a execve("/usr/bin/rmdir", ["rmdir", "a"], [/* 78 vars */]) = 0 brk(0) = 0x11bb000 mmap(NULL, 4096, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_ANONYMOUS, -1, 0) = 0x7ff3772c3000 access("/etc/ld.so.preload", R_OK) = -1 ENOENT (No such file or directory) open("/etc/ld.so.cache", O_RDONLY|O_CLOEXEC) = 3 fstat(3, {st_mode=S_IFREG|0644, st_size=245801, ...}) = 0 mmap(NULL, 245801, …

4
いつfork()とexec()を呼び出すのですか?
私はfork()およびexec()コマンドについて学習しています。fork()とexec()は通常一緒に呼び出されるようです。(fork()は新しい子プロセスを作成し、exec()は現在のプロセスイメージを新しいプロセスに置き換えます。)ただし、どの関数を使用して各関数を独自に呼び出すのでしょうか。このようなシナリオはありますか?


2
カーネルのどのファイルがsys_clone()システムコールを使用するためにfork()、vfork()…を指定するか
ltraceを使用してシステムコールをトレースすると、fork()がsys_fork()ではなくsys_clone()を使用することがわかりました。しかし、それが定義されているLinuxソースを見つけることができませんでした。 私のプログラムは #include<stdio.h> main() { int pid,i=0,j=0; pid=fork(); if(pid==0) printf("\nI am child\n"); else printf("\nI am parent\n"); } そしてltraceの出力は SYS_brk(NULL) = 0x019d0000 SYS_access("/etc/ld.so.nohwcap", 00) = -2 SYS_mmap(0, 8192, 3, 34, 0xffffffff) = 0x7fe3cf84f000 SYS_access("/etc/ld.so.preload", 04) = -2 SYS_open("/etc/ld.so.cache", 0, 01) = 3 SYS_fstat(3, 0x7fff47007890) = 0 SYS_mmap(0, 103967, 1, 2, 3) …

3
プロセスに同じファイル名の別のファイルを読み取らせる
ファイルを読み取るアプリケーションがあります。それをprocessnameとファイル〜/ .configurationと呼びましょう。ときProcessNameのは、走ることは常に読み込み〜/ .configurationをし、異なって設定することはできません。「〜/ .configuration」に依存する他のアプリケーションもありますが、プロセス名の実行中ではありません。 〜/ .configurationの内容を置き換えるスクリプトでプロセス名をラップすることはオプションですが、最近、停電があり(内容がスワップアウトされている間に)、上記のファイルの以前の内容が失われたため、これは望ましくありません。 LD_DEBUG=files processnameプロセスが特定のファイルを読み込もうとしたときに、プロセスをだましてさまざまなコンテンツを読み取らせる方法(おそらく、遠くに関連する何かを使用しますか)はありますか?実行可能ファイル内のファイル名を検索して置き換えることは少し侵略的ですが、同様に機能するはずです。 open()呼び出しを引き継ぐカーネルモジュール(https://news.ycombinator.com/item?id=2972958)を作成することは可能ですが、より簡単またはよりクリーンな方法はありますか? 編集:プロセス名実行可能ファイルで〜/ .configurationを検索すると、〜/ .configurationを読み取る直前に別のファイル名を読み取ろうとしていることがわかりました。問題が解決しました。

1
「O_PATH」を何に使用するのですか?
Linux 4.xベースのディストリビューションを使用していますが、最近、カーネルのopen()システムコールがO_PATHオープンフラグをサポートしていることに気付きました。 そのmanページには理論的に使用できるシステムコールのリストがありますが、その考え方がよくわかりません。Iやるopen(O_PATH)だけのディレクトリ、ファイルではなく?そして、もしそうなら、なぜディレクトリのパスの代わりにファイル記述子を使用したいのですか?また、リストされているシステムコールのほとんどは、ディレクトリに固有のものではないようです。では、通常のファイルを開いてO_PATH、どういうわけかそれらのディレクトリをファイル記述子として取得しますか?または、それらのファイル記述子を取得するには機能が制限されていますか? 誰かが何O_PATHをどのように、そして何のために、私たちがそれを使うことになっているのかについて、説得力のある説明を与えることができますか? ノート: 必要な場合を除いて、これがどのように進化したかについての歴史を説明する必要はありません(関連するmanページではLinux 2.6.x、3.5、3.6での変更点について言及しています)。 libcやその他の高レベルの機能を使用するように言わないでください。

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