Signed-off-by: Christian Brauner <christian@xxxxxxxxxx> --- man2/procfd_signal.2 | 208 +++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 208 insertions(+) create mode 100644 man2/procfd_signal.2 diff --git a/man2/procfd_signal.2 b/man2/procfd_signal.2 new file mode 100644 index 000000000..889bb426f --- /dev/null +++ b/man2/procfd_signal.2 @@ -0,0 +1,208 @@ +.\" Copyright (C) 2018 Christian Brauner <christian@xxxxxxxxxx> +.\" +.\" %%%LICENSE_START(VERBATIM) +.\" Permission is granted to make and distribute verbatim copies of this +.\" manual provided the copyright notice and this permission notice are +.\" preserved on all copies. +.\" +.\" Permission is granted to copy and distribute modified versions of this +.\" manual under the conditions for verbatim copying, provided that the +.\" entire resulting derived work is distributed under the terms of a +.\" permission notice identical to this one. +.\" +.\" Since the Linux kernel and libraries are constantly changing, this +.\" manual page may be incorrect or out-of-date. The author(s) assume no +.\" responsibility for errors or omissions, or for damages resulting from +.\" the use of the information contained herein. The author(s) may not +.\" have taken the same level of care in the production of this manual, +.\" which is licensed free of charge, as they might when working +.\" professionally. +.\" +.\" Formatted or processed versions of this manual, if unaccompanied by +.\" the source, must acknowledge the copyright and authors of this work. +.\" %%%LICENSE_END +.\" +.TH PROCFD_SIGNAL 2 2017-09-15 "Linux" "Linux Programmer's Manual" +.SH NAME +procfd_signal \- send signal to a process through a process descriptor +.SH SYNOPSIS +.nf +.B #include <sys/types.h> +.B #include <signal.h> +.PP +.BI "int procfd_signal(int " fd ", int " sig ", siginfo_t *" info ", int " flags ); +.fi +.SH DESCRIPTION +.BR procfd_signal () +sends the signal specified in +.I sig +to the process identified by the file descriptor +.IR fd . +The permissions required to send a signal are the same as for +.BR kill (2). +As with +.BR kill (2), +the null signal (0) can be used to check if a process with a given +PID exists. +.PP +The optional +.I info +argument specifies the data to accompany the signal. +This argument is a pointer to a structure of type +.IR siginfo_t , +described in +.BR sigaction (2) +(and defined by including +.IR <sigaction.h> ). +The caller should set the following fields in this structure: +.TP +.I si_code +This must be one of the +.B SI_* +codes in the Linux kernel source file +.IR include/asm-generic/siginfo.h , +with the restriction that the code must be negative +(i.e., cannot be +.BR SI_USER , +which is used by the kernel to indicate a signal sent by +.BR kill (2)) +and cannot (since Linux 2.6.39) be +.BR SI_TKILL +(which is used by the kernel to indicate a signal sent using +.\" tkill(2) or +.BR tgkill (2)). +.TP +.I si_pid +This should be set to a process ID, +typically the process ID of the sender. +.TP +.I si_uid +This should be set to a user ID, +typically the real user ID of the sender. +.TP +.I si_value +This field contains the user data to accompany the signal. +For more information, see the description of the last +.RI ( "union sigval" ) +argument of +.BR sigqueue (3). +.PP +Internally, the kernel sets the +.I si_signo +field to the value specified in +.IR sig , +so that the receiver of the signal can also obtain +the signal number via that field. +.PP +The +.I flags +argument is reserved for future extension and must be set to 0. +.PP +.SH RETURN VALUE +On success, this system call returns 0. +On error, it returns \-1 and +.I errno +is set to indicate the error. +.SH ERRORS +.TP +.B EBADF +.I fd +is not a valid file descriptor. +.TP +.B EINVAL +An invalid signal was specified. +.TP +.B EINVAL +.I fd +does not refer to a process. +.TP +.B EINVAL +The flags argument was not 0. +.TP +.B EINVAL +The calling process and the target process are neither located +in the same pid namespace nor is the calling process's +pid namespace an ancestor of the target process's pid namespaces +(see +.BR pid_namespaces (7)). +.TP +.B EPERM +The caller does not have permission to send the signal to the target. +For the required permissions, see +.BR kill (2). +Or: +.I uinfo->si_code +is invalid. +.TP +.B ESRCH +The process or process group does not exist. +Note that an existing process might be a zombie, +a process that has terminated execution, but +has not yet been +.BR wait (2)ed +for. +.SH CONFORMING TO +This system call is Linux-specific. +.SH NOTES +The +.BR procfd_signal () +system call will only send signals to processes which either are in +the same pid namespace or are in a descendant pid namespace of +the caller. +.SH EXAMPLE +The following program demonstrates how to kill a process with +.BR procfd_signal () +.SS Program source +.EX +#define _GNU_SOURCE +#include <errno.h> +#include <fcntl.h> +#include <stdio.h> +#include <stdlib.h> +#include <string.h> +#include <signal.h> +#include <sys/stat.h> +#include <sys/syscall.h> +#include <sys/types.h> +#include <unistd.h> + +int +main(int argc, char *argv[]) +{ + int ret; + char buf[1000]; + + if (argc < 2) + exit(EXIT_FAILURE); + + ret = snprintf(buf, sizeof(buf), "/proc/%s", argv[1]); + if (ret < 0) + exit(EXIT_FAILURE); + + int fd = open(buf, O_DIRECTORY | O_CLOEXEC); + if (fd < 0) { + printf("%s - Failed to open \\"%s\\"\\n", strerror(errno), buf); + exit(EXIT_FAILURE); + } + + ret = procfd_signal(fd, SIGKILL, NULL, 0); + if (ret < 0) { + printf("Failed to send SIGKILL \\"%s\\"\\n", strerror(errno)); + close(fd); + exit(EXIT_FAILURE); + } + + close(fd); + + exit(EXIT_SUCCESS); +} +.EE +.SH SEE ALSO +.BR kill (2), +.BR sigaction (2), +.BR sigprocmask (2), +.BR tgkill (2), +.BR pthread_sigqueue (3), +.BR rt_sigqueueinfo (2), +.BR sigqueue (3), +.BR signal (7) -- 2.19.1