변칙적인 갯수의 인수를 사용하는 함수에 관한 질문입니다.

coco의 이미지

어제 그리고 오늘 날씨가 너무 화창해서 사무실에 앉아 있으니깐
졸렵네요.

책을 보다가 잘 이해가 안되서 이렇게 여러분들에게 문의를 드립니다.
제가 궁금한 것은 위의 제목처럼 변칙적인 갯수의 인수를 사용하는 함수에
관련된 부분입니다.

이러한 함수를 사용하기 위해서는 1) stdarg.h가 포함되어야 하고
2) 반드시 va_list형을 선언하고, 3) va_start(), va_end(), va_arg() 함수를
사용하여 함수의 원형에서 정의되지 않은 매개변수를 받아 들이는 것으로
알고 있습니다.

예를 들어 아래의 코드는 sem_open함수의 wrapper 함수입니다.

Sem_open(const char *pathname, int oflag, ...)
{
	sem_t	*sem;
	va_list	ap;
	mode_t	mode;
	unsigned int	value;

	if (oflag & O_CREAT) {
		va_start(ap, oflag);		/* init ap to final named argument */
		mode = va_arg(ap, va_mode_t);
		value = va_arg(ap, unsigned int);
		if ( (sem = sem_open(pathname, oflag, mode, value)) == SEM_FAILED)
			err_sys("sem_open error for %s", pathname);
		va_end(ap);
	} else {
		if ( (sem = sem_open(pathname, oflag)) == SEM_FAILED)
			err_sys("sem_open error for %s", pathname);
	}
	return(sem);
}

위의 코드에서 보면 원래 sem_open함수는 2개의 파라미터값만을 정확히 명시하고 있고, 위의 코드는 3번째와 4번째를 파라미터로 더 받아 들이고 있는데요,
제가 궁금한것은 3번째 인수와 4번째 인수가 sem_open에서 하는 역활이 무엇인지 궁금합니다.

많은 가르침 부탁 드립니다.