QNX系统下C语言进程管理代码运行异常调试求助
QNX平台进程管理代码异常排查方案
问题1:未使用的getpid()变量影响
- 该变量仅定义未使用,不会对程序运行逻辑产生任何影响,仅会在编译阶段触发
unused variable类警告,直接删除该行代码即可。
问题2:运行时报错根因与修复
代码存在两个直接触发运行错误的写法:
- 首次运行时
example.txt不存在,fopen("example.txt", "r")会返回NULL,后续直接调用fscanf访问空指针会触发段错误。需要新增文件存在性判断,不存在时默认将filePid初始化为-1。 fscanf参数传值错误,当前写法fscanf(file, "%d", filePid)直接传入了int变量,应该传入变量地址,修正为fscanf(file, "%d", &filePid)即可解决该类内存访问错误。
问题3:无法获取fork()返回0值的原因
你的代码逻辑完全错位:
fork()的返回值规则是:给父进程返回子进程的PID,给子进程返回0。但你当前将fork()的返回值写入文件后直接break跳出switch,子进程根本没有机会判断返回值进入循环分支,你把fork返回值的判断逻辑写到了读取旧PID的switch分支里,完全不匹配。
问题4:多分支同时执行的异常原因
fork调用成功后,操作系统会创建两个完全独立的父子进程,两个进程都会从fork返回点继续执行后续代码。你当前的代码没有对父子进程的执行路径做正确拆分,父子进程各自执行了不同的分支逻辑,从外部看就像是同时走了多个分支。
修正后可运行代码
#include <stdio.h> #include <unistd.h> #include <signal.h> #include <stdlib.h> #include <sys/wait.h> int main(void){ int filePid = -1; // 读取旧的子进程PID FILE *file = fopen("example.txt", "r"); if (file != NULL) { fscanf(file, "%d", &filePid); fclose(file); } // 先杀死上一次运行遗留的子进程 if (filePid > 0) { kill(filePid, SIGKILL); // 等待子进程退出避免僵尸进程 waitpid(filePid, NULL, 0); } // 创建新的子进程 pid_t new_pid = fork(); if (new_pid == -1) { // fork失败处理 perror("fork error"); return EXIT_FAILURE; } else if (new_pid == 0) { // 子进程进入无限循环 for(;;){ sleep(7); } } else { // 父进程将新的子进程PID写入文件 file = fopen("example.txt", "w"); if (file != NULL) { fprintf(file, "%d", new_pid); fclose(file); } } return EXIT_SUCCESS; }
内容的提问来源于stack exchange,提问作者user17059077
相关产品推荐
相关产品推荐

