一个进程是否可以拥有非阻塞描述符,而另一个进程拥有引用同一文件/套接字的阻塞描述符?
与常规文件相比,我对套接字更感兴趣,但基本上我想知道一个进程是否可以将套接字“视为”阻塞,而另一个进程可以将其视为非阻塞。我猜是的,内核根据系统调用中使用的选项来处理所有这些。 我想这更多是关于 Unix 域套接字而不是 TCP 套接字,因为我不认为 2 个不同的进程可以使用相同的 TCP 套接字(但我可能是错的) ...
与常规文件相比,我对套接字更感兴趣,但基本上我想知道一个进程是否可以将套接字“视为”阻塞,而另一个进程可以将其视为非阻塞。我猜是的,内核根据系统调用中使用的选项来处理所有这些。 我想这更多是关于 Unix 域套接字而不是 TCP 套接字,因为我不认为 2 个不同的进程可以使用相同的 TCP 套接字(但我可能是错的) ...
我正在学习如何使用killpg 系统调用。因此,为了进行实验,我想使用相同的 pgid 启动两个新进程,然后尝试使用killpg 杀死它们。 我读到了关于setsid的内容,所以我尝试了类似的方法: setsid gedit & firefox & 但是这两个进程:gedit 和 firefox 最终有两个不同的 pgid。 ...
对于 process_vm_readv,linux 手册页指出: [...](避免)在单个远程 iovec 元素中跨越内存页面(通常为 4KiB)。 (相反,将远程读取拆分为两个remote_iov元素,然后将它们合并回单个写入local_iov条目。第一个读取条目向上到达页边界,而第二个读取条目从下一页边界开始。) 我明白为什么这是一件事,但我不太明白应该如何解决它。我是否需要找出页面边界在哪里?或者只要我提供 2 个remote_iov 元素,该函数就会自行解决这个问题吗?如果我读取的内容超过 4kiB 并且可能跨越 2 个页面边界,我是否需...
我正在查看 中的 Linux 5.0-rc5 源代码arch/x86/entry/syscalls/syscall_64.tbl,发现 x32 没有单独的系统调用号mmap。 那么内核如何知道我们在用户空间中使用 x32 ABI,从而不给我们超过 4GiB 的映射地址呢? 或者一般来说,可能返回地址的系统调用如何知道我们正在使用 x32 并且不返回超过 4GiB 的地址? ...
如果系统调用需要一些 32 位参数,例如uid_tor int(对于文件描述符),unsigned int甚至需要一些 16 位类型,我如何使用 64 位寄存器传递它们? 在使用该指令之前,是否需要将它们进行零扩展或符号扩展至 64 位syscall? 如果我__X32_SYSCALL_BIT在 RAX 中使用,使原始 64 位指针类型参数变成 32 位,我仍然需要使用相同的 64 位寄存器来传递参数,在这种情况下我需要对地址参数进行零扩展吗? ...
某些 Linux 系统调用(例如execve、openat)具有字符串类型参数。但seccomp提供的比较函数SCMP_CMP似乎是在比较两个指针。那么如何使用 seccomp 将进程可以打开的文件限制到特定目录呢?有没有办法为用户提供通用的比较功能? ...
我目前正在尝试实现我自己的VDSO。我见过本教程这解释了如何做到这一点。 但是,本教程是针对 Linux 2.6.x 编写的,我想在 Linux 4.8.x 上使用它。但自该版本以来,vdso 的架构结构发生了很大变化(例如 vextern.h 已被抑制),我不知道如何调整它以使其正常工作。 您知道我如何调整本教程以适应最新的内核吗?或者我可以在哪里找到足够的有关 vdso 的资源来实现我自己的? 另外,您知道我是否可以简单地将任意系统调用的行为重新创建为 VDSO?我知道从安全角度来看这是一个非常糟糕的...
我想运行一个程序,当该程序尝试读取特定文件时,我希望它读取我选择的不同文件。 具体来说,该程序尝试读取配置文件,但设计很差,不允许用户指定配置文件的位置。我也无权在程序尝试读取的位置编辑文件。 我知道有可能探测程序使用 进行的系统调用strace,并且我可以open()通过在 下运行该程序来查看该程序进行的唯一系统调用strace。有什么办法可以截距该系统调用并更改其行为以打开我选择的不同文件? ...
我知道进程无法阻止 SIGKILL。 但是有没有一种外部方法可以暂时阻止 SIGKILL 到达(特定)进程? (比如通过防火墙丢弃数据包)。 ...
我试图了解 Linux 上的功能和系统调用之间的关系。 据我所知,只有当进程调用系统调用时才会考虑进程的功能。当使用某些参数调用某些系统调用时,只有当该进程具有某些功能时,系统调用才会成功。 对于具有特定参数的特定系统调用来说,是否只需要一种功能就可以成功?或者某些系统调用在使用一组特定(或任何)参数调用时是否需要多种功能? ...
在指示运行的 shellstrace上运行,提供以下输出,该输出显示在执行实际二进制文件之前的大量统计信息:bashmkdirmkdir BASH$> strace -f sh -c "bash -c \"mkdir /tmp\" 2>&1 | nl | grep -e "execve\|stat\|access" [.....] 2766 [pid 17371] stat(".", {st_mode=S_IFDIR|0750, st_size=17262, ...}) = 0 2767 [pid 17371] stat(...
StackOverflow 的这篇文章有这个, 在某些环境中,某些指令或使用某些寄存器存在限制。例如,在Linux内核中,通常不允许使用SSE/AVX或FP寄存器。因此,大多数优化的 memcpy 变体无法使用,因为它们依赖于 SSE 或 AVX 寄存器,并且在 x86 上使用基于 mov 的普通 64 位副本。对于这些平台,使用rep movsb 可以实现优化memcpy 的大部分性能,而不会打破SIMD 代码的限制。 为什么 x86_64 内核不能使用 SSE/AVX?如果它会变得memcopy()更快,似乎应该被允许。当我看到这个评论时,我...
考虑以下内容(sh存在/bin/dash): $ strace -e trace=process sh -c 'grep "^Pid:" /proc/self/status /proc/$$/status' execve("/bin/sh", ["sh", "-c", "grep \"^Pid:\" /proc/self/status /"...], [/* 47 vars */]) = 0 arch_prctl(ARCH_SET_FS, 0x7fcc8b661540) = 0 clone(child_stack=NULL, flags=CLONE_CHI...
我需要将 IO pin 值与从用户空间写入串行端口进行同步(因为我还无法从内核空间做到这一点 - 请参阅我的其他问题)。我的代码(省略错误检查)如下: char buf[3] = {'U','U','U'}; int fd = open("/dev/ttyS1", O_RDWR | O_NOCTTY); // supposed to be blocking // fcntl(fd, F_SETFL, fcntl(fd, F_GETFL) & ~O_NONBLOCK); <-- makes no difference FILE *f = fop...