【Linux C高级编程——文件操作之系统调用】教程文章相关的互联网学习教程文章

如何在Linux上通过系统调用等待按键中断?【代码】

当用户在程序中按nasm编写的特殊按键(如F1-12)时,我希望收到中断.我只需要在主要功能开始时等待功能击键.我知道使用BIOS的int 16h(返回扫描代码)是可能的.我如何在Linux下执行此操作?解决方法:所需的代码相当复杂.我最终想出了如何使用原始ioctl在C中检查F1,进行读取和写入的方法.如果您熟悉汇编和Linux系统调用,则将nasm的翻译应该很简单. 这并不是您想要的,因为它只检查F1,而不检查其余部分. F1的顺序为0x1b,0x4f,0x50.您可以使...

在linux系统调用中查找用户名【代码】

我向Linux内核添加了一个系统调用,如下所示:#include <linux/kernel.h> #include <linux/sched.h> #include <linux/list.h> #include <linux/cred.h> #include <asm/uaccess.h>asmlinkage int sys_os_pid_to_uid(int pid, int* puid) {struct task_struct* task;rcu_read_lock();for_each_process(task){if (task->pid == (pid_t) pid){copy_to_user(puid, &(task->cred->uid.val), sizeof(task->cred->uid.val));}}rcu_read_unlo...

linux中的mount系统调用无法通过df命令显示文件系统的挂载点【代码】

我试图在程序中使用mount()而不是mount命令,我成功使用了以下mount(),结果返回了成功而不是Invalid Argument.int rc = mount("172.16.74.20:/data/redun/snmp","/mnt/data/redun/snmp","nfs",0,"soft,timeo=2,addr=172.16.74.20");if (rc != 0){printf("mount failed, errCode=%d, reason=%s\n",errno, strerror(errno));}但是,当我使用df -h检查安装点时,没有任何显示.我发现相关设备尚未安装.发生了什么?真的成功安装了吗?在Li...

linux-getaddrinfo()是系统调用吗?【代码】

当我发现getaddrinfo()列在“系统调用”或“破产”一章下时,我正在阅读http://beej.us/guide/bgnet/output/html/singlepage/bgnet.html#syscalls. 我想检查它是否真的是我的Debian 8 Linux系统上的系统调用.但是我找不到任何证据表明它是系统调用. 例如,我编写了一个程序foo.c.#include <stdio.h> #include <sys/types.h> #include <sys/socket.h> #include <netdb.h>int main() {struct addrinfo *ai;int ret;ret = getaddrinfo("...

Linux中writev()系统调用的原子性

我查看了Linux内核4.4.0-57-generic的内核源代码,在writev()源代码中没有看到任何锁定.有什么我想念的吗?我看不到writev()是原子还是线程安全的.解决方法:这里不是内核专家,但是无论如何我都会分享我的观点.随时发现任何错误. 浏览内核(虽然我不希望v4.9如此不同),并尝试跟踪writev(2)系统调用,但我可以观察到随后创建以下路径的函数调用: > SYSCALL_DEFINE3(writev, ..)> do_writev(..)> vfs_writev(..)> do_readv_writev(..) 现...

在Linux上的哪个库中,系统调用以及该库如何链接到包含系统调用的可执行对象文件?

我知道系统调用不在C标准库中.是否有系统调用所在的库(某种系统库)? 如果有这样的库,该库如何链接到可执行程序?解决方法:根据目标体系结构,系统调用可以几种不同的方式工作,但无论如何,它不是库调用.这是正在运行的用户空间程序调用内核中某些功能的一种方式. 在非常老的系统中,这通常意味着直接跳转到该内核功能开始的某个地址.后来,内核引入了“跳转表”,从而增加了一个间接层,因此在更改内核时不必更改地址.这种简单的方法很长...

linux-系统调用如何知道包装函数将参数放入何处?

我正在尝试在Linux(RedHat Enterprise 8)中实施syscall,我对其工作方式有些困惑.据我了解,我在用户模式下实现了一个包装器,该包装器将syscall编号放入eax,将参数放在ebx,ecx,edx等中,然后调用int 0x80,后者调用相应的syscall.我的问题是,由于系统调用是像常规C函数一样编写的,因此它如何知道哪些寄存器包含哪些参数?它是一个约定,还是有一个约定的机制?如果存在,它在哪里以及如何执行? 编辑:这是一项家庭作业.我知道有些syscal...

在没有堆栈的情况下在Linux上进行系统调用【代码】

在Linux i386上,使用int $0x80 syscall ABI可以很容易地在没有有效用户空间堆栈的情况下执行syscall.另一方面,vdso / vsyscall接口需要访问堆栈.在这方面,其他Linux端口(特别是x86_64)如何?他们有没有堆栈的方式进行系统调用的方法吗?是否有关于每个架构的可用syscall方法的参考?解决方法:一般来说:不知道.即使在i386上,如果有第6个参数,它也必须在堆栈上传递(例如mmap). 专门针对x86_64:将系统调用号放入%rax(请注意:系统调...

Linux系统调用返回值【代码】

在一项家庭作业中,我们被要求向Linux内核(Red Hat 2.4.18)添加系统调用.根据分配,新系统调用的返回值应为空.系统调用本身非常简单(只需分配一个),就不会出错.根据我的学习和学习,系统调用通常返回负值以指示失败,或者返回0指示成功.我的问题是,这只是一种普遍的做法还是必须的?系统调用可以返回void吗?解决方法:在Linux中,如果所有系统调用都返回,则它们返回的时间很长.假设您使用以下方法声明系统调用:SYSCALL_DEFINE0(mycall)...

系统调用以在c(linux)中绘制点

我是Linux系统调用的新手,我的问题是我们在Linux中有一个系统调用可以在屏幕上绘制点吗?我用Google搜索了它,但找不到任何简单的解释.我想在Linux中编写一个简单的C程序,无需C图形库即可直接在屏幕上绘制一个点. 如果没有这样的系统调用,如何创建自己的系统调用以在屏幕上绘制绘图点?解决方法:在Linux上,最低级别的独立于硬件的图形接口是framebuffer.可通过写入设备节点(通常为/ dev / fb0)来进行操作,这等效于系统调用,因为它是...

linux-在不等待系统调用返回的情况下结束perl脚本【代码】

我正在Linux(Ubuntu 14.04)上运行一个简单的apache Web服务器,并使用perl CGI脚本处理一些请求.该脚本使用系统功能启动系统命令,但是我希望它立即返回,而不管系统调用的结果如何. 我一直在传递给系统的标量参数的末尾添加“&”号(我知道命令注入攻击的含义),尽管这确实会导致系统命令立即返回,但脚本直到下层脚本仍不会退出命令已完成. 如果我使用来自perl CGI的系统调用以10秒钟的睡眠时间触发了一个虚拟的ruby脚本,那么我对Web服...

linux-汇编和系统调用【代码】

我在理解组装中更复杂的系统调用时遇到了一些麻烦.我写了一个exec系统调用,效果很好.bss.text.globl _start_start:#exit(0) system callmovl $1, %raxmovl $0, %rbxint $0X80虽然我有一点保证,但还无法找到有关如何将字符串放入寄存器的信息.因此,作为一个示例,我想执行一个exec系统调用,它作为第一个参数需要运行文件名,并且我想运行“ / bin / bash”,但是如何在rbx中获取它.我什至不知道我必须使用rbx,在X86中我知道我将使用ebx...

Linux被中断的系统调用【代码】【图】

慢系统调用,指的是可能永远无法返回,从而使进程永远阻塞的系统调用,比如无客户连接时的accept、无输入时的read都属于慢速系统调用。 在Linux中,当阻塞于某个慢系统调用的进程捕获一个信号,则该系统调用就会被中断,转而执行信号处理函数,这就是被中断的系统调用。 然而,当信号处理函数返回时,有可能发生以下的情况:如果信号处理函数是用signal注册的,系统调用会自动重启,函数不会返回 如果信号处理函数是用sigaction注册...

Linux内核中的sys_execve()系统调用可以同时接收绝对路径还是相对路径?【代码】

内核级代码中的sys_execve()是否应接收filename参数的绝对或相对路径?解决方法:sys_execve可以采用绝对路径或相对路径 让我们通过以下方式进行验证: >实验原始系统调用>阅读内核源代码>在内核QEMU上运行GDB以验证我们的源代码分析 实验 交流转换器:#define _GNU_SOURCE #include <unistd.h> #include <sys/syscall.h>int main(void) {syscall(__NR_execve, "../b.out", NULL, NULL); }公元前:#include <stdio.h>int main(void)...

linux-是否可以通过LKM添加系统调用?

我想通过LKM添加新的系统调用,但是我不确定如何执行此操作.也就是说,我知道如果我想添加一个全新的系统调用,我可以查看sys_call_table并找到一个sys_ni_syscall并直接替换它,但是我很好奇是否可以实际添加到sys_call_table中.我意识到这是不可能的,因为它是固定大小的数组,但是我想知道是否还有其他聪明的方法可以添加系统调用而不覆盖未使用的系统调用号.解决方法:这是一个例子linux system calls 编辑:上面的示例显示了如何实现...