커널 API
글 수 18
2007.08.30 11:32:03 (*.105.125.81)
28665
설명
dev 로 지정하는 주번호와 부번호를 이용하여 mode 에 지정하는 디바이스 파일 종류와 접근 허가 속성을 가진 pathname 의 디바이스 파일을 만든다.
접근 허가 속성은 프로세스의 umask 와 AND 연산 ( mode & ~umask ) 의 결과값이 최종 생성되는 디바이스 파일의 접근 허가 속성이 된다.
| 이름 | mknod - 저수준 함수 | |||||||||||||||||||||||||
| 분류 | 저수준 파일 함수 | |||||||||||||||||||||||||
| 타입 | 함수 | |||||||||||||||||||||||||
| 커널 | - | |||||||||||||||||||||||||
| GPL | - | |||||||||||||||||||||||||
| 헤더 | #include <sys/types.h> #include <sys/stat.h> #include <fcntl.h> #include <unistd.h> |
|||||||||||||||||||||||||
| 형태 | int mknod(const char *pathname, mode_t mode, dev_t dev); | |||||||||||||||||||||||||
| 인수 |
|
|||||||||||||||||||||||||
| 반환 |
|
|||||||||||||||||||||||||
| 에러 |
|
|||||||||||||||||||||||||
| 연관 | mknod 유틸, dev_t, MAJOR, MINOR, MKDEV | |||||||||||||||||||||||||
| 주의 | 이 함수를 동작 시키는 프로그램은 root 권한을 가지고 있어야 한다. | |||||||||||||||||||||||||
| 버그 | - | |||||||||||||||||||||||||
| 작성 | 유영창 | |||||||||||||||||||||||||
예제
// 이 함수는 chk_driver_name 이 지정하는 디바이스 드라이버의 주번호를 획득하고
// make_minor가 지정하는 부번호와 조합하여 임시적인 디바이스 파일을 만들고
// 해당 디바이스 파일을 연다. 이때 unlink 함수를 사용하여 프로세스가 종료되면
// 자동으로 파일이 삭제되도록 한다.
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <sys/types.h>
#include <sys/stat.h>
#include <fcntl.h>
#include <unistd.h>
int device_open( char *chk_driver_name, int make_minor )
{
FILE *fp;
int dev_fd;
char linebuff[128];
char tmp_driver_name[32];
int major;
dev_fd = -1;
fp = fopen("/proc/devices", "r");
if(fp == NULL) return -1;
while(1)
{
if( fgets(linebuff, sizeof( linebuff) , fp ) == NULL ) break;
if( sscanf(linebuff, "%d %s", &major, tmp_driver_name) == 2 )
{
if (strcmp( tmp_driver_name, chk_driver_name ) == 0)
{
fclose( fp );
sprintf( linebuff, "%s%s-%d", "./",
chk_driver_name,
getpid() );
mknod(linebuff, (S_IRWXU¦S_IRWXG¦S_IFCHR), MKDEV(major,make_minor) );
dev_fd = open(linebuff, O_RDWR );
if( dev_fd < 0 ) return dev_fd;
unlink(linebuff);
return dev_fd;
}
}
}
fclose( fp );
return dev_fd;
}

