mirror of https://github.com/mkerrisk/man-pages
semget.2: EXAMPLE: add an example program
Signed-off-by: Michael Kerrisk <mtk.manpages@gmail.com>
This commit is contained in:
parent
c436f71fa0
commit
90f986d35f
142
man2/semget.2
142
man2/semget.2
|
@ -1,4 +1,5 @@
|
||||||
.\" Copyright 1993 Giorgio Ciucci (giorgio@crcc.it)
|
.\" Copyright 1993 Giorgio Ciucci (giorgio@crcc.it)
|
||||||
|
.\" and Copyright (C) 2020 Michael Kerrisk <mtk.manpages@gmail.com>
|
||||||
.\"
|
.\"
|
||||||
.\" %%%LICENSE_START(VERBATIM)
|
.\" %%%LICENSE_START(VERBATIM)
|
||||||
.\" Permission is granted to make and distribute verbatim copies of this
|
.\" Permission is granted to make and distribute verbatim copies of this
|
||||||
|
@ -312,6 +313,147 @@ The name choice
|
||||||
was perhaps unfortunate,
|
was perhaps unfortunate,
|
||||||
.B IPC_NEW
|
.B IPC_NEW
|
||||||
would more clearly show its function.
|
would more clearly show its function.
|
||||||
|
.SH EXAMPLE
|
||||||
|
The program shown below uses
|
||||||
|
.BR semget ()
|
||||||
|
to create a new semaphore set or retrieve the ID of an existing set.
|
||||||
|
It generates the
|
||||||
|
.I key
|
||||||
|
for
|
||||||
|
.BR semget ()
|
||||||
|
using
|
||||||
|
.BR ftok (3).
|
||||||
|
The first two command-line arguments are used as the
|
||||||
|
.I pathname
|
||||||
|
and
|
||||||
|
.I proj_id
|
||||||
|
arguments for
|
||||||
|
.BR ftok (3).
|
||||||
|
The third command-line argument is an integer that specifies the
|
||||||
|
.I nsems
|
||||||
|
argument for
|
||||||
|
.BR semget ().
|
||||||
|
Command-line options can be used to specify the
|
||||||
|
.BR IPC_CREAT
|
||||||
|
.RI ( \-c )
|
||||||
|
and
|
||||||
|
.BR IPC_EXCL
|
||||||
|
.RI ( \-x )
|
||||||
|
flags for the call to
|
||||||
|
.BR semget ().
|
||||||
|
The usage of this program is demonstrated below.
|
||||||
|
.PP
|
||||||
|
We first create two files that will be used to generate keys using
|
||||||
|
.BR ftok (3),
|
||||||
|
create two semaphore sets using those files, and then list the sets using
|
||||||
|
.BR ipcs (1):
|
||||||
|
.PP
|
||||||
|
.in +4n
|
||||||
|
.EX
|
||||||
|
$ \fBtouch mykey mykey2\fP
|
||||||
|
$ \fB./t_semget \-c mykey p 1\fP
|
||||||
|
ID = 9
|
||||||
|
$ \fB./t_semget \-c mykey2 p 2\fP
|
||||||
|
ID = 10
|
||||||
|
$ \fBipcs \-s\fP
|
||||||
|
|
||||||
|
\-\-\-\-\-\- Semaphore Arrays \-\-\-\-\-\-\-\-
|
||||||
|
key semid owner perms nsems
|
||||||
|
0x7004136d 9 mtk 600 1
|
||||||
|
0x70041368 10 mtk 600 2
|
||||||
|
.EE
|
||||||
|
.in
|
||||||
|
.PP
|
||||||
|
Next, we demonstrate that when
|
||||||
|
.BR semctl ()
|
||||||
|
is given the same
|
||||||
|
.I key
|
||||||
|
(as generated by the same arguments to
|
||||||
|
.BR ftok (3)),
|
||||||
|
it returns the ID of the already existing semaphore set:
|
||||||
|
.PP
|
||||||
|
.in +4n
|
||||||
|
.EX
|
||||||
|
$ \fB./t_semget \-c mykey p 1\fP
|
||||||
|
ID = 9
|
||||||
|
.EE
|
||||||
|
.in
|
||||||
|
.PP
|
||||||
|
Finally, we demonstrate the kind of collision that can occur when
|
||||||
|
.BR ftok (3)
|
||||||
|
is given different
|
||||||
|
.I pathname
|
||||||
|
arguments that have the same inode number:
|
||||||
|
.PP
|
||||||
|
.in +4n
|
||||||
|
.EX
|
||||||
|
$ \fBln mykey link\fP
|
||||||
|
$ \fBls \-i1 link mykey\fP
|
||||||
|
2233197 link
|
||||||
|
2233197 mykey
|
||||||
|
$ \fB./t_semget link p 1\fP # Generates same key as \(aqmykey\(aq
|
||||||
|
ID = 9
|
||||||
|
.EE
|
||||||
|
.in
|
||||||
|
.PP
|
||||||
|
.SS Program source
|
||||||
|
\&
|
||||||
|
.nf
|
||||||
|
#include <sys/types.h>
|
||||||
|
#include <sys/ipc.h>
|
||||||
|
#include <sys/sem.h>
|
||||||
|
#include <sys/stat.h>
|
||||||
|
#include <stdio.h>
|
||||||
|
#include <stdlib.h>
|
||||||
|
#include <unistd.h>
|
||||||
|
|
||||||
|
static void
|
||||||
|
usage(const char *pname)
|
||||||
|
{
|
||||||
|
fprintf(stderr, "Usage: %s [\-cx] pathname proj\-id num\-sems\en",
|
||||||
|
pname);
|
||||||
|
fprintf(stderr, " \-c Use IPC_CREAT flag\en");
|
||||||
|
fprintf(stderr, " \-x Use IPC_EXCL flag\en");
|
||||||
|
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 \(aqc\(aq: flags |= IPC_CREAT; break;
|
||||||
|
case \(aqx\(aq: 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\en", semid);
|
||||||
|
|
||||||
|
exit(EXIT_SUCCESS);
|
||||||
|
}
|
||||||
|
.fi
|
||||||
.SH SEE ALSO
|
.SH SEE ALSO
|
||||||
.BR semctl (2),
|
.BR semctl (2),
|
||||||
.BR semop (2),
|
.BR semop (2),
|
||||||
|
|
Loading…
Reference in New Issue