Articles of 系统调用

在Linux中“哪个源码”什么都不返回?

我想使用exec()在c一些shell脚本。 什么是source ? 是一个binary executable或shell script ? 我在哪里可以find在Linux文件系统? 我跑了 charan@PC-113:~$ which source charan@PC-113:~$

在System.map文件中的地址的含义

这个地址是什么意思? 这些地址加载到内存中的地址?

当仍有大量交换时,malloc失败

为了testing内存不足的行为,我使用GCC 4.7.1在32位Linux 3.2上编译了下面的C程序,没有任何编译器标志: #include <stdlib.h> #include <stdio.h> #include <string.h> #include <errno.h> int main() { while (malloc(4096)) ; printf("%s", strerror(errno)); return 0; } 当我运行程序时,我观察到在大约2.5 GB的驻留内存分配后,malloc失败(“无法分配内存”)。 该机器具有2GB的物理内存和4GB的交换空间。 在程序运行期间没有观察到内核消息。 那为什么Linux停止发放内存? 相关的问题: malloc可以分配的最大内存 ,但是不能解决Linux的细节问题。

如果同时通过2个不同的进程在同一文件上调用写入系统调用会发生什么情况

操作系统是否正确处理? 或者我将不得不打电话给flock()?

用gdb进入swapcontext()

我正在做一个使Unix系统调用的项目。 具体来说,我的项目很大程度上依赖于对getcontext(),makecontext(),swapcontext()和setcontext()的调用。 我试图用gdbdebugging我的代码。 我一行一行进入代码并检查控制,但一旦调用了swapcontext(),就不会再进入代码了。 相反,debugging几乎停在那里,程序的其余部分自动运行而不是逐行运行。 我猜gdb不会进入上下文调用? 有什么办法可以解决这个问题吗? 有一个debugging器,我可以使用这个? 谢谢

在Linux中添加系统调用0.01使用C ++的“信号量”

我试图计算如何实现一组系统调用,在Linux 0.01中提供一个信号量(无需等待)模块。 我希望这些系统调用允许进程请求一个新的信号量并将其用于进程同步。 我想用C ++写这些,但是我很难让它们工作。 任何人都有简单的解决 (系统调用#110)int sema_request(int value):如果成功则返回一个新的信号量,否则返回-1。 新的信号量被初始化为“值”。 您的实现应该在整个操作系统中支持至less10个不同的信号量。 (系统调用#111)int sema_wait(int s):该函数对信号量执行“等待”操作。 如果成功则返回0,否则返回-1。 (系统调用#112)int sema_signal(int s):该函数对信号量执行“signal”操作。 如果成功则返回0,否则返回-1。

何时使用HANDLE_EINTR或HANDLE_EAGAIN?

我在C编写一个Web服务器,我经常使用系统调用,错误返回-1和设置“errno”variables适当的值。 一些系统调用可以返回EINTR和/或EAGAIN。 我有两个包装HANDLE_EINTR,HANDLE_EAGAIN使用这两个错误值,然后重试系统调用。 手册页通常指的是系统调用是否返回EINTR和/或EAGAIN,但是对于某些系统调用实际上不会。 另外一些系统调用可能不直接返回EINTR / EAGAIN,而是通过可能在其中使用的其他系统调用的失败。 我想问一下,如果我可以使用HANDLE_EINTR和/或HANDLE_EAGAIN,而不pipeAPI声明什么(这并不总是完成)。 另外,我从Google的人那里知道,用“close”系统调用来使用HANDLE_EINTR(虽然API指的是使用它)不是一个好主意,所以我不使用它。 有没有其他系统调用有这种行为? 谢谢。

系统调用read()返回比count更大的数字

我从/proc/<pid>/environ读取数据,并得到了奇怪的结果。 这怎么可能? open("/proc/24696/environ", O_RDONLY) = 10 read(10, "24694\nPPid:\t2606\nTracerPid:\t0\nUi"…, 4096) = 1470144576 open("/proc/25387/environ", O_RDONLY) = 10 read(10, "686\nPPid:\t1\nTracerPid:\t0\nUid:\t10"…, 4096) = 5905728 如何read返回比count (4096)更大的价值? 虽然这不会发生每一次。 Debian 7,3.2.0-4-amd64#1 SMP Debian 3.2.84-1 x86_64 GNU / Linux 更新: 我不认为这是strace错误 – 我也打印结果glibc的readfunction相同的结果。 更新2: 我创build了一个testing应用程序,重现问题, https://gist.github.com/lstipakov/70c5b5e96112c7f1f6204d70b2c8280e 它枚举/proc下的所有进程并从environ文件中读取。 问题在不到一分钟的时间内重现: // do read, which sometimes returns weird values on 3.2.0-4-amd64 #1 SMP Debian 3.2.84-1 […]

添加一个“非常有用”的系统调用通常不可用于非root用户

我已经使用有限的function实现了一个简单的Hello World系统调用 – 只是简单地从用户模式转换到内核模式,打印一条logging在内核消息中的消息,并转换回用户模式。 额外功劳的下一步是添加非root用户通常不可用的有用 (新)系统调用。 系统调用可以是一个简单的,但我正在努力想出任何想法…有人能指向我正确的方向或一些将容易实现的东西吗? (我们给出的一个提示是使用你的新系统调用来debugging!)

被阻止的系统调用不会让SIGKILL终止进程

我有一个关于内核线程之间的信号传播的查询。 情景是这样的: 从用户空间应用程序进行系统调用,内核在系统调用内部创build一个线程(让它命名为thread1)。 现在在thread1中,内核在while循环中循环,并被阻塞。 主线程也在while循环中循环。 如果我执行kill -9 <“user app pid>”,应用程序将无法正常退出,即使/ proc项仍然存在,虽然/ proc // fd文件夹变空了。 如果我在主线程的while循环中join以下内容,它会正确捕获信号并退出。 如果我把以下只在thread1的while循环中,主线程仍然不退出。 if (signal_pending(current)) { return; } 你能否build议,内核在这种情况下应该如何处理kill -9信号? 在SIGKILL之后,进程的状态变成僵尸。 系统调用具有以下实现: thread1 = kthread_create(thread_fn, NULL, "thread1"); if (thread1) { wake_up_process(thread1); } printk(KERN_NOTICE "Main thread: current:%s\n", current->comm); while(1) { DELAY_SEC(1) thread_fn是: int thread_fn(void* data) { while(1) { DELAY_SEC(1) } } 问候, 索尼卡