16位状态字perlvar

Que*_*ger 0 perl 16-bit perlvar

当我遇到这个时,我正在读perlvar -

最后一个管道关闭,反引号(``)命令,成功调用wait()或waitpid()或来自system()操作符返回的状态.这只是传统Unix wait()系统调用返回的16位状态字(或者看起来像是这样).因此,子进程的退出值实际上是($?>> 8),而$?&127给出了哪个信号

什么是16位状态字?操作'$?>> 8'表示什么?在我做'$?>> 8'之后,像'512'这样的16位字如何被转换为'2'?

ike*_*ami 5

16位字仅仅是16位大小的存储量."word"一词意味着CPU可以通过一条指令从内存中读取它.(例如,我在一台具有64K字节内存的机器上工作,但CPU只能以32K 16位字的形式访问它.)

解释为无符号整数,16位字看起来像0到2 16 -1 = 65,535 之间的数字,但它不一定是无符号整数.在这种情况下$?,它用于存储三个无符号整数.

+---+---+---+---+---+---+---+---+---+---+---+---+---+---+---+---+
| 15| 14| 13| 12| 11| 10|  9|  8|  7|  6|  5|  4|  3|  2|  1|  0|
+---+---+---+---+---+---+---+---+---+---+---+---+---+---+---+---+

 \-----------------------------/ \-/ \-------------------------/
            Exit code            core     Signal that killed
            (0..255)            dumped         (0..127)
                                (0..1)
Run Code Online (Sandbox Code Playgroud)

如果操作系统想要返回"退出错误代码2",它会设置$?到(2 << 8) | (0 << 7) | (0 << 0).

                           +---+---+---+---+---+---+---+---+
                           |                             2 | << 8
                           +---+---+---+---+---+---+---+---+
                                                       +---+
                                                       | 0 | << 7
                                                       +---+
                               +---+---+---+---+---+---+---+
                               |                         0 | << 0
                               +---+---+---+---+---+---+---+

=================================================================

+---+---+---+---+---+---+---+---+
|                             2 |
+---+---+---+---+---+---+---+---+
                                +---+
                                | 0 |
                                +---+
                                    +---+---+---+---+---+---+---+
                                    |                         0 |
                                    +---+---+---+---+---+---+---+

=================================================================

+---+---+---+---+---+---+---+---+---+---+---+---+---+---+---+---+
|                             2 | 0 |                         0 |
+---+---+---+---+---+---+---+---+---+---+---+---+---+---+---+---+
Run Code Online (Sandbox Code Playgroud)

如果操作系统想要返回"被信号5杀死;核心被丢弃",它会设置$?到(0 << 8) | (1 << 7) | (5 << 0).

                           +---+---+---+---+---+---+---+---+
                           |                             0 | << 8
                           +---+---+---+---+---+---+---+---+
                                                       +---+
                                                       | 1 | << 7
                                                       +---+
                               +---+---+---+---+---+---+---+
                               |                         5 | << 0
                               +---+---+---+---+---+---+---+

=================================================================

+---+---+---+---+---+---+---+---+
|                             0 |
+---+---+---+---+---+---+---+---+
                                +---+
                                | 1 |
                                +---+
                                    +---+---+---+---+---+---+---+
                                    |                         5 |
                                    +---+---+---+---+---+---+---+

=================================================================

+---+---+---+---+---+---+---+---+---+---+---+---+---+---+---+---+
|                             0 | 1 |                         5 |
+---+---+---+---+---+---+---+---+---+---+---+---+---+---+---+---+
Run Code Online (Sandbox Code Playgroud)

$? >> 8 只是做相反的操作.

+---+---+---+---+---+---+---+---+---+---+---+---+---+---+---+---+
|                             2 | 0 |                         0 |
+---+---+---+---+---+---+---+---+---+---+---+---+---+---+---+---+

                                                             >> 8

=================================================================

                                +---+---+---+---+---+---+---+---+
                                |                             2 |
                                +---+---+---+---+---+---+---+---+
Run Code Online (Sandbox Code Playgroud)

它返回存储在第8位和第8位的数字.