GLIBC源码——putchar
GLIBC源码——从我认为最简单的putchar
开始
putchar
放在putchar.c
中,而putchar.c
放在libio
文件夹里
加上注释,一共只有36
行
#include "libioP.h"
#include "stdio.h"
#undef putchar
int
putchar (int c)
{
int result;
_IO_acquire_lock (stdout);
result = _IO_putc_unlocked (c, stdout);
_IO_release_lock (stdout);
return result;
}
#if defined weak_alias && !defined _IO_MTSAFE_IO
#undef putchar_unlocked
weak_alias (putchar, putchar_unlocked)
#endif
首先是putchar
的定义,然后是一个编译宏:如果定义了weak_alias
并且没有定义_IO_MTSFAE_IO
,即线程安全的IO,则,putchar_unlocked
就和putchar
没有区别
我理解为,当没有定义线程安全的IO后,putchar所使用的锁就失效了,所以和putchar_unlocked
功能上就一样了
所有带有_unlocked
后缀的函数都没有对自己的锁,因此不是线程安全的
putchar
的流程大致如下:申请锁,把真正的工作交给_IO_putc_unlocked
函数,释放锁
其中,和IO锁有关的函数在libio/libioP.h
里面定义
打开这个文件,查找对应的定义:
static inline void
__attribute__ ((__always_inline__))
_IO_acquire_lock_fct (FILE **p)
{
FILE *fp = *p;
if ((fp->_flags & _IO_USER_LOCK) == 0)
_IO_funlockfile (fp);
}
#if !defined _IO_MTSAFE_IO && IS_IN (libc)
# define _IO_acquire_lock(_fp) \