linux标准库的问题

最近在ES5的标准库里遇到好几个问题。

一、write写入失败但是返回成功

检查多线程的时候,发现LOG里面打印次数有问题,仔细检查,发现前后的几句LOG只打印出来了前面的1句或2句,但是从后面的LOG来看,这段代码的流畅是没有问题。

write按照说明,原子操作,不缓存直接写入,返回写入长度,返回-1失败。所以在打印LOG的代码里并没有对文件加锁。

于是我写了个小程序,起来10个线程,同时写入一个文件,写了5分钟,结果发现,真正成功写入的不到1/10 ,如果失败,就是1W条左右写入不成功,但是写入失败的返回值既不是-1也不是0,都是成功。

看来只能给redhat包BUG了。

二、在多线程下调用curl下载

开启多线程使用curl的时候,出现curl的堆栈错误,查询了下,es5下是3.0的库,换成4.0的库后,继续堆栈错误,但是堆栈错误和以前不一样了。

自己写了个小程序,起了多个线程调用curl来下载,却一切正常。

于是把堆栈错误时的最后调用搜索了一下,发现果然也有人和我有一样的问题,下面的解答是curl在多线程先进行域名解析会出错。

我前面的测试程序用的全是IP,所有换了域名进行下载后果然出错。

把程序里所有的域名提前做了域名解析,然后再交给curl下载,一切正常。

三、curl的超时设置会取消进程设置的闹钟信号

这个是同事发现的,起了curl的下载后,定时器不运作了,一句一句注释,终于发现是curl的超时设置造成的了。

四、可怕的mysql_ping不退出

程序在运行过程中线程死锁,查看调用堆栈时发现,一个线程在调用mysql_ping无法退出,而这个检查是加了锁的,导致所有线程全部死锁。

至于为什么mysql_ping为什么退不出来,今天研究了一晚上,也没有发现原因。只是有一点,但就是network停掉后,mysql_ping肯定退不出来,至少我等了一个小时,程序也没有从mysql_ping退出来。但是在程序跑的过程中,网络是通的。

以后研究。

续:发现在多线程下,频繁的mysql_ping导致出错或者是mysql_ping不退出,改成mysql_query失败才mysql_ping,结果mysql_query反而出错导致程序退出了。真是够晕。

另:curl似乎在多线程还还是会有一定几率出错,设置CURLOPT_NOSIGNAL为1,情况就好的多了。

时间: 2024-12-08 16:16:23

linux标准库的问题的相关文章

关于在linux下出现stdio.h文件不存在等gcc标准库不能找到的解决办法

首先说明一下我的系统配置:ubuntu 12.04     gcc 4.6.3 有几天没有使用ubuntu了,今天拿出来编程序,刚开始编译一个uboot1.1.6的代码.出现了stdio.h:没有那么个文件或目录的错误,因为我是用的arm-linux-gcc交叉编译编的,所以我刚开始怀疑是不是我的编译器有问题.后来我去编译以前写的一个网络程序 用gcc -o test test.c  然后还是出现了stdio.h:没有那么个文件或目录的错误.然后就各种google,百度.最后的解决方案是: 我的

windows下的c语言和linux 下的c语言以及C标准库和系统API

1.引出我们的问题? 标准c库都是一样的!大家想必都在windows下做过文件编程,在linux下也是一样的函数名,参数都一样.当时就有了疑问,因为我们非常清楚 其本质是不可能一样的,源于这是俩个操作系统啊!但由于c标准库的封装就实现了接口一样.但是如果往深入,我们就非常清楚了在这层封装上还有一层封装其实就是操作系统对文件操作的封装,也就是文件IO.而我们c语言的封装叫标准IO,他们有什么区别那?显然标准iO是基于文件io的,标准IO调用了文件IO,也优化了文件IO,例如引入缓存机制. 2.上面

Android NDK开发及调用标准linux动态库.so文件

源:Android NDK开发及调用标准linux动态库.so文件 预备知识及环境搭建 1.NDK(native development Kit)原生开发工具包,用来快速开发C.C++动态库,并能自动将so文件和java应用一起打包成apk.对应:jni层c++开发 2.Cygwin:是windows平台上模拟Linux运行环境的工具,即window平台上的linux环境工具,so文件需要在linux平台上编译运行.对应:arm linux平台 3.CDT:eclipse下的C/C++开发工具,

Obstack是C标准库里面对内存管理的GNU扩展

Obstack介绍 Obstack初始化 在Obstack中申请对象 释放对象 申请growing object 获取Obstack状态 数据对齐 以下是来自wiki对obstack的介绍: Obstack是C标准库里面对内存管理的GNU扩展(实际上就是GNU C library了).Obstack===Object stack.没错,Obstack就是一个栈,栈里面的元素是对象object(不是面向对象的对象哦,这里的对象单指数据元素).这些数据是动态的,也就是使用的是动态内存.这种内存管理技

python标准库Beautiful Soup与MongoDb爬喜马拉雅电台的总结

Beautiful Soup标准库是一个可以从HTML/XML文件中提取数据的Python库,它能够通过你喜欢的转换器实现惯用的文档导航,查找,修改文档的方式,Beautiful Soup将会节省数小时的工作时间.pymongo标准库是MongoDb NoSql数据库与python语言之间的桥梁,通过pymongo将数据保存到MongoDb中.结合使用这两者来爬去喜马拉雅电台的数据... Beautiful Soup支持Python标准库中的HTML解析器,还支持一些第三方的解析器,其中一个是

Python标准库 (pickle包,cPickle包)

在之前对Python对象的介绍中 (面向对象的基本概念,面向对象的进一步拓展),我提到过Python"一切皆对象"的哲学,在Python中,无论是变量还是函数,都是一个对象.当Python运行时,对象存储在内存中,随时等待系统的调用.然而,内存里的数据会随着计算机关机和消失,如何将对象保存到文件,并储存在硬盘上呢? 计算机的内存中存储的是二进制的序列 (当然,在Linux眼中,是文本流).我们可以直接将某个对象所对应位置的数据抓取下来,转换成文本流 (这个过程叫做serialize),

三种标准库链接方式

Linux 应用程序因为 Linux 版本的众多与各自独立性,在工程制作与使用中必须熟练掌握如下两点才能有效地工作和理想地运行.1.Linux 下标准库链接的三种方式(全静态 , 半静态 (libgcc,libstdc++), 全动态)及其各自利弊.2.Linux 下如何巧妙构建 achrive(*.a),并且如何设置链接选项来解决 gcc 比较特别的链接库的顺序问题.全静态:1.-static -pthread -lrt -ldl2.不会发生应用程序在 不同 Linux 版本下的标准库不兼容问

Linux 标准目录结构

Linux 标准目录结构 初学Linux,首先需要弄清Linux 标准目录结构 / root --- 启动Linux时使用的一些核心文件.如操作系统内核.引导程序Grub等. home --- 存储普通用户的个人文件 ftp --- 用户所有服务 httpd samba user1 user2 bin --- 系统启动时需要的执行文件(二进制) sbin --- 可执行程序的目录,但大多存放涉及系统管理的命令.只有root权限才能执行 proc --- 虚拟,存在linux内核镜像:保存所有内核

Python标准库04 文件管理 (部分os包,shutil包)

作者:Vamei 出处:http://www.cnblogs.com/vamei 欢迎转载,也请保留这段声明.谢谢! 在操作系统下,用户可以通过操作系统的命令来管理文件,参考linux文件管理相关命令.Python标准库则允许我们从Python内部管理文件.相同的目的,我们有了两条途径.尽管在Python调用标准库的方式不如操作系统命令直接,但有它自己的优势.你可以利用Python语言,并发挥其他Python工具,形成组合的文件管理功能.Python or Shell? 这是留给用户的选择.本文