system-calls 相关问题

程序使用系统调用来从操作系统的内核请求服务。

使用Linux C select系统调用来监控文件

我有以下代码来监视目录的更改,并在终端中打印一些内容。 该代码监视两个文件中的更改 - 一个名为 test,另一个名为 test2 - 之后

回答 1 投票 0

将 ASCII 代码点值存储在浮点数中可以防止将其解释为字符(在 C 中)

浮动c; c = 'a'; 而 (c <= 'z') { write(1, &c, 1); c++; } write() is data type-agnostic. It should deliver the correct code point values to the terminal. The terminal should then

回答 1 投票 0

_syscallN 宏到哪里去了<linux/unistd.h>?

过去的情况是,如果你需要直接在linux中进行系统调用而不使用现有的库,你可以只包含,它会定义一个宏...

回答 1 投票 0

高级程序如何调用用低级语言编写的函数 - 函数调用之间如何进行数据类型转换

众所周知,LINUX 系统调用是用 C 语言编写的,例如:open()、read() 等, - JAVA、PYTHON 等高级语言将如何使用这些函数 - 因为这些系统符合.. .

回答 1 投票 0

为什么设置 F_SEAL_WRITE 后无法创建只读、共享映射?

执行 fcntl(memfd, F_ADD_SEALS, F_SEAL_WRITE); 之后,调用 mmap(NULL, 4096, PROT_READ, MAP_SHARED, memfd, 0);失败并出现错误 EPERM。基于man 2 fcntl,我对F_SEAL_WRITE的理解是...

回答 2 投票 0

手动系统调用给出 STATUS_ACCESS_VIOLATION

我尝试使用系统调用指令调用 NtAllocateVirtualMemory,但它返回错误 STATUS_ACCESS_VIOLATION 我尝试以管理员身份运行它,但它给了我同样的错误。我期待...

回答 1 投票 0

在 macOS M1 Arm64 中通过系统调用获取屏幕分辨率

我正在学习arm64汇编,想做一个主机游戏。我获得了有关如何延迟使用 nanosleep 并将一些字符打印到控制台的信息。 现在我想获取我的屏幕的宽度和高度...

回答 1 投票 0

使用 ptrace 进行系统调用拦截与 strace 输出不同

我正在使用 nix crate 的 ptrace 功能拦截子进程完成的系统调用。原则上,我的代码正在工作,因为它没有崩溃,系统调用被拦截,a...

回答 1 投票 0

自定义 ls 实现中未对目录条目进行排序

我一直在尝试使用 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 // ...

回答 1 投票 0

唤醒所有在futex上休眠的线程

我想唤醒所有在 futex 上休眠的线程。我对 man futex 页面中的不一致感到困惑。 具体来说,该页面显示 val 的类型为 uint32_t。后来,在 FUTEX_WAKE 部分...

回答 1 投票 0

等待外部启动流程产品完成继续

我有一个Python代码,其中定义了一些调用外部进程的函数。每个函数启动的每个进程都会生成运行下一个函数所需的最终产品。

回答 1 投票 0

从主管模式调用

我正在进行一个系统调用,提取 mtime 寄存器中的值。 我正在 riscv (xv6) 环境上工作。因为 mtime 寄存器只能在机器模式下读取,不像其他系统调用 w...

回答 1 投票 0

从 Go 调用 setns 对于 mnt 命名空间返回 EINVAL

C 代码工作正常并正确进入命名空间,但 Go 代码似乎总是从 setns 调用返回 EINVAL 以进入 mnt 命名空间。我尝试了多种排列(包括

回答 2 投票 0

查找进程的总 RAM 消耗,包括交换

使用 /usr/bin/time -v 我可以通过读取最大驻留集大小数字来找到进程使用的最大物理内存量。 但我目前正在运行一个程序...

回答 1 投票 0

为什么 write 系统调用打印的字符数不正确?

我正在尝试使用不同的 C 函数来实现 echo 命令。通过 printf 实现它相当简单: #包括 #包括 #包括 INT...

回答 2 投票 0

如果实际的系统调用是clone(),为什么在strace中接受fork()?

我正在使用以下命令来检查我的程序之一执行期间的系统调用次数: strace -e 跟踪= -c ./program [ARGS] 如果我替换 ...

回答 1 投票 0

如何知道系统调用是否返回错误?

我尝试使用 ptrace 在 C 中重现 strace 行为。 我想检查系统调用是否返回错误(以及错误1),但我不知道该怎么做? 这是 s...

回答 1 投票 0

hook系统调用表函数sys_execve后如何打印argv参数

如标题,我通过ftrace hook了系统调用表函数sys_execve,但是当我打印argv参数和envp参数时,printk函数打印了一堆看不见的字符,怎么办...

回答 1 投票 0

C 信号量和共享内存

我正在尝试分别使用一个生产者和一个消费者来开发经典的生产者-消费者循环缓冲区示例。 然而我遇到了一些问题,我不知道它们来自哪里......

回答 1 投票 0

在 Linux 中添加系统调用时出现“函数的隐式声明”错误

我正在尝试添加一个新的系统调用,该调用显示有关系统中当前正在运行的进程的一些信息。我创建了一个名为 proc_info_struct 的新结构,其中包含进程的一部分

回答 3 投票 0

© www.soinside.com 2019 - 2024. All rights reserved.