程序调试小结
看到代码里有
printf("%.*s", msgLen, msg)
觉得奇怪,还以为是笔误,查了查资料,才知道有 %.*s 这种用法:即在字符串指针前再跟上想打印的长度参数。
const char* msg="hello,world";
printf("%.*s", 3, msg); //输出: hel
printf("%.*s", 6, msg); //输出: hello,
启动程序的时候发现一个日志都不输出,什么都不执行,但ps可以看到进程,strace跟一下才发现程序在open一个有名管道(fifo)的时候停住了。原来有名管道如果没有读的一方,open是阻塞的,详细规则如下:
“如果同时用读写方式(O_RDWR)方式打开,则不会引起阻塞。
如果用只读方式(O_RDONLY)方式打开,则open()会阻塞一直到有写方打开管道, 除非你指定了O_NONBLOCK,来保证打开成功。
同样以写方式(O_WRONLY)打开也会阻塞到有读方打开的管道,不同的是如果O_NONBLOCK被指定open()会以失败告终。 ”
程序一直运行正常,突然不转了,再重启也不行,十分怪异:如果是程序有问题,为何先前能运行?如果程序没问题,为什么现在又不能启动了?后来才发现是日志写到2G大小了,重启也写不进日志。linux下2G的文件大小限制,可以在编译时加参数来解决:
gcc -D_FILE_OFFSET_BITS=64
printf("%.*s", msgLen, msg)
觉得奇怪,还以为是笔误,查了查资料,才知道有 %.*s 这种用法:即在字符串指针前再跟上想打印的长度参数。
const char* msg="hello,world";
printf("%.*s", 3, msg); //输出: hel
printf("%.*s", 6, msg); //输出: hello,
启动程序的时候发现一个日志都不输出,什么都不执行,但ps可以看到进程,strace跟一下才发现程序在open一个有名管道(fifo)的时候停住了。原来有名管道如果没有读的一方,open是阻塞的,详细规则如下:
“如果同时用读写方式(O_RDWR)方式打开,则不会引起阻塞。
如果用只读方式(O_RDONLY)方式打开,则open()会阻塞一直到有写方打开管道, 除非你指定了O_NONBLOCK,来保证打开成功。
同样以写方式(O_WRONLY)打开也会阻塞到有读方打开的管道,不同的是如果O_NONBLOCK被指定open()会以失败告终。 ”
程序一直运行正常,突然不转了,再重启也不行,十分怪异:如果是程序有问题,为何先前能运行?如果程序没问题,为什么现在又不能启动了?后来才发现是日志写到2G大小了,重启也写不进日志。linux下2G的文件大小限制,可以在编译时加参数来解决:
gcc -D_FILE_OFFSET_BITS=64
相关文章
- fedora 9 小集 - 01 05, 2009
- 多线程调试 - 12 17, 2008
- fedora 9 试用 - 12 05, 2008
留言: