Articles of 系统编程

在Linux上debugging信号处理程序

我为SIGCHLD设置了一个信号处理程序。 出于好奇,我想尝试从gdb中debugging信号处理程序。 有什么办法可以做到吗? 我试着在处理程序上设置断点并从gdb中运行二进制文件; 但是我似乎不能通过指令debugging处理程序指令。 有什么办法可以去做呢? 我尝试设置一个硬件断点,但这也没有帮助。 我正在玩的代码如下所示。 我正在64位Ubuntu机器上尝试这个。 #include <stdio.h> #include <stdlib.h> #include <signal.h> #include <unistd.h> #include <sys/types.h> #include <sys/wait.h> int VAL = 0; void handler(int sig) { VAL=1; } int main(int argc, const char *argv[]) { int pid, status; signal(SIGCHLD, handler); pid = fork(); if ( pid == 0 ) exit(0); wait(&status); printf("Returned […]

select作品只有一次

/* Wait up to 1 min */ tv.tv_sec = 60; tv.tv_usec = 0; FD_ZERO(&readfd); FD_ZERO(&writefd); for(i=0;i<3;i++) { FD_SET(my_rdfd[i], &readfd); FD_SET(my_wrfd[i], &writefd); } for(int i=0;i<10;i++) { retval = select((NRFDS)+1, &readfd, &writefd, (fd_set*)0, &tv);//NRFDS is a macro if (retval == -1) printf("select() error"); else if (retval) { printf("data found\n"); //do something with the data recieved } else […]

使用开放的系统调用不能正确设置文件权限

我目前正在通过“Linux编程接口”进行工作,在第四章中有一个练习,我们必须重写“tee”命令。 我已经这样做了,但不pipe我做什么我的文件权限(保存在mode_ttypes的variables中)没有被正确设置。 即,我有这样的代码: filePerms = S_IRUSR | S_IWUSR | S_IRGRP | S_IWGRP | S_IROTH | S_IWOTH; // filePerms is mode_t foutputFd = open((argc == 2) ? argv[1] : argv[2], flags, filePerms); // don't worry about the ternary here if (foutputFd == -1) errExit("opening file %s", (argc == 2) ? argv[1] : argv[2]); // …or here. […]

从父进程读取subprocess的/ proc / pid / mem文件

在下面的程序中,我试图导致以下情况发生: 过程A为堆栈variablesa分配一个值。 进程A (父进程)使用PID child_pid创build进程B (subprocess)。 进程B调用函数func1 ,将指针传递给一个 。 过程B通过指针更改variablesa的值。 进程B打开它的/ proc / self / mem文件,寻找包含a的页面,并打印a的新值。 进程A (同时)打开/ proc / child_pid / mem ,寻find正确的页面,并打印一个新的值。 问题在于,在步骤6中,父级只能看到in / proc / child_pid / mem的旧值,而孩子确实可以在/ proc / self / mem中看到新值。 这是为什么? 有没有办法让父母通过/ proc文件系统来查看孩子对其地址空间的更改? #include <fcntl.h> #include <stdbool.h> #include <stdio.h> #include <stdlib.h> #include <string.h> #include <sys/types.h> #include <sys/stat.h> #include <sys/wait.h> […]

glibc文档和字节序

关于进程完成状态的glibc文档指出macrosWEXITSTATUS返回完成状态的低8字节。 macros:int WEXITSTATUS(int状态) 如果WIFEXITED的状态为true,则此macros将返回subprocess的退出状态值的低8位。 但是,/ /usr/include/sys/wait.h说: # define WEXITSTATUS(status) __WEXITSTATUS (__WAIT_INT (status)) 而且,/ /usr/include/bits/waitstatus.h提到: /* If WIFEXITED(STATUS), the low-order 8 bits of the status. */ #define __WEXITSTATUS(status) (((status) & 0xff00) >> 8) 除非我的概念全部搞乱,那么这个低 8位又是如何呢? 或者是libc假设数据是以小端的方式保存的?

正确的方法来使用stat()函数来访问m_time

我的程序需要用户input并检查文件是否在一分钟内被修改,而不是用户input。 我正在尝试使用stat()函数获取文件的最后修改时间,如下所示: 注意:op_mmin是以分钟为单位的用户input struct stat buf; stat(sub_directory, &buf); if((time(NULL) – buf.st_mtime) < atoi(op_mmin) * 60) // if the file was modified in less time ago than specified { printf("%d\n", buf.st_mtime); // this print statement simply is used to check what the st_mtime is. printf("%s\n", full_path); // print the full path of the file } 我的代码目前打印看似随机的负数,如-1036294304和-367577248 […]

为什么是main()的本地缓冲区,然后不能显式地closures这个stream的错误?

我正在学习linux系统编程,O'reilly。 它说:“一个常见的错误是声明缓冲区作为一个自动variables在一个范围内结束之前closuresstream特别是,要小心不要提供一个本地缓冲区的main(),然后不能显式closuresstream。 “ 那么它显示一个错误的代码示例: #include <stdio.h> int main() { char buf[BUFSIZ]; /*set stdin to block-buffered with a BUFSIZ buffer*/ setvbuf(stdout,buf,_IOFBF,BUFSIZ); printf("Arr!\n"); return 0; } 我编译和执行代码..并不真正明白这种代码会导致什么…请帮助我理解这个概念,谢谢大家。

保存/ proc / PID /进程存在后

我希望即使在程序退出之后,进程的/ proc / PID /目录也能被保存一段时间,以便“grand parent”可以从/ proc / PID / stat中检查资源的使用情况。 我不能使用wait4(),因为我关心“grand cild”的资源使用情况。 那么我怎样才能保存/ proc / PID /目录? 注 :在退出程序之前复制/ proc / PID / stat在我的上下文中不是一个解决scheme,因为我需要在整个生命周期中使用该进程的总资源使用情况统计信息。

分叉for循环澄清

我已经在这里看到了很多关于for循环的例子,但是它没有做太多的说明。 让我们使用这个简单的例子来回答如何使用Fork()来创build只有2个subprocess? 举个例子。 for (i = 0; i < n; ++i) { pid = fork(); if (pid) { continue; } else if (pid == 0) { break; } else { printf("fork error\n"); exit(1); } } 我见过的大多数例子都遵循这个通用格式。 但我不明白的是,这是如何防止subprocess分叉? 从我的理解来看,每个被创造的孩子也必须经历这个循环。 但fork()在for循环的最开始被调用,然后进行3次比较。 有人可以解释,即使孩子们似乎调用fork(),这个for循环仍然只能确保父母可以创build孩子吗?

检查安装的信号处理程序

我有一个库为SIGSEGV安装一个信号处理程序进行debugging。 SIGSEGV处理程序只是打印一些信息,然后退出程序。 最近,我需要从Java调用这个库(使用JNI),而我遇到的问题是JVM还为SIGSEGV安装了一个信号处理程序,以实现比我更有用的目的。 所以我想要select的行动是,如果我的图书馆发现一个信号处理程序已经安装了一个信号,它根本不会安装任何信号。 为了清楚起见,我正在使用sigaction调用。 现在要实现我的function,我必须做的是: 一个。 阻止所有信号。 湾 调用sigaction并检查oact是否返回有效的处理程序。 C。 如果是这样的话,请重新调用sigaction作为新的行为。 d。 UNBLOCK信号。 B和C似乎对我来说很麻烦。 我想要的是能够确定一个特定的信号是否已经拥有一个处理程序,而不必先replace该处理程序,然后用原始处理程序重新replace它(无所作为)。 有没有比sigaction更细粒度的东西?