반응형
ftok(3)
#include <sys/types.h>
#include <sys/ipc.h>
key_t ftok(const char *pathname, int proj_id);
pathname(존재하고 접근가능한 파일 또는 디렉토리)과 proj_id값의 조합으로 System V IPC에서 사용할 key값을 생성하는 함수입니다. pathname과 proj_id값이 같으면 같은 key를 생성합니다. proj_id는 int type이지만 실제로는 하위 8bit만 사용됩니다.
이 함수의 결과값은 msgget(2), semget(2), shmget(2)에서 사용가능합니다.
파라미터
pathname
- 실제로 존재하고 access가능한 파일 또는 디렉토리
- 상대 path이든 절대 path이든 실제로 같은 디렉토리
또는 파일이면 pathname의 문자열이 달라도 같이 인식됨
예).
/usr/downman/data 와 ~/data가 실제 같은 디렉토리이면 같은 값임.
즉,
ftok("/usr/downman/data", 'S') == ftok("~/data", 'S')
proj_id
- 같은 path에 대해서 구분하기 위한 값으로 하위 8bit값만 사용됩니다.
- 0은 사용할 수 없으며, 하위 8bit만 사용되므로 'M', 'S' 등과 같이 문자를 사용할 수도 있습니다.
RETURN
0 이상
- 정상적으로 생성된 key값
-1
-오류가 발생하였으며, 상세한 오류는 errno에 저장됩니다.
stat(2)함수의 오류와 같은 오류가 발생할 수 있습니다.
EACCES : path를 구성하는 directory중에서 search 권한(x)이 없어서 접근할 수 없습니다.
EFAULT : path 변수 자체가 잘못된 주소입니다.
ELOOP : 너무 많은 symbolic link로 directory가 loop에 빠졌습니다.
ENAMETOOLONG : path가 너무 길거나 이름이 너무 깁니다.
ENOENT : path가 빈 문자열이거나 path를 구성하는 directory중에서 없는 directory가 있습니다.
ENOMEM : 메모리가 부족합니다.
ENOTDIR : path를 구성하는 directory중에서 directory가 아닌 것이 있습니다.
EOVERFLOW : 32bit OS에서 컴파일시에 -D_FILE_OFFSET_BITS=64 옵션없이 컴파일하여 파일크기나
inode번호가 64bit에 맞지 않은 경우
활용 예제
#include <stdio.h>
#include <sys/types.h>
#include <sys/ipc.h>
#include <stdlib.h>
......
int main(int argc, char **argv)
{
int shmid;
int mem_size;
key_t shm_key;
struct my_data_t *shm_data;
......
/* shared memory용 IPC key를 생성함 */
if((shm_key = ftok("~/mywork", 'H')) == -1) {
perror("shared memory key 생성 오류");
return 1;
}
mem_sie = sizeof(struct my_data_t) * 1000;
shmid = shmget((key_t)shm_key, mem_size, 0600 | IPC_CREAT);
if (shmid == -1) {
perror("shmget failed ");
return 1;
}
/* 생성된 shared memroy를 참조함 */
shm_data = shmat(shmid, (void *)0, 0);
if (shm_data == (void *)-1) {
perror("shmat failed ");
return 1;
}
......
return 0;
}
반응형