问题标签 [system-calls]
For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.
multithreading - 在多线程(使用克隆)程序中调试分段错误
我编写了一个代码来创建一些线程,每当其中一个线程完成时,就会创建一个新线程来替换它。由于我无法使用 pthreads 创建大量线程 (>450),因此我使用了 clone 系统调用。(请注意,我知道拥有如此大量线程的含义,但这个程序只是为了给系统施加压力)。
由于 clone() 需要将子线程的堆栈空间指定为参数,因此我为每个线程分配所需的堆栈空间块并在线程完成时释放它。当一个线程完成时,我向父级发送一个信号以通知它。
代码如下:
我使用了几个数组来跟踪子进程的 pid 和堆栈区基地址(用于释放它)。
当我运行这个程序时,它会在一段时间后终止。使用 gdb 运行告诉我其中一个线程出现 SIGSEGV(分段错误)。但它没有给我任何位置,输出类似于以下内容:
我尝试使用以下命令行在 valgrind 下运行它:
但它在 valgrind 下继续运行,没有任何问题。
我对如何调试这个程序感到困惑。我觉得这可能是一些堆栈溢出或其他问题,但增加堆栈大小(高达 74KB)并没有解决问题。
我唯一的疑问是分段错误的原因和位置或如何调试此程序。
c - 如何强制 gcc 使用 int 进行系统调用,而不是 sysenter?
是否可以强制 gcc 对所有系统调用使用int指令,而不是sysenter?这个问题可能听起来很奇怪,但我必须以这种方式编译一些项目,如 Python 和 Firefox。
概括
感谢 jbcreix,我已经下载了 glibc 2.9 源代码,并修改了 sysdeps/unix/sysv/linux/i386/sysdep.h 中的行,以禁用 sysenter 的使用#undef I386_USE_SYSENTER
,并且它可以工作。
c - Windows 相当于 Linux 的预读系统调用?
是否有与 Linux 的预读系统调用等效的 Windows?
编辑:
如果可能的话,我想要一个完整的函数签名,显示等效的偏移量/计数参数(或下限/上限)。
例如:Linux 函数签名是:
它的使用示例是
其中“file”是先前由 mmap 之类的函数设置的文件描述符。此调用在索引 100 处读取 500 个字节。
编辑 2:如果您不确定 readahead 的作用,请阅读此内容:http: //linux.die.net/man/2/readahead
linux - 限制 Linux 应用程序的系统调用访问
假设一个 Linux 二进制文件foobar
有两种不同的操作模式:
- 模式 A:一种行为良好的模式,其中
a
使用b
和系统调用c
。 a
模式 B:使用系统调用、b
和c
的出错模式d
。
Syscalla
和是无害的,b
而c
syscalld
具有潜在危险,可能导致机器不稳定。
进一步假设应用程序运行的两种模式中的哪一种是随机的:应用程序以模式 A 运行的概率为 95%,而模式 B 的运行概率为 5%。该应用程序没有源代码,因此无法修改,只能按原样运行。
我想确保应用程序无法执行 syscall d
。执行系统调用时d
,结果应该是 NOOP 或应用程序立即终止。
如何在 Linux 环境中实现这一点?
linux - 克隆线程上的 Linux 虚拟计时器行为
我做了以下事情:
- 创建一个重复触发的虚拟计时器。
- 为 SIGVTALRM 安装信号处理程序
- 调用克隆系统调用
- 设置 sched_affinity 以便克隆的线程在不同的 CPU 上运行
克隆的线程也会监听 SIGVTALRM 吗?那么当 SIGVTALRM 被触发时,两个线程都会调用信号处理程序吗?此外,在创建新线程后,我可以将其用于 SIGVTALRM 的信号处理程序更改为另一个函数而不影响主线程信号处理程序吗?
我猜这取决于传递给 clone() 的标志。主要是,我使用的是 CLONE_SIGHAND 和 SIGCHLD。它是否也依赖于其他标志?
c - 文件只能由root用户打开..我猜给了错误的权限
我的程序基本上运行一个带有命令行参数的可执行文件。一个子进程被分叉,子进程的输出被放在文件“filename”中。
问题是创建了文件并写入了数据,但它只能由 root 用户打开。如何使它对调用程序的用户可读?
代码是:
unix - 跨平台测试文件是否为目录的方法
目前我有一些代码(压缩并删除了一堆错误检查):
这在我的 Linux 机器上运行良好。但是在另一台机器上(看起来像 SunOS,sparc):
我在编译时收到以下错误:
我认为dirent.h
标题是跨平台的(用于 POSIX 机器)。有什么建议么。
fork - 在 fork 系统调用之后在较低级别会发生什么?
我知道 fork() 在更高级别上做了什么。我想知道的是这个——
一旦有 fork 调用,就会出现一条陷阱指令,并且控制跳转以执行 fork“处理程序”。现在,这个创建子进程的处理程序如何通过创建另一个地址空间和进程控制块来复制父进程,返回 2 个值,每个进程一个?
叉子在什么执行点返回 2 个值?
简而言之,有人可以解释分叉调用后在较低级别发生的分步事件吗?
c - select()-able 计时器
select() 是一个很棒的系统调用。您可以打包任意数量的文件描述符、套接字描述符、管道等,并在输入可用时以同步方式获得通知。
有没有办法创建一个间隔/单次计时器并将其与 select() 一起使用?这将使我免于为 IO 和计时设置多个线程。
linux - 系统调用号和系统调用处理程序指针冲突
在阅读操作系统概念(7e,Silberschatz,Galvin,Gagne)时,我遇到了一个关于向 linux 内核添加系统调用的学习项目。书上说
Linux 内核最新版本的系统调用号列在 /usr/src/linux-2.x/include/asm-i386/unistd.h 中。(例如,__NR_close 对应于为关闭文件描述符而调用的系统调用 close(),被定义为值 6。) /usr/src/linux-2.x/arc/i386/kernel/entry .S 在标题 ENTRY(sys_call_table) 下。请注意,sys_close 存储在表中编号为 6 的条目中,以与 unistd.h 文件中定义的系统调用号一致。(第 75 页)
我已经从 ubuntu 存储库下载了最新的 linux 源代码包,并发现上述源文件的目录和文件名发生了微小的变化。但是文件/usr/src/linux-source-2.6.31/arch/x86/kernel/less syscall_table_32.S 中有一个有趣的事情让我感到困惑,正如书中所说,sys_close 存储在编号为6的条目中,但是,在 unistd.h 文件中 __NR_close 定义为 57,而不是 6。这种差异的原因是什么?
提前致谢