Questions tagged «system-calls»

有关程序如何使用系统调用与内核API交互,哪些可用调用,如何工作等细节的问题。


2
fork()和vfork()有什么区别?
我想详细了解fork()和vfork()之间的区别。我无法完全消化手册页。 我还想澄清一下我的一位同事的评论:“ 在当前的Linux中,没有vfork(),即使您调用它,它也会在内部调用fork()。”

2
在Linux上等效于“ truss -T”和“ truss -U”?
是否有与Solaris实用程序的-Tand -U选项truss在Linux上等效的功能。 这些用于指定系统调用(-T)或库函数(-U),当被跟踪的应用程序调用该函数时,该函数将导致其停止。 或者,换句话说,我希望由跟踪的应用程序启动的任何进程在进行给定的系统调用或给定的共享库函数调用时立即停止(好像被SIGSTOP杀死)。 strace并且ltrace在Linux上提供了Solaris的许多功能集truss,但他们似乎并没有这么做。 例如: truss -f -T open cmd 会是这样strace -f cmd,只是如果在执行过程中cmd或任何其后代做任何open系统调用时,它会立即停止(我可以在我方便以后恢复它) 在某些情况下,我可以使用gdb的catch syscall,但我一直在寻找一种解决方案,可以方便地遵循forks并继续对所有分叉的过程进行处理,即使在execves 之后也继续进行处理。 我似乎想起了一些提供相同功能的实用程序,甚至是在远程发生某些系统调用之间,甚至一步一步地向单步应用程序(或同一实用程序的选项),但我的记忆力却使我失望了,我什至无法确定在Linux上。

4
为什么vfork或fork的子代调用_exit()而不是exit()?
从手册页vfork(): vfork()与fork()的不同之处在于,父级被挂起,直到子级对execve(2)或_exit(2)进行调用。子级与其父级(包括堆栈)共享所有内存,直到子级发出execve()为止。子级不得从当前函数返回或调用exit(),而可以调用_exit()。 为什么孩子应该使用an _exit()而不是简单地打电话exit()?我希望这对vfork()和都适用fork()。
12 c  system-calls  fork  exit 

2
为什么没有文件插入系统调用
据我了解,在Linux中,只有用于操纵文件的sys_write syscall才会覆盖文件内容(或扩展到文件末尾)。 为什么在Linux中没有用于在文件中插入或删除内容的系统调用? 由于当前所有文件系统都不需要将文件存储在连续的内存块中,因此应该有可能实现高效的实现。(文件将变得碎片化。) 由于文件系统具有“写时复制”或“透明文件压缩”功能,因此当前插入内容的方式似乎效率很低。

2
使用可加载的内核模块向Linux 3.2.x添加新的系统调用
关闭。这个问题是题外话。它当前不接受答案。 想改善这个问题吗? 更新问题,使它成为Unix&Linux Stack Exchange 的主题。 7年前关闭。 我想在Linux内核3.2.x中添加一个特定的新系统调用,但作为可加载的内核模块(因为我不想一次又一次地重新编译内核) 我通读了Internet和SO上的许多文章,有些地方声称不可能将系统调用实现为可加载模块,而另一些地方则认为可以实现。 哪有 如果有可能怎么办?



1
Linux重新引导系统调用中“魔术参数”的用途是什么?
在阅读Linux源代码(更具体地说是系统调用代码)时,我遇到了sys_reboot实现:http : //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 …

1
为什么rmdir和unlink两个单独的系统调用?
这让我有些疑惑了: [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
内核中哪个文件指定了fork(),vfork()…以使用sys_clone()系统调用
当使用ltrace跟踪系统调用时,我可以看到fork()使用sys_clone()而不是sys_fork()。但是我找不到定义它的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),但是有没有更简单或更简洁的方法? 编辑:在processname可执行文件中搜索〜/ .configuration时,我发现它在读取〜/ .configuration之前试图读取另一个文件名。问题解决了。

1
我应该将O_PATH用于什么,以及如何使用?
我使用的是基于Linux 4.x的发行版,最近我注意到内核的open()系统调用支持O_PATHopen标志。 尽管man它的页面上确实列出了可以在理论上使用的系统调用列表,但我不太了解这个想法是什么。我是否open(O_PATH)仅目录,而不是文件?如果可以,为什么要使用文件描述符而不是目录路径?同样,那里列出的大多数系统调用似乎都不是目录所特有的。因此,我是否还会打开常规文件O_PATH以某种方式获取其目录作为文件描述符?还是要为它们获取文件描述符,但功能有限? 有人可以O_PATH对我们应该使用的内容,用途以及用途进行有力的解释吗? 笔记: 除非必要,否则无需描述它的演变历史(相关的手册页提到Linux 2.6.x,3.5和3.6中的更改)-我只关心现在的情况。 我知道,请不要告诉我只使用libc或其他更高级别的设施。

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.