1. 关于Standard I/O
stdout 是有缓存的,stderr 没有,我们可以用fflush(stdout)来讲缓冲区中的输出输出到console。 如下代码会有奇怪行为,因为stdout做了缓存。 while(1) { printf("."); sleep(1); } 2. exit(1)和abort() abort()函数是在发生了没有预料到的事情的情况下调用的,比如一个switch-case语句中,用default来捕捉那些没能预料到的值。 exit(1)调用,发生了你遇到的的事情,但是这个事情不对,整个程序此时应该结束。比如打开一个file,结果失败了,就exit(1)。 3. 临时文件 如果程序使用到临时文件(通常创建于/tmp目录下),那么要注意以下几点 =》 文件名要唯一 (用mkstemp或者mkostemp确保,create+open) =》 及时清除 (mkstemp后立马unlink) 如果是要使用文件流的话,用tmpfile(void),这个函数返回临时文件的文件流,并且能保证自动清除临时文件。但是,对于在/tmp目录下创建的named pipe(FIFO),我们就不能用mkstemp和tmpfile,因为,通信双方有可能是两个不相关的进程,而他们必须知
道他们要打开的临时文件名(即管道名),所以用prename_pid_fifo这种形式比较合理,比如,cli_19882_fifo。
另外,temporary file提供了client-pipe-server之间传输大数据的一种方法。为了保证写操作的原子性,对named pipe(以下简称FIFO)的写操
作的字节数,必须要小于PIPE_BUF这个宏定义的数量;所以,如果client要给server传输大数据的话,就不可避免的出现了数据拆分的情况,而
server中处理包的线程有多个,于是就有可能出现不确定的行为,除非给各个线程间加上通信和同步,这样就把问题复杂化了。如果我们利用temp
file的话,那么client就只需要告诉server说“我给你传的这次数据比较大,在/tmp/xxxx”中,于是server就可以利用这个temp file来获取大段
信息;注意此时server要在读完temp file后unlink这个temp file。通常这个temp file的内容应该是“实际内容的长度(size_t的大小)+实际内
容”。