Tag: linux

为什么`ioctl(fd,EVIOCGRAB,1)`有时会导致密钥垃圾邮件?

我正在尝试编写自己的“键盘驱动程序”(没有实际编写内核模块),通过抓取键盘,我认为是userland中最低级别的抽象: /dev/input/event* 。 如果您将ioctl(fd, EVIOCGRAB, UNGRAB)的第一个更改更改为ioctl(fd, EVIOCGRAB, GRAB)以下代码执行此操作。 // gcc main.c -o main #include #include #include #include #include #include #define EXIT_KEY KEY_ESC #define UNGRAB 0 #define GRAB 1 const char* kbd_device = “/dev/input/event4”; // ———————————————————————————————— int main(void){ int fd = open(kbd_device, O_RDONLY); if(fd == -1){ printf(“Cannot open %s. %s.\n”, kbd_device, strerror(errno)); return -1; } if(ioctl(fd, […]

什么是常用的网络编程function/代码片段?

我们所有仍然在C中进行某种网络编程(TCP / UDP,DNS或Client / Server)的人反复使用一些代码片段。 我们确实使用了一些标准库,但是我们也经常编写一些代码,而这些代码并不存在于一个库中。 是否有经常使用的此类代码段的集合。 如果没有,那么让我们在这里建立。

取消引用proc_dir_entry指针导致Linux 3.11及更高版本上的编译错误

我试图按照这里给出的示例rootkit https://github.com/ivyl/rootkit 我修改了这个例子,以便我可以在linux 3.11版本上编译它。 我发现最新的linux版本停止支持几个API,例如create_proc_entry,readdir已经被迭代等替换。 在Linux版本是3.11.0-23我还观察到我的include目录不包含internal.h,以便有完整的proc_dir_entry定义。 在linux上的较低版本(<3.10),我们在proc_fs.h文件中定义了proc_dir_entry。 修改后的rootkit文件如下所示: #include #include #include #include #include #include //#include “fs/proc/internal.h” #define MIN(a,b) \ ({ typeof (a) _a = (a); \ typeof (b) _b = (b); \ _a < _b ? _a : _b; }) #define MAX_PIDS 50 MODULE_LICENSE("Dual BSD/GPL"); MODULE_AUTHOR("Arkadiusz Hiler”); MODULE_AUTHOR(“Michal Winiarski”); //STATIC VARIABLES SECTION //we don’t want […]

C:我如何从文件描述符更改为FILE结构,反之亦然?

有没有办法将int文件描述符更改为FILE结构指针或/并将FILE*更改为C中的文件描述符?

在C中使用linux串口,无法获取完整数据

我正在使用用C编写的Linux串口。下面是我的UART设置 int fd; struct termios tty_attributes; fd = open(comport, O_RDWR | O_NOCTTY | O_SYNC | O_NONBLOCK ); if(fd < 0) { perror("open comport error.\n"); exit(EXIT_FAILURE); } else { if(tcgetattr(fd, &tty_attributes) == -1) { perror("tcgetattr termios function error.\n"); exit(EXIT_FAILURE); } tty_attributes.c_lflag = 0; tty_attributes.c_oflag = 0; tty_attributes.c_iflag = 0; tty_attributes.c_cflag &= ~(IGNBRK|BRKINT|PARMRK|ISTRIP|INLCR|IGNCR|ICRNL|IXON); tty_attributes.c_cflag |= CS8; tty_attributes.c_cflag […]

cd(C)的Minishell问题

我在C中制作了一个简单的minishell,它的工作原理,除了cd命令。 当我尝试运行它时,没有任何事情发生,除了它创建一个永远不会真正结束的子进程。 例如,在我的minishell中运行cd ,我需要输入两次退出以退出minishell,而不是标准的一次。 代码:int debug = 0; void safeQuit(){ if (debug==1) printf(“INFO: Parent process, pid=%d exiting.\n”, getpid()); exit(0); } int main(int argc,char** argv) { int pid, stat; char * Array_arg[50]; char command_line[200];//user input if (argc>1) if (strcmp(argv[1],”-debug”)==0) debug=1; while (1){ printf(“[minishell]> “+debug); gets(command_line); if (strcmp(command_line,”exit”)==0) safeQuit(); char * subcommand=strtok(command_line,” “); //divides the string according […]

在Linux中使用四个fork()之后创建了多少个进程?

我在操作系统教科书上看到了一个愚蠢的问题。 问题如下: 假设所有fork系统调用都成功。执行下面显示的程序后。 屏幕上有多少行? 我假设每次fork调用都会使进程加倍,因此结果应该是16进程创建。 但是当我从教科书中输入相同的代码时,我得到了30行。 这是结果和代码: http://imgur.com/zrdOP0X #include #include #include int main(){ fork(); printf(“After fork1\n”); fork(); printf(“After fork2\n”); fork(); printf(“After fork3\n”); fork(); printf(“After fork4\n”); }

在尝试将GDB附加到进程时如何解决“ptrace操作不允许”?

我正在尝试使用gdb附加程序,但它返回给我: 附加到进程29139无法附加到进程。 如果您的uid与目标进程的uid匹配,请检查/ proc / sys / kernel / yama / ptrace_scope的设置,或以root用户身份再次尝试。 有关更多详细信息,请参阅/etc/sysctl.d/10-ptrace.conf ptrace:不允许操作。 edb-debugger返回“无法附加到进程,请检查权限,然后重试。” strace返回“attach:ptrace(PTRACE_ATTACH,…):不允许操作” 我将“kernel.yama.ptrace_scope”1更改为0并将“/ proc / sys / kernel / yama / ptrace_scope”1更改为0并尝试使用以下方法设置“set environment LD_PRELOAD =。/ ptrace.so”: #include int ptrace(int i, int j, int k, int l) { printf(” ptrace(%i, %i, %i, %i), returning -1\n”, i, j, k, l); return 0; } […]

奇怪的’asm’操作数有不可能的约束错误

我正在尝试编译一个简单的C程序(Win7 32位,Mingw32 Shell和GCC 5.3.0)。 C代码是这样的: #include #include #define _set_tssldt_desc(n,addr,type) \ __asm__ (“movw $104,%1\n\t” \ :\ :”a” (addr),\ “m” (*(n)),\ “m” (*(n+2)),\ “m” (*(n+4)),\ “m” (*(n+5)),\ “m” (*(n+6)),\ “m” (*(n+7))\ ) #define set_tss_desc(n,addr) _set_tssldt_desc(((char *) (n)),addr,”0x89″) char *n; char *addr; int main(void) { char *n = (char *)malloc(100*sizeof(int)); char *addr = (char *)malloc(100*sizeof(int)); set_tss_desc(n, addr); free(n); […]

如何理解这个dmesg错误信息?

我编写了这个简单的模块来处理设备并调用它的一些电源管理方法,如.suspend和.resume 。 在初始化时,模块简单地查找特定设备并尝试调用其方法。 #include #include #include #include static int __init mfps_driver_init(void){ struct pci_dev *dev = NULL; struct pci_driver *driver = NULL; struct device *device = NULL; dev = pci_get_device(0x8086, 0x15a2, NULL); if((dev == NULL) || (dev == 0)){ printk(KERN_INFO “LEONZO: NOTHING FOUND SIZE %ld\n”, sizeof(dev)); } else { driver = dev->driver; printk(KERN_INFO “LEONZO: I FOUND […]