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。server
另外,temporary file提供了client-pipe-server之间传输大数据的一种方法。为了保证写操做的原子性,对named pipe(如下简称FIFO)的写操进程
做的字节数,必需要小于PIPE_BUF这个宏定义的数量;因此,若是client要给server传输大数据的话,就不可避免的出现了数据拆分的状况,而ip
server中处理包的线程有多个,因而就有可能出现不肯定的行为,除非给各个线程间加上通讯和同步,这样就把问题复杂化了。若是咱们利用temp 同步
file的话,那么client就只须要告诉server说“我给你传的此次数据比较大,在/tmp/xxxx”中,因而server就能够利用这个temp file来获取大段it
信息;注意此时server要在读完temp file后unlink这个temp file。一般这个temp file的内容应该是“实际内容的长度(size_t的大小)+实际内pip
容”。