mirror of https://github.com/mkerrisk/man-pages
kcmp.2: Add an example program
Signed-off-by: Michael Kerrisk <mtk.manpages@gmail.com>
This commit is contained in:
parent
79bdcc4a5c
commit
2e4eff1b1d
108
man2/kcmp.2
108
man2/kcmp.2
|
@ -1,5 +1,5 @@
|
||||||
.\" Copyright (C) 2012, Cyrill Gorcunov <gorcunov@openvz.org>
|
.\" Copyright (C) 2012, Cyrill Gorcunov <gorcunov@openvz.org>
|
||||||
.\" and Copyright (C) 2012, Michael Kerrisk <mtk.manpages@gmail.com>
|
.\" and Copyright (C) 2012, 2016, 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
|
||||||
|
@ -239,6 +239,112 @@ See
|
||||||
.BR clone (2)
|
.BR clone (2)
|
||||||
for some background information on the shared resources
|
for some background information on the shared resources
|
||||||
referred to on this page.
|
referred to on this page.
|
||||||
|
.SH EXAMPLE
|
||||||
|
The program below uses
|
||||||
|
.BR kcmp ()
|
||||||
|
to test whether pairs of file descriptors refer to
|
||||||
|
the same open file description.
|
||||||
|
The program tests different cases for the file descriptor pairs,
|
||||||
|
as described in the program output.
|
||||||
|
An example run of the program is as follows:
|
||||||
|
|
||||||
|
.nf
|
||||||
|
.in +4n
|
||||||
|
$ \fB./a.out\fP
|
||||||
|
Parent PID is 1144
|
||||||
|
Parent opened file on FD 3
|
||||||
|
|
||||||
|
PID of child of fork() is 1145
|
||||||
|
Compare duplicate FDs from different processes:
|
||||||
|
kcmp(1145, 1144, KCMP_FILE, 3, 3) ==> same
|
||||||
|
Child opened file on FD 4
|
||||||
|
Compare FDs from distinct open()s in same process:
|
||||||
|
kcmp(1145, 1145, KCMP_FILE, 3, 4) ==> different
|
||||||
|
Child duplicated FD 3 to create FD 5
|
||||||
|
Compare duplicated FDs in same process:
|
||||||
|
kcmp(1145, 1145, KCMP_FILE, 3, 5) ==> same
|
||||||
|
.in
|
||||||
|
.fi
|
||||||
|
.SS Program source
|
||||||
|
\&
|
||||||
|
.nf
|
||||||
|
#define _GNU_SOURCE
|
||||||
|
#include <sys/syscall.h>
|
||||||
|
#include <sys/wait.h>
|
||||||
|
#include <sys/stat.h>
|
||||||
|
#include <stdlib.h>
|
||||||
|
#include <stdio.h>
|
||||||
|
#include <unistd.h>
|
||||||
|
#include <fcntl.h>
|
||||||
|
#include <linux/kcmp.h>
|
||||||
|
|
||||||
|
#define errExit(msg) do { perror(msg); exit(EXIT_FAILURE); \\
|
||||||
|
} while (0)
|
||||||
|
|
||||||
|
static int
|
||||||
|
kcmp(pid_t pid1, pid_t pid2, int type,
|
||||||
|
unsigned long idx1, unsigned long idx2)
|
||||||
|
{
|
||||||
|
return syscall(SYS_kcmp, pid1, pid2, type, idx1, idx2);
|
||||||
|
}
|
||||||
|
|
||||||
|
static void
|
||||||
|
test_kcmp(char *msg, id_t pid1, pid_t pid2, int fd_a, int fd_b)
|
||||||
|
{
|
||||||
|
printf("\\t%s\\n", msg);
|
||||||
|
printf("\\t\\tkcmp(%ld, %ld, KCMP_FILE, %d, %d) ==> %s\\n",
|
||||||
|
(long) pid1, (long) pid2, fd_a, fd_b,
|
||||||
|
(kcmp(pid1, pid2, KCMP_FILE, fd_a, fd_b) == 0) ?
|
||||||
|
"same" : "different");
|
||||||
|
}
|
||||||
|
|
||||||
|
int
|
||||||
|
main(int argc, char *argv[])
|
||||||
|
{
|
||||||
|
int fd1, fd2, fd3;
|
||||||
|
char pathname[] = "/tmp/kcmp.test";
|
||||||
|
|
||||||
|
fd1 = open(pathname, O_CREAT | O_RDWR, S_IRUSR | S_IWUSR);
|
||||||
|
if (fd1 == \-1)
|
||||||
|
errExit("open");
|
||||||
|
|
||||||
|
printf("Parent PID is %ld\\n", (long) getpid());
|
||||||
|
printf("Parent opened file on FD %d\\n\\n", fd1);
|
||||||
|
|
||||||
|
switch (fork()) {
|
||||||
|
case \-1:
|
||||||
|
errExit("fork");
|
||||||
|
|
||||||
|
case 0:
|
||||||
|
printf("PID of child of fork() is %ld\\n", (long) getpid());
|
||||||
|
|
||||||
|
test_kcmp("Compare duplicate FDs from different processes:",
|
||||||
|
getpid(), getppid(), fd1, fd1);
|
||||||
|
|
||||||
|
fd2 = open(pathname, O_CREAT | O_RDWR, S_IRUSR | S_IWUSR);
|
||||||
|
if (fd2 == \-1)
|
||||||
|
errExit("open");
|
||||||
|
printf("Child opened file on FD %d\\n", fd2);
|
||||||
|
|
||||||
|
test_kcmp("Compare FDs from distinct open()s in same process:",
|
||||||
|
getpid(), getpid(), fd1, fd2);
|
||||||
|
|
||||||
|
fd3 = dup(fd1);
|
||||||
|
if (fd3 == \-1)
|
||||||
|
errExit("dup");
|
||||||
|
printf("Child duplicated FD %d to create FD %d\\n", fd1, fd3);
|
||||||
|
|
||||||
|
test_kcmp("Compare duplicated FDs in same process:",
|
||||||
|
getpid(), getpid(), fd1, fd3);
|
||||||
|
break;
|
||||||
|
|
||||||
|
default:
|
||||||
|
wait(NULL);
|
||||||
|
}
|
||||||
|
|
||||||
|
exit(EXIT_SUCCESS);
|
||||||
|
}
|
||||||
|
.fi
|
||||||
.SH SEE ALSO
|
.SH SEE ALSO
|
||||||
.BR clone (2),
|
.BR clone (2),
|
||||||
.BR unshare (2)
|
.BR unshare (2)
|
||||||
|
|
Loading…
Reference in New Issue