Unix 发送信号是否发送一位信息?

Unix 发送信号是否发送一位信息?,unix,signals,information-theory,Unix,Signals,Information Theory,对UNIX系统中实现的传统信号发送功能的描述有时会将“发送信号”与“发送一位信息”区分开来。这种区分准确吗 这种描述的例子 UNIX环境中的高级编程(W.Richard Stevens,Stephen a.Rago)提供了此类描述的一个示例,其中对sigqueue函数10.20的描述声称“通常一个信号携带一位信息:信号本身。” 为什么信号实际上携带0位信息 信号没有状态,因此其状态由0位信息描述。携带信息的仅仅是实际发生的传输 发送2位信息与连续发送2次1位信息相同,因此,如果一个信号将传输1位

对UNIX系统中实现的传统信号发送功能的描述有时会将“发送信号”与“发送一位信息”区分开来。这种区分准确吗

这种描述的例子 UNIX环境中的高级编程(W.Richard Stevens,Stephen a.Rago)提供了此类描述的一个示例,其中对sigqueue函数10.20的描述声称“通常一个信号携带一位信息:信号本身。”

为什么信号实际上携带0位信息 信号没有状态,因此其状态由0位信息描述。携带信息的仅仅是实际发生的传输

发送2位信息与连续发送2次1位信息相同,因此,如果一个信号将传输1位信息,我们可以通过发送两次相同的信号将2位信息发送到一个进程,这看起来是不可能的。

我不认为引用中的一点信息在信息论中就意味着一点信息

这是我的理解。对于某个信号,在某个时刻只有两种可能的状态:信号发生或不发生。这种二进制状态可以用一位0或1表示。通过向进程发送信号,该信息将被发送给进程

再一次,我认为你想得太多了,毕竟,这是一本关于编程的书,而不是信息论。

根据man 2 kill,kill函数以pid和int sig作为参数。使用kill,你可以通过int型信号发送信息,就这样

如果您看一下man 2 sigaction,它描述了您可以在信号处理程序中处理的信息结构:

siginfo_t {
               int      si_signo;    /* Signal number */
               int      si_errno;    /* An errno value */
               int      si_code;     /* Signal code */
               int      si_trapno;   /* Trap number that caused
                                        hardware-generated signal
                                        (unused on most architectures) */
               pid_t    si_pid;      /* Sending process ID */
               uid_t    si_uid;      /* Real user ID of sending process */
               int      si_status;   /* Exit value or signal */
               clock_t  si_utime;    /* User time consumed */
               clock_t  si_stime;    /* System time consumed */
               sigval_t si_value;    /* Signal value */
               int      si_int;      /* POSIX.1b signal */
               void    *si_ptr;      /* POSIX.1b signal */
               int      si_overrun;  /* Timer overrun count; POSIX.1b timers */
               int      si_timerid;  /* Timer ID; POSIX.1b timers */
               void    *si_addr;     /* Memory location which caused fault */
               long     si_band;     /* Band event (was int in
                                        glibc 2.3.2 and earlier) */
               int      si_fd;       /* File descriptor */
               short    si_addr_lsb; /* Least significant bit of address
                                        (since Linux 2.6.32) */
           }
这意味着您可以通过选择发送信号的用户ID和pid的位置来发送一些附加信息-您可以判断是否是您的孩子向您发送信号

至于从信号链中合成消息,理论上这是可能的,但您需要确保您的信号链不会被另一个进程随机中断您无法阻止某些信号,例如SIGKILL,但是,当您收到SIGKILL时,您就完成了,因此不再将消息链转换为ASCII或其他内容:

还有sigqueue,您可以使用它将整数附加到发送的信号中,正如我在下面关于Linux信号的非常好的文章中所了解的:


当然,“使之正确”的唯一方法是像你这样做,然而这是相当令人不满意的,因为当我们传输信息时,我们通常不会将交易本身考虑到“传输的信息”然而,为了在解释这些事情时找到更好的措辞,识别可能只是糟糕的措辞是有用的。