标签: system-calls

为什么 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, PROT_READ, MAP_PRIVATE, 3, 0) = 0x7ff377286000
close(3)                                = 0
open("/lib64/libc.so.6", O_RDONLY|O_CLOEXEC) = 3
read(3, "\177ELF\2\1\1\3\0\0\0\0\0\0\0\0\3\0>\0\1\0\0\0p\36\3428<\0\0\0"..., 832) = 832
fstat(3, {st_mode=S_IFREG|0755, st_size=2100672, ...}) = 0
mmap(0x3c38e00000, 3924576, PROT_READ|PROT_EXEC, MAP_PRIVATE|MAP_DENYWRITE, 3, 0) …
Run Code Online (Sandbox Code Playgroud)

linux directory system-calls rm

10
推荐指数
1
解决办法
3446
查看次数

`EINTR`:它背后有什么理由吗?

作为背景的闲聊

EINTR是所谓的可中断系统调用可能返回的错误。如果在系统调用运行时发生信号,则不会忽略该信号,并且为它定义了SA_RESTART未设置的信号处理程序并且该处理程序处理该信号,则系统调用将返回EINTR错误代码。

作为旁注,我经常ncurses在 Python 中使用这个错误。

问题

POSIX 标准指定的这种行为背后是否有基本原理?可以理解可能无法恢复(取决于内核设计),但是,不在内核级别自动重新启动它的理由是什么?这是出于传统原因还是技术原因?如果这是出于技术原因,这些原因现在仍然有效吗?如果这是出于遗留原因,那么历史是什么?

process signals system-calls posix

10
推荐指数
2
解决办法
7313
查看次数

在显示系统调用中花费的时间时,strace 使用的时间单位是什么?

使用strace带有标志的命令时-T,我想知道用于显示系统调用时间的时间单位是什么?我认为它应该在几秒钟内,但我不太确定,手册中似乎省略了它。

linux process system-calls strace syscalls

10
推荐指数
3
解决办法
4363
查看次数

使进程读取相同文件名的不同文件

我有一个读取文件的应用程序。我们称之为processname和文件~/.configuration。当processname运行时,它总是读取~/.configuration并且不能以不同的方式配置。还有其他应用程序依赖于“~/.configuration”,之前和之后,但不是在processname运行时。

在替换~/.configuration内容的脚本中包装processname是一个选项,但我最近断电(当内容被换出时),我丢失了所述文件的先前内容,所以这是不可取的。

有没有办法(也许使用与 远相关的东西LD_DEBUG=files processname?)来欺骗进程在尝试读取特定文件时读取不同的内容?在可执行文件中搜索和替换文件名有点侵入性,但应该也能工作。

我知道可以编写一个内核模块来接管open()调用(https://news.ycombinator.com/item?id=2972958),但是有没有更简单或更干净的方法?

编辑:在processname可执行文件中搜索~/.configuration 时,我发现它在读取~/.configuration之前尝试读取另一个文件名。问题解决了。

kernel system-calls files ld

9
推荐指数
1
解决办法
1421
查看次数

内核中的哪个文件指定 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");

}
Run Code Online (Sandbox Code Playgroud)

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)                                                                = 0x7fe3cf835000
SYS_close(3)                                                                                = 0
SYS_access("/etc/ld.so.nohwcap", 00)                                                        = -2
SYS_open("/lib/x86_64-linux-gnu/libc.so.6", 0, 00)                                          = 3
SYS_read(3, "\177ELF\002\001\001", 832)                                                     = 832 …
Run Code Online (Sandbox Code Playgroud)

linux system-calls trace linux-kernel ltrace

9
推荐指数
1
解决办法
7769
查看次数

执行权限的目的是什么?

假设setuid/setgid位无关紧要。为什么有单独的执行权限?

从哲学上讲,我觉得写权限包含读权限,读权限包含执行权限。当然,在 Linux 中情况并非如此,这有时可能很有用,但我认为这种情况很少见。例如,如果一个进程可以读取一个不可执行的文件,那么只要该进程可以写入某个目录,它就可以简单地将文件复制到那里,设置执行位,然后运行该程序。所以说真的,read subsumes 在简单的情况下执行。显然,如果源文件有 setuid 位,或者进程只能写入 noexec 挂载点,这将无法正常工作。

我问的原因是我正在实现一个 Linux 系统调用,它允许进程访问exec其内存的任意块。(具体用例是我的主程序中捆绑了一个完整的程序,我不想将其写入磁盘以调用execve.)这样的系统调用是否存在任何我应该注意的严重问题? ?

permissions system-calls executable linux-kernel exec

9
推荐指数
2
解决办法
2934
查看次数

什么时候自己调用 fork() 和 exec()?

我正在学习fork()exec()命令。它似乎fork()exec()通常被称为在一起。(fork()创建一个新的子进程,并exec()用一个新的进程映像替换当前进程映像。)但是,在什么情况下您可以单独调用每个函数?有这样的场景吗?

system-calls fork exec

9
推荐指数
2
解决办法
6165
查看次数

llseek 和 e2fsck 发生了什么?

lseek 手册页:

当用户抱怨 e2fsck(8) 编译错误导致数据丢失时,glibc 2.1.3 添加了链接时警告

“该llseek函数可能很危险;请改用 `lseek64。”

如果需要无警告编译,这使得该函数无法使用。

从 glibc 2.28 开始,该函数符号不再对新链接的应用程序可用。

这背后有什么故事?

linux system-calls glibc

9
推荐指数
1
解决办法
512
查看次数

为什么Wine可以将Windows系统调用转换为Linux系统调用?

只要体系结构相同,Windows .exe 文件可以在 Linux 系统上运行也就不足为奇了(如果它正确加载到 RAM 上)。但Linux和Windows的系统调用完全不同。因此,当 .exe 文件在 Linux 上调用系统调用时,结果将不是我们所期望的。

我认为 Wine 将 Windows 系统调用转换为 Linux 系统调用,但我无法想象如何转换。也许系统调用是通过int、syscall、systenter等实现的。Wine是否通过某种方式直接hook这样的操作?

windows system-calls wine

9
推荐指数
1
解决办法
4039
查看次数

sleep 和 NOP 深度上有什么区别?

我正在尝试学习操作系统概念。这是两个简单的Python代码:

while True:
    pass
Run Code Online (Sandbox Code Playgroud)

和这个:

from time import sleep
while True:
    sleep(0.00000001)
Run Code Online (Sandbox Code Playgroud)

问题:为什么运行第一个代码时 CPU 使用率为 100%,但运行第二个代码时 CPU 使用率约为 1% 到 2%?我知道这可能听起来很愚蠢,但为什么我们不能实施类似的事情sleep在不使用睡眠系统调用的情况下实现用户空间模式之类的东西?

注意:我试图理解Linux 内核的睡眠系统调用,但说实话我不明白那里发生了什么。我还搜索了 NOP 汇编代码,结果发现它并不是真的什么都不做做,而是做了一些无用的事情(比如 xchg eax、eax),也许这就是 100% CPU 使用率的原因。但我不确定。

究竟有哪些睡眠系统调用的汇编代码是我们无法在用户空间模式下执行的?是不是类似 HLT 的东西

我还尝试HLT在代码中使用汇编,如下所示:

section     .text
global      _start 
_start: 
    hlt
halter:
    jmp     _start
section     .data
msg     db  'Hello world',0xa  
len     equ $ - msg   
Run Code Online (Sandbox Code Playgroud)

但运行此代码后,我看到内核一般保护错误如下:

[15499.991751] traps: hello[22512] general protection fault ip:401000 sp:7ffda4e83980 error:0 in hello[401000+1000]
Run Code Online (Sandbox Code Playgroud)

不知道是不是和保护环有关,或者是我的代码错误?这里的另一个问题是操作系统是否在系统HLT调用下使用或其他受保护的汇编命令 …

kernel sleep system-calls linux-kernel cpu-architecture

8
推荐指数
2
解决办法
2481
查看次数