运行C程序出现segmentation fault (core dumped)错误的原因及解决方法
问题分析:fork演示程序的段错误原因及修复方案
错误原因
- 未检查命令行参数数量就直接访问
argv[1]和argv[2]:如果运行程序时没有传入足够的命令行参数,argv[1]或argv[2]会是NULL指针,调用atoi(NULL)会触发段错误——因为atoi会尝试读取NULL指向的内存区域,属于非法内存访问操作。
修复方案
在使用argv之前先校验命令行参数的数量,确保至少传入2个参数;如果参数不足,打印使用提示并退出程序。修改后的代码如下:
/* * Illustrates system call fork */ #include <stdio.h> #include <stdlib.h> #include <unistd.h> int main ( int argc, char *argv[] ) { int tC, tF; pid_t pid; // 检查命令行参数是否足够 if (argc < 3) { fprintf(stderr, "用法: %s <子进程休眠时间> <父进程休眠时间>\n", argv[0]); exit(EXIT_FAILURE); } tC = atoi (argv[1]); tF = atoi (argv[2]); fprintf (stdout, "Main : "); fprintf (stdout, "PID=%d; My parent PID=%d\n", getpid(), getppid()); pid = fork(); if (pid == 0){ // Child sleep (tC); fprintf(stdout, "Child : PIDreturned=%d ", pid); fprintf (stdout, "PID=%d; My parent PID=%d\n", getpid(), getppid()); } else { // Father sleep (tF); fprintf(stdout, "Father: PIDreturned=%d ", pid); fprintf (stdout, "PID=%d; My parent PID=%d\n", getpid(), getppid()); } return 0; }
补充说明
- 修复后运行程序时,需要传入两个整数参数,例如:
./fork_demo 2 3,代表子进程休眠2秒、父进程休眠3秒。 - 参数检查逻辑能在参数不足时给出明确提示,从根源避免非法内存访问导致的段错误。
内容的提问来源于stack exchange,提问作者Marco Sperindeo
相关产品推荐
相关产品推荐

