程序使用系统调用来从操作系统的内核请求服务。
手动系统调用给出 STATUS_ACCESS_VIOLATION
我尝试使用系统调用指令调用 NtAllocateVirtualMemory,但它返回错误 STATUS_ACCESS_VIOLATION 我尝试以管理员身份运行它,但它给了我同样的错误。我期待...
在 macOS M1 Arm64 中通过系统调用获取屏幕分辨率
我正在学习arm64汇编,想做一个主机游戏。我获得了有关如何延迟使用 nanosleep 并将一些字符打印到控制台的信息。 现在我想获取我的屏幕的宽度和高度...
使用 ptrace 进行系统调用拦截与 strace 输出不同
我正在使用 nix crate 的 ptrace 功能拦截子进程完成的系统调用。原则上,我的代码正在工作,因为它没有崩溃,系统调用被拦截,a...
我一直在尝试使用 C 中的系统调用来实现“ls”命令,但我遇到了一个小问题。无论我如何尝试,我似乎都无法对目录条目进行排序。 #包括 我一直在尝试使用 C 中的系统调用来实现“ls”命令,但我遇到了一个小问题。无论我如何尝试,我似乎都无法对目录条目进行排序。 #include <stdio.h> #include <stdlib.h> #include <string.h> #include <strings.h> #include <time.h> #include <sys/stat.h> #include <pwd.h> #include <stdbool.h> #include <unistd.h> #include <fcntl.h> #include <dirent.h> #include <limits.h> #define BUFF_MAX 1024 char* octal_to_str(int permissions){ char octal_str[4]; sprintf(octal_str, "%o", permissions); char perm_str[10] = {0}; for (int i = 0; i < 3; i++){ switch (octal_str[i]) { case '0': strcat(perm_str, "---"); break; case '1': strcat(perm_str, "--x"); break; case '2': strcat(perm_str, "-w-"); break; case '3': strcat(perm_str, "-wx"); break; case '4': strcat(perm_str, "r--"); break; case '5': strcat(perm_str, "r-x"); break; case '6': strcat(perm_str, "rw-"); break; case '7': strcat(perm_str, "rwx"); break; default: break; } } return strdup(perm_str); } char* add_dir_to_perms(bool is_dir,char* perms){ char final[11] = {0}; is_dir ? strcat(final, "d") : strcat(final, "-"); return strdup(strcat(final, perms)); } void list_verbose(const char *dirname, struct dirent* entry){ char path[BUFF_MAX]; snprintf(path, sizeof(path), "%s/%s", dirname, entry->d_name); struct stat file_stat; if(stat(path, &file_stat) == -1){ perror("Error getting file status"); return; } char* last_modified = ctime(&file_stat.st_mtime); last_modified[strlen(last_modified) - 1] = '\0'; printf("%s %ld %s %s %ld %s %s\n", add_dir_to_perms(S_ISDIR(file_stat.st_mode),octal_to_str(file_stat.st_mode & 0777)), file_stat.st_nlink, getpwuid(file_stat.st_uid)->pw_name, getpwuid(file_stat.st_gid)->pw_name, file_stat.st_size, last_modified, entry->d_name ); } void list(struct dirent* entry){ printf("%s ", entry->d_name); } int entry_cmp(const void* a, const void* b){ struct dirent* entry_a = (struct dirent*) a; struct dirent* entry_b = (struct dirent*) b; return strcasecmp(entry_a->d_name, entry_b->d_name); } void ls(const char* dirname, bool recurse, bool verbose){ char path[BUFF_MAX]; DIR* dir = opendir(dirname); char* subdir_names[BUFF_MAX]; unsigned subdir_num = 0; if(dir == NULL) { perror("Error opening directory"); exit(EXIT_FAILURE); } struct dirent* entry; struct dirent* entries[BUFF_MAX]; unsigned entry_count = 0; struct stat file_stat; if(recurse) printf("%s:\n", dirname); while((entry = readdir(dir)) != NULL){ if(entry->d_name[0] == '.') continue; entries[entry_count++] = entry; } qsort(entries, entry_count, sizeof(struct dirent*), &entry_cmp); for(unsigned i = 0; i < entry_count; i++){ entry = entries[i]; if(verbose) list_verbose(dirname, entry); else list(entry); snprintf(path, sizeof(path), "%s/%s", dirname, entry->d_name); if(stat(path, &file_stat) == -1){ perror("Error getting file status"); return; } if(S_ISDIR(file_stat.st_mode)) subdir_names[subdir_num++] = strdup(path); } printf("\n\n"); for(unsigned i = 0; recurse && i < subdir_num; i++) { ls(subdir_names[i], recurse, verbose); free(subdir_names[i]); } closedir(dir); } int main(int argc, char* argv[]){ bool VERBOSE = false; bool RECURSIVE = false; if(argc < 1|| argc > 3){ fprintf(stderr, "Usage: %s [-lR] <directory>\n", argv[0]); exit(EXIT_FAILURE); } int opt; while ((opt = getopt(argc, argv, "lR")) != -1) { switch (opt) { case 'l': VERBOSE = true; break; case 'R': RECURSIVE = true; break; default: fprintf(stderr, "Usage: %s [-lR] <directory>\n", argv[0]); exit(EXIT_FAILURE); } } char* dirname; char buff[1024]; if (optind < argc) dirname = argv[optind]; else if ((argc == 3 && RECURSIVE && VERBOSE) ||(argc == 2 && RECURSIVE) || (argc == 2 && VERBOSE) || (argc == 1)){ dirname = getcwd(buff, sizeof(buff)); }else { fprintf(stderr, "No directory specified\n"); exit(EXIT_FAILURE); } struct stat path_stat; if (stat(dirname, &path_stat) == -1) { perror("Error accessing directory"); exit(EXIT_FAILURE); } if (!S_ISDIR(path_stat.st_mode)) { fprintf(stderr, "%s is not a directory\n", dirname); exit(EXIT_FAILURE); } ls(dirname, RECURSIVE, VERBOSE); return 0; } 我尝试使用 gdb 来分析幕后发生的事情,但它似乎让我对目录条目名称感到困惑。 entry_cmp (a=0x7fffffffb160, b=0x7fffffffb168) at Ex-2/myls.c:89 89 struct dirent* entry_a = (struct dirent*) a; (gdb) step 90 struct dirent* entry_b = (struct dirent*) b; (gdb) step 91 return strcasecmp(entry_a->d_name, entry_b->d_name); (gdb) p entry_a->d_name $3 = "UUU\000\000\250\223UUUU\000\000\300\223UUUU\000\000ؓUUUU\000\000\360\223UUUU\000\000\b\224UUUU\000\000 \224UUUU\000\000\070\224UUUU\000\000P\224UUUU", '\000' <repeats 188 times> (gdb) p entry_b->d_name $4 = "UUU\000\000\300\223UUUU\000\000ؓUUUU\000\000\360\223UUUU\000\000\b\224UUUU\000\000 \224UUUU\000\000\070\224UUUU\000\000P\224UUUU", '\000' <repeats 196 times> 排序不进行的原因是什么? 从返回指针上的readdir手册页: 成功后,readdir()返回指向dirent结构的指针。 (此结构可能是静态分配的;请勿尝试对其进行free(3)。) 这里重要的一点是关于“静态分配”的。这意味着 readdir 函数可能只有一个 dirent 结构,并且它不断返回指向同一对象的指针。通过打印所有指针的值,可以在调试器中轻松检查这一点。 这意味着您需要复制结构体,而不是指针。 解决方案是将entries更改为结构体对象数组,而不是指针,然后复制返回的结构体: // ... struct dirent entries[BUFF_MAX]; // Array of objects, not pointers // ... entries[entry_count++] = *entry; // Copy the object, not the pointer // ...
我想唤醒所有在 futex 上休眠的线程。我对 man futex 页面中的不一致感到困惑。 具体来说,该页面显示 val 的类型为 uint32_t。后来,在 FUTEX_WAKE 部分...
我有一个Python代码,其中定义了一些调用外部进程的函数。每个函数启动的每个进程都会生成运行下一个函数所需的最终产品。
我正在进行一个系统调用,提取 mtime 寄存器中的值。 我正在 riscv (xv6) 环境上工作。因为 mtime 寄存器只能在机器模式下读取,不像其他系统调用 w...
从 Go 调用 setns 对于 mnt 命名空间返回 EINVAL
C 代码工作正常并正确进入命名空间,但 Go 代码似乎总是从 setns 调用返回 EINVAL 以进入 mnt 命名空间。我尝试了多种排列(包括
使用 /usr/bin/time -v 我可以通过读取最大驻留集大小数字来找到进程使用的最大物理内存量。 但我目前正在运行一个程序...
我正在尝试使用不同的 C 函数来实现 echo 命令。通过 printf 实现它相当简单: #包括 #包括 #包括 INT...
如果实际的系统调用是clone(),为什么在strace中接受fork()?
我正在使用以下命令来检查我的程序之一执行期间的系统调用次数: strace -e 跟踪= -c ./program [ARGS] 如果我替换 ...
我尝试使用 ptrace 在 C 中重现 strace 行为。 我想检查系统调用是否返回错误(以及错误1),但我不知道该怎么做? 这是 s...
hook系统调用表函数sys_execve后如何打印argv参数
如标题,我通过ftrace hook了系统调用表函数sys_execve,但是当我打印argv参数和envp参数时,printk函数打印了一堆看不见的字符,怎么办...
我正在尝试分别使用一个生产者和一个消费者来开发经典的生产者-消费者循环缓冲区示例。 然而我遇到了一些问题,我不知道它们来自哪里......
我正在尝试添加一个新的系统调用,该调用显示有关系统中当前正在运行的进程的一些信息。我创建了一个名为 proc_info_struct 的新结构,其中包含进程的一部分
有人可以解释一下这两者在linux中的区别吗?请尽可能深入了解操作系统采取的每一步。
在操作系统中运行的应用程序如何保持执行状态,即使它们已经完成了所请求的任务,例如我打开一个文本编辑器应用程序,编写一些文本......
我正在尝试使用 cat 和 execve 系统调用在程序集中输出文件,但我遇到了一些麻烦,我不知道为什么。 节.文本 全局_start _开始: 移动版,59;系统调用...
在汇编中执行后,如何将 execve 系统调用的输出返回到寄存器或堆栈?
我正在用汇编语言编写,我试图弄清楚如何执行 execve 系统调用,但我不想将输出打印到终端,而是想知道它存储在哪里,以便我可以使用它...
我正在开发一个 Linux 密码管理器应用程序,我正在使用 Python。 由于安全原因我想调用 u200dmlocku200du200d 系统调用以避免交换密码变量...