On Fri, Jun 21, 2019 at 16:31:32PM -0400, Rich Felker wrote: > On Tue, Jun 11, 2019 at 11:46:52AM +0800, 徐露 wrote: > > Hi all, > > > > I use Openwrt project and the version of musl-libc is 1.1.16. > > > > I call wordexp() in my programs and it runs well. But when I debug my programs with gdb, it is blocked on wordexp(). > > After some tests, I found that wordexp() call fork(), and after fork the child process is blocked. > > > > I write a demo and the source code is as follows. > > ``` > > #include > > #include > > int main() > > { > > pid_t pid; > > pid = fork(); > > if (!pid) { > > printf("== child process ==\n"); > > while (1) { > > printf("--child--\n"); > > sleep(1); > > } > > } > > printf("== parent process ==\n"); > > sleep(20); > > return 0; > > } > > ``` > > > > The debug log is as follows. > > ``` > > root@Linux:/# gdb /test > > GNU gdb (GDB) 8.2.1 > > Copyright (C) 2018 Free Software Foundation, Inc. > > License GPLv3+: GNU GPL version 3 or later > > This is free software: you are free to change and redistribute it. > > There is NO WARRANTY, to the extent permitted by law. > > Type "show copying" and "show warranty" for details. > > This GDB was configured as "arm-openwrt-linux". > > Type "show configuration" for configuration details. > > For bug reporting instructions, please see: > > . > > Find the GDB manual and other documentation resources online at: > > . > > For help, type "help". > > Type "apropos word" to search for commands related to "word"... > > Reading symbols from /test...done. > > (gdb) show follow-fork-mode > > Debugger response to a program call of fork or vfork is "parent". > > (gdb) show detach-on-fork > > Whether gdb will detach the child of a fork is on. > > (gdb) r > > Starting program: /test > > [Detaching after fork from child process 1697] > > == parent process == > > [Inferior 1 (process 1694) exited normally] > > (gdb) > > ``` > > When the parent process is sleeping, I get these processes information. > > ``` > > root@Linux:/# ps | grep test > > 1692 root 10916 S gdb /test > > 1694 root 680 S /test > > 1697 root 680 t /test > > 1706 root 1072 S grep test > > ``` > > > > I have set gdb "follow-fork-mode" to "child", the child process can run, but I want to debug the parent process. > > > > Besides, I have tried GDB 7.10.1 and musl-libc 1.1.22, the question still exists. > > I also have swithed the C library to Glibc, and there is no question. > > > > Could you please give us some pointers, thanks! I can supply more details as needed. > > Sorry I missed this when you first sent it! > > wordexp() reads back output from the child via a pipe, so the child > will stay blocked on writing to the pipe if it writes more than the > pipe buffer size without the parent reading anything back. You'll need > to let the parent advance past these reads before the child can exit. > > Does that help? Sorry. My description of the question is inaccurate. Forget about wordexp. Let's talk about the demo program. The source code is in the last mail. The question: The demo program runs well. If I debug the demo program(compile with musl) with gdb, even though the child process is created, but it can not run. When I debug the demo program(compile with glibc) with gdb, the child process runs well. Best regards ! xulu