GNU Make挂起管道写

时间:2017-11-22 23:49:19

标签: linux makefile pipe gnu-make

偶尔GNU Make会挂起,永远。该环境是一个64逻辑核心x86-64 Ubuntu 16.04 Linux 4.4机器。 (它也发生在以前的Linux版本中。)

makefile正在使用-j65 -l69。没有规则使用+ jobserver继承。

MAKEFLAGS += -j$(shell expr $$(nproc) + 1) -l$(shell expr $$(nproc) + 5)

这个过程是

$ ps aux | grep make
myuser  100694  0.0  0.0  86268 80016 ?        S    15:14   0:28 make

此过程在将"+"写入管道时挂起。

$ strace -s 99 -ffp 100694
strace: Process 100694 attached
write(4, "+", 1
$ sudo cat /proc/100694/stack
[<ffffffff81216080>] pipe_wait+0x70/0xc0
[<ffffffff81216207>] pipe_write+0xc7/0x420
[<ffffffff8120d0bb>] new_sync_write+0x9b/0xe0
[<ffffffff8120d126>] __vfs_write+0x26/0x40
[<ffffffff8120daa9>] vfs_write+0xa9/0x1a0
[<ffffffff8120e765>] SyS_write+0x55/0xc0
[<ffffffff81816d72>] entry_SYSCALL_64_fastpath+0x16/0x71
[<ffffffffffffffff>] 0xffffffffffffffff

我认为这种行为是GNU Make的jobserver,表明有可用容量。

正如预期的那样,该过程可以打开读写管道。

$ ls /proc/100694/fd
0  1  10  11  12  13  14  15  2  3  4  6  7  8  9
$ stat /proc/100694/fd/4
File: '/proc/100694/fd/4' -> 'pipe:[1617033]'
$ lsof | grep 1617033
make      100694           myuser    3r     FIFO               0,10      0t0    1617033 pipe
make      100694           myuser    4w     FIFO               0,10      0t0    1617033 pipe
  1. 根据我的理解,对于要写入的管道写入,管道必须达到其4048字节容量。正确的吗?
  2. 我可以看到这个管道的大小或内容吗?
  3. 我可以使用任何工具来调试这种情况吗?

0 个答案:

没有答案