带argv参数的C代码进程问题及GCC编译错误求助
解决C代码的编译警告与逻辑问题
编译警告修复
1. srand参数类型不匹配警告
argv数组元素是char*类型,但srand()需要传入unsigned int类型的种子值,直接传递argv[1]/argv[2]会触发指针转整数的类型不匹配警告。解决方式:
- 用
atoi()将命令行参数字符串转为整数 - 调用
srand()前必须检查argc是否大于等于3,避免访问越界的argv元素
2. 格式字符串参数冗余警告
代码中多处printf存在格式字符串无占位符但传递额外参数的问题:
printf("parent sleep\n",x);:格式字符串没有%d占位符,却传入了x,可删除多余的x,或修改为printf("parent slept %d seconds\n",x);以打印睡眠时间printf("child sleep \n",x1);:同理,要么删除x1,要么添加占位符打印数值- 注意一处
printf中的换行符写错为/n,需修正为\n
代码逻辑问题修复
main返回类型错误:C标准要求main函数返回int,而非void,同时argv的正确类型是char*[],需修改为int main(int argc, char* argv[])- 未初始化变量:子进程中
x1未初始化就调用sleep(x1),会触发未定义行为,需调整代码顺序或提前初始化 srand调用逻辑错误:连续两次调用srand会覆盖种子,且若在fork()前调用,父子进程会共享相同随机种子,导致随机序列完全一致。建议在fork()后,父子进程分别使用不同种子(结合命令行参数或PID)- 子进程循环逻辑错误:原代码先执行
sleep(x1)再生成x1,第一次睡眠的是未初始化值,需调整为先生成随机数再睡眠 - 拼写错误:
printf("I am parnet...")中的parnet修正为parent - 僵尸进程问题:父进程需调用
wait(NULL)等待子进程结束,避免子进程成为僵尸进程
修正后的完整代码
#include <stdlib.h> #include <unistd.h> #include <stdio.h> #include <sys/wait.h> int main(int argc, char* argv[]) { // 检查命令行参数数量是否足够 if (argc < 3) { fprintf(stderr, "Usage: %s <seed1> <seed2>\n", argv[0]); return 1; } int pid, x, s, x1; pid = fork(); if (pid != 0) { // 父进程 srand((unsigned int)atoi(argv[1])); printf("I am original, MY PID %d and MY PPID %d \n", getpid(), getppid()); printf("I am parent and My PID %d and My PPID %d \n", getpid(), getppid()); for (int i = 0; i < 3; i++) { s = rand(); x = s % 5; sleep(x); printf("parent slept %d seconds\n", x); } printf("the parent terminated with PID %d and PPID %d \n", getpid(), getppid()); wait(NULL); } else { // 子进程 srand((unsigned int)atoi(argv[2])); printf("I'm a child with PID %d and PPID %d \n", getpid(), getppid()); for (int i = 0; i < 3; i++) { s = rand(); x1 = s % 5; sleep(x1); printf("child slept %d seconds\n", x1); } printf("the child terminated with PID %d and PPID %d \n", getpid(), getppid()); } return 0; }
内容的提问来源于stack exchange,提问作者Almesh
相关产品推荐
相关产品推荐

