Linux c语言编程./a.out运行提示段错误 问题收集

段错误,几种可能:

1
2
<strong>一、</strong>函数没有头文件(是的,有时候gcc不会提示没有头文件);
<strong>二、</strong>函数重复定义,全局变量定义后、局部变量又定义了。(一般是调试的时候,代码改来改去,遗漏所致)<br>三、Linux 发行版系统差异,<br>  虽然都是 Linux 内核,同样的函数 Ubuntu 和 CentOS 需要的头文件就不一样, 具体查看 man 手册 <br>四、多线程中,取消线程后,又sleep(1),这时可能线程内存区域都被系统回收,程序又去读,也会出现 “段错误”<br>  具体查看,下面 "<strong>代码示例一</strong>"

  

代码示例一:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
printf("准备取消 %ld 线程!\n", t_ID);
pthread_cancel( t_ID );
//sleep(1); // 这行会导致 "段错误"
            // 分析可能原因:
            //      取消线程后,执行 tryjoin 还有线程信息,
            //      但是,等待1秒后,线程信息被系统回收,对应
            //      内存不能读写,这是再执行 tryjoin 就产生段错误
 
printf("等待 func 线程退出!\n");
// 用 pthread_join 函数,不管线程什么状态,都会去接合,也会段错误
//if( ret_join = pthread_join( t_ID, (void *)&retval) )
// 所以还是用 pthread_tryjoin_np 尝试结合,如果有问题,直接返回不等待 
if( ret_join = pthread_tryjoin_np( t_ID , (void*)&retval)) 
{
    fprintf( stderr,"线程被取消,接合失败!\n返回值: %s\n", strerror(ret_join) );
} else {
    printf("线程接合,func 函数退出值:%d\n", *retval);
}

  

posted @   悟透  阅读(297)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· DeepSeek 开源周回顾「GitHub 热点速览」
· 记一次.NET内存居高不下排查解决与启示
· 物流快递公司核心技术能力-地址解析分单基础技术分享
· .NET 10首个预览版发布:重大改进与新特性概览!
· .NET10 - 预览版1新功能体验(一)
历史上的今天:
2022-04-04 openwrt(LEDE)手动安装Luci管理页控制台
点击右上角即可分享
微信分享提示