Tag: linux

为什么WIFSIGNALED(状态)在使用ptrace跟踪进程时无法检测到信号?

我正在使用ptrace来跟踪子进程。 当子进程正常退出时,它可以很好地工作。 但是如果它exception退出,程序就会进入无限循环,尽管使用宏WIFSIGNALED(&status)。 这是示例子进程: try.c int main() { int a=5/0; } 这是追踪计划 #include #include #include #include #include #include /* For SYS_write etc */ #include #include int main() { pid_t child; long orig_eax, eax; int status,insyscall = 0; child = fork(); if(child == 0) { ptrace(PTRACE_TRACEME, 0, NULL, NULL); execl(“./try”, “try”, NULL); } else { siginfo_t […]

如何通过Linux上的静态库同步进程?

我有一个家庭作业项目,需要创建一个STATIC库来提供对几个命名管道的相互访问。 这些管道用于使用库和服务器的各种客户端之间的通信。 现在,假设我想使用pthread互斥量; 我怎么能实现这一目标? 进程如何知道哪个是存储互斥锁的共享内存区域? 谁应该要求这个记忆区? 服务器不能,因为它需要库本身提供互斥。 感谢asveikau我想出了这个: #define SHARED 1 #define MUTEX 1 int main() { sem_t* mutex = sem_open(“mutex”, O_CREAT); sem_init(mutex, SHARED, MUTEX); fork(), fork(), fork(); sem_wait(mutex); int i; for(i = 0; i < 10; i++) printf("process %d %d\n", getpid(), i), fflush(stdout); sem_post(mutex); } 从输出真的似乎解决了我的问题。 谢谢大家。

多个线程在循环中运行时如何影响索引

我试图编写一个运行5个线程并相应打印其索引的程序。 以下是代码: #include #include #include int nthreads=5; void *busy(void* c) { int my_busy = *(int *) c; printf(“Hello World with thread index %d\n”, my_busy); return NULL; } int main() { pthread_t t1[nthreads]; void* result; for(int i=0; i<nthreads; i++) { pthread_create(&t1[i], NULL, busy, &i); } for(int i=0; i<nthreads; i++) { pthread_join(t1[i], &result); } return 0; } […]

idt_table undefined! 编译内核模块时发出警告

我正在尝试在内核模块中使用gate_desc *idt_table 。 set_trap_gate()定义的set_trap_gate()函数使用此指针。 在desc.h中也有一个定义: extern gate_desc idt_table[] 。 我尝试了不同的东西: 在我的模块中使用idt_table而没有定义或做法 用我的(有效) idt_table地址影响idt_table我在编译期间得到一个id_table未定义的警告,或者为idt_table得到不完整的类型。 创建一个名为gate_desc *it = (gate_desc *)@;的新var gate_desc *it = (gate_desc *)@; 并将set_trap_gate , set_gate , write_idt_entry , pack_gate函数从sched.h复制到我的模块文件(重命名它们,并使用它而不是idt_table )。 这编译很好,但插入我的模块时,我在模块(ret -1)错误中得到一个未知符号。 (我的模块中没有对idt_table的引用,我在sched中使用的函数使用我的变量)。 我试着看看sched.h中包含的文件在哪里被定义为idt_table ,但找不到它! 有人知道我怎么用,来自sched.h的idt_table指针(用corrct地址影响它)还是创建一个新指针?

如何在不停止C程序的情况下按下最后一个键?

使用命令行界面编写应用程序,我想知道是否按下了F1或ESC或箭头键。 这样做最简单的方法是什么? 我想避免使用readline类型库。 这是一个特定于Linux的问题; 该程序不是multithreading的。

如何编译Linux C程序在另一台Linux机器上运行?

我使用VPS来托管我的网站,但是没有安装gcc软件包。 libc.so.6映射到libc-2.12.so,这是我的问题,因为在我的家用计算机上,库被映射到libc-2.15.so 有时,我需要在VPS上运行一些程序,所以当我编译C源时,我使用-static选项包含在可执行文件中,一切都是需要的。 该程序工作正常,但令我困扰的是,可执行文件大约800 Kb。 如果我在不使用-static选项的情况下进行编译,则可执行文件大约为80 Kb,但它在VOS上不起作用。 有没有人知道任何其他解决方案,而不使用-static选项,以便可执行文件更小? 非常感谢你。

使用Python安装信号处理程序

(这里有一个跟进这个问题) 我正在努力为Linux编写一个基于Python的Init系统,但是我在向我的Python init脚本发送信号时遇到了问题。 从’man 2 kill’页面: The only signals that can be sent to process ID 1, the init process, are those for which init has explicitly installed signal handlers. 在我的基于Python的Init中,我有一个测试函数和一个信号处理程序设置来调用该函数: def SigTest(SIG, FRM): print “Caught SIGHUP!” signal.signal(signal.SIGHUP, SigTest) 从另一个TTY(init脚本在另一个tty上执行sh)如果我发送一个信号,它将被完全忽略,并且永远不会打印文本。 kill -HUP 1 我发现这个问题是因为我为我的Python init编写了一个收割函数,以便在它们死亡时收获它们的子进程,但它们都只是僵尸,需要一段时间才能弄清楚Python从未得到SIGCHLD信号。 为了确保我的环境是理智的,我写了一个C程序来分叉并让孩子发送PID 1信号并且它确实注册了。 如果signal.signal(SIG, FUNC)不工作signal.signal(SIG, FUNC)如何安装系统将确认的信号处理程序? 我将尝试使用ctypes使用C代码注册我的处理程序,看看是否有效,但如果可能的话,我宁愿回答纯Python。 想法? (我不是程序员,我真的在这里:p) 测试代码如下…… import […]

在fork和exec之后在父级和子级之间共享文件描述符

我在Linux,A和B上有两个进程。我想从进程A与进程B共享文件描述符,现在我只是将它序列化为char*并将其传递给execl参数,但这不起作用。 Ac看起来像这样: union descriptor{ char c[sizeof(int)]; int i; } fd; pid_t pid; fd.i = socket(AF_INET, SOCK_STREAM, IPPROTO_TCP); // Perform other socket functions pid = fork(); if(pid == 0){ // Read data from socket if(execl(“./B”, fd.c, NULL) < 0){ exit(EXIT_FAILURE); }else( exit(EXIT_SUCCESS); } }else if(pid < 0){ exit(EXIT_FAILURE); }else{ waitpid(pid, NULL, 0); } Bc看起来像这样: union descriptor{ […]

使用libxml的XML Parser

我刚开始使用libxml来解析xml。 我只需要知道根节点“beatles”是否存在,然后得到子节点“lastname”。 我的代码如下 #include #include #include #include #include void parseStory ( xmlDocPtr doc, xmlNodePtr cur ) { xmlChar *key; cur = cur -> xmlChildrenNode; printf ( “Here\n” ); while ( cur != NULL ) { if ( ( !xmlStrcmp ( cur -> name, ( const xmlChar * ) “lastname” ) ) ) { key = […]

如何将执行命令的结果从服务器发送到客户端?

我正在用C实现一个套接字程序。 节目介绍: 连接服务器和客户端后,客户端向服务器发送命令。 服务器从客户端接收请求并执行它。 服务器将执行结果发送给客户端。 客户端将显示该服务器的执行和显示。 我的问题: 服务器: 我将execvp()函数的结果放入pipe pipefd[1]并使用send()将此数据发送到客户端。 客户: 我收到recv()数据到服务器和显示。 但它不起作用。 我想要的结果: 客户 : ls 服务器: a.txt b.pdf c.jpg 客户: a.txt b.pdf c.jpg 这是我的代码: 服务器: #include #include #include #include #include #include #include #include #define MAXPENDING 5 #define BUFFSIZE 32 #define MAX 128 void Die(char *mess) { perror(mess); exit(1); } void setup(char inputBuffer[], char […]