C语言fork子进程调用execlp执行程序输出shell提示符问题咨询
问题根因
你遇到的提示符穿插问题本质是父子进程执行时序问题:主进程(父进程)创建完3个子进程后没有等待子进程执行完毕就直接退出了,shell检测到前台运行的主程序结束,就会提前打印新的命令提示符,而此时尚未执行完的子进程后续输出的内容就会跟提示符交错显示,不存在异常输出,也不需要屏蔽内容,调整进程退出逻辑即可解决。
修复方案
需要在父进程逻辑中新增子进程回收逻辑,等所有子进程全部执行退出后,父进程再结束运行,同时补充execlp调用失败的兜底处理,避免生成异常进程。
修改后的完整代码如下:
#include <stdio.h> #include <unistd.h> #include <sys/wait.h> #include <stdlib.h> int main(){ int i; const char *a[3]; a[0] = "./ContadorScripts"; a[1] = "./ContadorImagenes"; a[2] = "./ContadorLinks"; printf("\n**** ESTADÍSTICAS DEL SITIO WEB ANALIZADO ****\n"); // 创建3个子进程 for (i = 0; i < 3; i++) { if (fork() == 0) { // 子进程逻辑 execlp(a[i], a[i], NULL); // 只有execlp调用失败才会走到这里 perror("程序调用失败"); exit(1); } } // 父进程等待所有子进程退出 while (wait(NULL) != -1); return 0; }
修改点说明
- 新增必要头文件:
wait相关的进程回收函数需要引入<sys/wait.h>,exit函数需要引入<stdlib.h> - 补充子进程异常处理:如果
execlp调用失败(比如目标程序不存在、无执行权限),子进程直接打印错误后退出,避免残留异常进程 - 新增父进程等待逻辑:通过
while (wait(NULL) != -1);阻塞父进程,直到所有子进程都被回收后再继续执行,保证所有子进程的输出都打印完成后父进程才退出,shell也就不会提前打印提示符
内容的提问来源于stack exchange,提问作者Myracle
相关产品推荐
相关产品推荐

