semget(2) System Calls Manual semget(2) semget - System V (libc -lc) #include int semget(key_t key, int nsems, int semflg); semget() System V key. ( semflg key IPC_PRIVATE) . nsems key IPC_PRIVATE key IPC_CREAT semflg. semflg IPC_CREAT IPC_EXCL key semget() errno EEXIST. ( O_CREAT | O_EXCL open(2).) 9 semflg ( ) . mode open(2) ( ). semget() semid_ds ( semctl(2)) : o sem_perm.cuid sem_perm.uid . o sem_perm.cgid sem_perm.gid . o 9 sem_perm.mode 9 semflg. o sem_nsems nsems. o sem_otime 0. o sem_ctime . nsems 0 ( ) . nsems 0 (SEMMSL). . semget() ( ). -1 errno . EACCES key CAP_IPC_OWNER IPC . EEXIST IPC_CREAT IPC_EXCL semflg key. EINVAL nsems 0 (SEMMSL). EINVAL key nsems . ENOENT key semflg IPC_CREAT. ENOMEM . ENOSPC (SEMMNI) (SEMMNS). POSIX.1-2024. SVr4, POSIX.1-2001. IPC_PRIVATE key_t. key 9 semflg ( ). . (POSIX.1-2001 POSIX.1-2008 POSIX.1-2008 0.) Linux 0 : . semctl(2) SETVAL SETALL. sem_otime semctl(2) IPC_STAT . semget(): SEMMNI . Linux 3.19 128. Linux 3.19 32,000. Linux /proc/sys/kernel/sem. SEMMSL . 3.19 250. 3.19 32,000. /proc/sys/kernel/sem. SEMMNS : ( /proc/sys/kernel/sem). SEMMSL SEMMNI. IPC_PRIVATE IPC_NEW . semget() . key semget() ftok(3). pathname proj_id ftok(3). nsems semget(). IPC_CREAT (-c) IPC_EXCL (-x) semget(). . ftok(3) ipcs(1): $ touch mykey mykey2; $ ./t_semget -c mykey p 1; ID = 9 $ ./t_semget -c mykey2 p 2; ID = 10 $ ipcs -s; ------ Semaphore Arrays -------- key semid owner perms nsems 0x7004136d 9 mtk 600 1 0x70041368 10 mtk 600 2 semctl(2) key ( ftok(3)) : $ ./t_semget -c mykey p 1; ID = 9 ftok(3) pathname inode: $ ln mykey link; $ ls -i1 link mykey; 2233197 link 2233197 mykey $ ./t_semget link p 1; # Generates same key as 'mykey' ID = 9 /* t_semget.c Licensed under GNU General Public License v2 or later. */ #include #include #include #include #include static void usage(const char *pname) { fprintf(stderr, "Usage: %s [-cx] pathname proj-id num-sems\n", pname); fprintf(stderr, " -c Use IPC_CREAT flag\n"); fprintf(stderr, " -x Use IPC_EXCL flag\n"); exit(EXIT_FAILURE); } int main(int argc, char *argv[]) { int semid, nsems, flags, opt; key_t key; flags = 0; while ((opt = getopt(argc, argv, "cx")) != -1) { switch (opt) { case 'c': flags |= IPC_CREAT; break; case 'x': flags |= IPC_EXCL; break; default: usage(argv[0]); } } if (argc != optind + 3) usage(argv[0]); key = ftok(argv[optind], argv[optind + 1][0]); if (key == -1) { perror("ftok"); exit(EXIT_FAILURE); } nsems = atoi(argv[optind + 2]); semid = semget(key, nsems, flags | 0600); if (semid == -1) { perror("semget"); exit(EXIT_FAILURE); } printf("ID = %d\n", semid); exit(EXIT_SUCCESS); } semctl(2), semop(2), ftok(3), capabilities(7), sem_overview(7), sysvipc(7) 3 . . : . 6.18 8 2026 semget(2)