Questions tagged «system-calls»

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

7
如何找到Linux内核系统调用的实现?
我试图mkdir通过查看内核源代码来理解一个函数的工作原理。这是一种尝试了解内核内部结构并在各种功能之间导航的尝试。我知道mkdir在中定义sys/stat.h。我找到了原型: /* Create a new directory named PATH, with permission bits MODE. */ extern int mkdir (__const char *__path, __mode_t __mode) __THROW __nonnull ((1)); 现在,我需要查看在哪个C文件中实现此功能。从源目录,我尝试了 ack "int mkdir" 哪个显示 security/inode.c 103:static int mkdir(struct inode *dir, struct dentry *dentry, int mode) tools/perf/util/util.c 4:int mkdir_p(char *path, mode_t mode) tools/perf/util/util.h 259:int mkdir_p(char *path, …


2
系统调用“ tuxcall”做了什么?
在中include/x86_64-linux-gnu/asm/unistd_64.h,我看到一个名为的系统调用tuxcall, #define __NR_tuxcall 184 man tuxcall除了说这是一个未实现的系统调用外,没有什么其他的。它做了什么?它从未实施过,还是在古代做了什么?

4
为什么UNIX / POSIX系统调用命名如此难以理解?
为什么使用诸如time和creat而不是getCurrentTimeSecsand createFile或者这样的非公开系统调用名,也许更适合Unix get_current_time_secs和create_file。这就引出了我的下一个要点:为什么有人想要cfsetospeed没有骆驼套的东西,或者至少要有下划线才能使之可读?当然,调用将包含更多字符,但是我们都知道代码的可读性更重要,对吗?

3
为什么x86和x86_64中的Linux系统呼叫号码不同?
我知道系统调用接口是在较低级别上实现的,因此依赖于体系结构/平台,而不是“通用”代码。 但是,我不清楚为什么在32位x86内核的Linux中系统调用的编号在相似的体系结构Linux 64位x86_64中不保持相同的原因?做出此决定的动机/原因是什么? 我的第一个猜测是,后台原因是使32位应用程序在x86_64系统上可运行,因此通过合理地偏移系统调用号,系统将知道用户空间是32位还是64位分别。但是事实并非如此。至少在我看来,read()是x86_64中的系统调用号0,无法与这种想法保持一致。 另一个猜测是,更改系统电话号码可能具有安全性/强化背景,而我无法确定自己的身份。 由于对实现与体系结构相关的代码部分所面临的挑战一无所知,我仍然想知道如何在似乎没有必要的情况下更改系统调用号(因为即使一个16位寄存器也将存储比当前约346个数字大得多的数字,以代表全部)调用),将有助于实现除破坏兼容性以外的任何功能(尽管通过库libc使用系统调用可以缓解这种情况)。

2
捕获信号时中断系统调用
通过阅读read()和write()调用上的手册页,可以看出这些调用被信号打断了,而不管它们是否必须阻塞。 特别地,假设 进程为某些信号建立处理程序。 O_NONBLOCK 未设置(即以阻止模式运行)打开设备(例如,终端) 然后,该过程将进行read()系统调用以从设备读取数据,从而执行内核空间中的内核控制路径。 当程序read()在内核空间中执行时,先前安装了处理程序的信号将传递到该进程,并调用其信号处理程序。 阅读SUSv3“系统接口卷(XSH)”中的手册页和相应部分,您会发现: 一世。如果a read()在读取任何数据之前被信号打断(即由于没有可用数据而不得不阻塞),则它将返回-1并将其errno设置为[EINTR]。 ii。如果a read()在成功读取某些数据后被信号中断(即可以立即开始处理请求),则它将返回读取的字节数。 问题A): 我是否正确地假设在任何一种情况下(块/无块)信号的传递和处理对信号都不完全透明read()? 案例一 这似乎是可以理解的,因为阻塞read()通常会将进程置于TASK_INTERRUPTIBLE状态,以便在传递信号时,内核会将进程置于TASK_RUNNING状态。 但是,当read()不需要阻塞(情况ii。)并在内核空间中处理请求时,我会认为信号的到达及其处理将是透明的,就像硬件的到达和正确处理一样中断会。特别是,我会假设在传递信号后,该过程将被暂时置于用户模式下以执行其信号处理程序,然后该信号处理程序将最终返回该用户处理程序,以完成对中断read()(在内核空间中)的处理,从而read()运行其直到完成为止,然后过程返回到调用read()(在用户空间中)之后的点,结果将读取所有可用字节。 但是ii。似乎暗示read()中断了,因为数据立即可用,但是它返回时仅返回部分数据(而不是全部)。 这使我想到了第二个(也是最后一个)问题: 问题B): 如果我在A)下的假设是正确的,那么read()即使不需要阻塞,因为有可用的数据可以立即满足请求,为什么会被中断?换句话说,为什么read()在执行信号处理程序后不能恢复,最终导致所有可用数据(毕竟是可用的)被返回?




4
如何理解管道
当我只是在bash中使用管道时,我对此并没有多加考虑。但是,当我使用系统调用pipe()和fork()一起阅读一些C代码示例时,我不知道如何理解管道,包括匿名管道和命名管道。 经常听到“ Linux / Unix中的所有内容都是文件”。我想知道管道实际上是否是文件,以便它连接的一部分写入管道文件,而另一部分从管道文件读取吗?如果是,在哪里创建匿名管道的管道文件?在/ tmp,/ dev或...? 但是,从命名管道的示例中,我还了解到,使用管道比显式使用临时文件具有空间和时间性能上的优势,这可能是因为管道的实现中没有涉及文件。同样,管道似乎不像文件那样存储数据。所以我怀疑管道实际上是一个文件。

4
NFS上的flock(2)与fcntl(2)
Perl 5.x文档指出,其flock(..)的实现将使用以下本机调用之一,从1开始,如果不可用,则朝3努力: 羊群(2) fcntl(2) 锁f(3) 没关系。但是,您可能已经注意到他们的免责声明,即不应在NFS上使用flock(2)。该文档建议使用-Ud_flock标志强制Perl使用flock(2)。flock(2)的手册页(在Redhat上)声明了有关NFS问题的类似免责声明。 我的问题是,为什么!?!?我似乎找不到更深入的文章,或者对WHY flock(2)的解释在NFS上并不安全。 我在Redhat(正在使用flock(2))和Solaris(正在使用fcntl(2))上用C和Perl编写了几个测试脚本。我运行strace / truss以确保Perl确实确实分别使用了flock(2)和fcntl(2)。我无法复制任何无法兑现锁的问题!是什么赋予了??
19 nfs  system-calls 

3
系统调用,消息传递和中断之间有什么关系?
我正在阅读有关过程管理的Wikipedia文章。我的重点是Linux。我无法弄清楚系统调用,消息传递和中断之间的关系和区别。它们全都用于向内核请求资源和服务的进程吗? 文章中的某些语录和其他一些语录: OS有两种可能的方法可以在程序执行期间重新获得对处理器的控制,以使OS执行取消分配或分配: 该进程发出系统调用(有时称为软件中断);例如,发生I / O请求,请求访问硬盘上的文件。 发生硬件中断;例如,按下键盘上的一个键,或定时器用完(用于抢先式多任务处理)。 在用户模式下执行的程序可以通过两种技术来请求内核的服务: * System call * Message passing 中断是表示需要注意的异步信号,或者是表示需要更改执行方式的软件中的同步事件。 硬件中断使处理器保存其执行状态并开始执行中断处理程序。软件中断通常以指令集中的指令的形式实现,这导致上下文切换到类似于硬件中断的中断处理程序。

5
如果不是用编程语言实现的话,“系统调用”是什么意思?
我想了解“系统调用”一词。我很熟悉,系统调用用于从用户空间应用程序获取内核服务。 我需要澄清的部分是“系统调用”和“系统调用的C实现”之间的区别。 这句话使我感到困惑: 在类似Unix的系统上,该API通常是C库(libc)的实现的一部分,例如glibc,该库为系统调用提供包装函数,通常将其命名为与调用的系统调用相同的名称。 什么是“他们调用的系统调用”?他们的来源在哪里?我可以直接将它们包含在我的代码中吗? 从一般意义上讲,“系统调用”只是一个POSIX定义的接口,但实际上要查看实现,可以检查C源代码,并在其中查看内核通信的实际用户空间实际上如何运行? 背景说明:最后,我试图了解每个c函数是否最终与中的设备进行交互/dev。
14 kernel  c  posix  system-calls 

1
关闭后绑定的TCP本地套接字地址多长时间不可用?
在Linux上(我的实时服务器在RHEL 5.5上-下面的LXR链接是其中的内核版本),man 7 ip说: 除非已设置SO_REUSEADDR标志,否则已绑定的TCP本地套接字地址在关闭后的一段时间内不可用。 我没有使用SO_REUSEADDR。“一段时间”是多长时间?我如何知道它有多长时间,以及如何更改它? 我一直在仔细研究这个问题,发现了一些信息,但是从应用程序程序员的角度来看,这些信息都无法真正解释。以机智: TCP_TIMEWAIT_LEN in net/tcp.h是“等待破坏TIME-WAIT状态的时间”,固定为“大约60秒” / proc / sys / net / ipv4 / tcp_fin_timeout为“如果套接字已被我们关闭,则将套接字保持在状态FIN-WAIT-2的时间”,并且“默认值为60秒” 我遇到的困难是弥合TCP生命周期的内核模型与程序员的端口模型不可用之间的差距,即了解这些状态与“某个时间”的关系。


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.