본문 바로가기

Core BSP 분석/리눅스 커널 핵심 분석

[리눅스커널] ssize_t와 size_t의 실체

ssize_t와 size_t 타입의 실체를 확인해보자.
 
아래 코드를 전처리 코드로 확인해볼까?
static ssize_t default_read_file(struct file *file, char __user *buf,
 size_t count, loff_t *ppos)
{
  return 0;
}
 
size_t 타입의 정체
 
먼저 size_t의 정체를 확인해보자.
 
 280 # 55 "/root/src/kernel_src/linux/include/linux/types.h"
  281 typedef __kernel_size_t size_t;
 
size_t 는 __kernel_size_t로 캐스팅 된다.  
 
 201 # 68 "/root/src/kernel_src/linux/include/uapi/asm-generic/posix_types.h"
  202 typedef unsigned int __kernel_size_t;
 
__kernel_size_t 타입은 'unsigned int'로 타입으로 캐스팅된다. 
 
정리하자.
size_t -> unsigned int
 
ssize_t 타입의 정체
 
이번에는 ssize_t 타입을 확인하자.
 280 # 55 "/root/src/rachman_kernel_src/linux/include/linux/types.h"
...
  282
  283
  284
  285
  286 typedef __kernel_ssize_t ssize_t;
 
ssize_t은 __kernel_ssize_t 타입으로 캐스팅된다.  
 
 201 # 68 "/root/src/rachman_kernel_src/linux/include/uapi/asm-generic/posix_types.h"
  202 typedef unsigned int __kernel_size_t;
  203 typedef int __kernel_ssize_t;
 
__kernel_ssize_t은  int 타입으로 캐스팅된다.
 
정리하면;
 ssize_t -> int
 
마무리 
 
이제 default_read_file() 함수를 볼 때, 
static ssize_t default_read_file(struct file *file, char *buf,
     size_t count, loff_t *ppos)
{
 return 0;
}
 
다음과 같이 해석해보자.
static int default_read_file(struct file *file, char *buf,
     unsigned int count, loff_t *ppos)
{
 return 0;
}