程序调试小结

      看到代码里有
      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

相关文章

分类

留言:

关于文章

This page contains a single entry by DongHao published on 10 17, 2008 10:46 AM.

最man的男人 was the previous entry in this blog.

植物兄弟 is the next entry in this blog.

Find recent content on the main index or look in the 存档 to find all content.