- android - 多次调用 OnPrimaryClipChangedListener
- android - 无法更新 RecyclerView 中的 TextView 字段
- android.database.CursorIndexOutOfBoundsException : Index 0 requested, 光标大小为 0
- android - 使用 AppCompat 时,我们是否需要明确指定其 UI 组件(Spinner、EditText)颜色
我使用armv7进行openwrt开发,遇到了vfork导致的段错误。
我编写了一个包含以下部分的小型测试程序:
...
pid_t child_t;
if((child_t = vfork()) < 0)
{
printf("error!\n");
return -1;
}
else if(child_t == 0)
{
printf("in child:pid =%d\n",getpid());
sleep(2);
_exit(0);
}
else
{
printf("in parent:child_t id = %d,pid = %d\n",child_t,getpid());
}
...
vfork()函数总是导致段错误,这是gdb调试跟踪:
...
(gdb) c
Breakpoint 1, main (argc=1, argv=0xbefffed4) at handler.c:33
33 if((child_t = vfork()) < 0)
(gdb) stepi
0x00008474 in vfork () at libpthread/nptl/sysdeps/unix/sysv/linux/arm/../../../../../../../libc/sysdeps/linux/arm/vfo rk.S:71
71 SAVE_PID
(gdb) l
66
67 #else
68 __vfork:
69
70 #ifdef __NR_vfork
71 SAVE_PID
72 DO_CALL (vfork)
73 RESTORE_PID
74 cmn r0, #4096
75 IT(t, cc)
(gdb) b libpthread/nptl/sysdeps/unix/sysv/linux/arm/../../../../../../../libc/sysdeps/linux/arm/vfo rk.S:72
Breakpoint 2 at 0xb6fcf930: file libpthread/nptl/sysdeps/unix/sysv/linux/arm/../../../../../../../libc/sysdeps/linux/arm/vfo rk.S, line 72.
(gdb) disassemble
0x00008584 <+40>: bl 0x8444 <puts>
=> 0x00008588 <+44>: bl 0x8474 <vfork>
0x0000858c <+48>: str r0, [r11, #-12]
(gdb)stepi
...
(gdb) stepi
0x00008474 in vfork () at libpthread/nptl/sysdeps/unix/sysv/linux/arm/../../../../../../../libc/sysdeps/linux/arm/vfo rk.S:71
71 SAVE_PID
(gdb) disassemble
Dump of assembler code for function vfork:
=> 0x00008474 <+0>: add r12, pc, #0, 12
0x00008478 <+4>: add r12, r12, #8, 20 ; 0x8000
0x0000847c <+8>: ldr pc, [r12, #796]! ; 0x31c
(gdb) stepi
…
(gdb) disassemble
Dump of assembler code for function vfork:
0x00008474 <+0>: add r12, pc, #0, 12
0x00008478 <+4>: add r12, r12, #8, 20 ; 0x8000
=> 0x0000847c <+8>: ldr pc, [r12, #796]! ; 0x31c
(gdb)c
Continuing.
Program received signal SIGSEGV, Segmentation fault.
0xffff0fe0 in ?? ()
(gdb)
我还在 vfork.S 找到了 vfork 代码: __vfork:
#ifdef __NR_vfork
SAVE_PID
DO_CALL (vfork)
RESTORE_PID
cmn r0, #4096
IT(t, cc)
#if defined(__USE_BX__)
bxcc lr
#else
movcc pc, lr
#endif
/* Check if vfork even exists. */
ldr r1, =-ENOSYS
teq r0, r1
bne __error
#endif
/* If we don't have vfork, use fork. */
DO_CALL (fork)
cmn r0, #4096
/* Syscall worked. Return to child/parent */
IT(t, cc)
#if defined(__USE_BX__)
bxcc lr
#else
movcc pc, lr
#endif
__error:
b __syscall_error
#endif
更多信息 -当像这样绕过 vfork 时 -
VFORK_LOCK;
- if ((pid = vfork()) == 0) { /* Child of vfork... */
+ // if ((pid = vfork()) == 0) { /* Child of vfork... */
+ pid = syscall(__NR_fork, NULL);
+ if (pid == 0) { /* Child of vfork... */
一切似乎都运行良好。
感谢大家的帮助!
最佳答案
人(3)vfork
The vfork() function shall be equivalent to fork(), except that the behavior is undefined if the process created by vfork() either modifies any data other than a variable of type pid_t used to store the return value from vfork(), or returns from the function in which vfork() was called, or calls any other function before successfully calling _exit() or one of the exec family of functions.
因此,在子进程中,您可以调用 _exit
或 exec
。就是这样。
关于linux - uClibc vfork() 导致段错误,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24603406/
我有一台带有 uClibc 的机器,我已经设法使用我制作的简单包装器让 glibc 在它上面工作。 它可以编译像 hello world 这样的简单程序,以及几乎任何其他 c 程序。 但是,当它们包含
我正在尝试通过 bitbake 为 arm7a 架构构建 uclibc,但我得到以下输出 user@ubuntu:~/stuff$ bitbake -b uclibc ERROR: Unable to
ucLibc malloc 线程安全吗? 最佳答案 显然是的,如果定义了 __UCLIBC_HAS_THREADS__ malloc.h 包含并声明互斥锁 http://git.uclibc.org/
我有一个可以运行的 uclibc 工具链。我可以静态编译一个简单的hello.c程序(arm-linux-gcc hello.c -o hello -static -s),但源包会自动动态编译。如何将
我有一个项目要从 glibc 移植到 uclibc,但遇到了这个问题。 gcc --std=c++11 Foo.cpp -o Foo-glibc x86_64-linux-uclibc-gcc --s
我使用armv7进行openwrt开发,遇到了vfork导致的段错误。 我编写了一个包含以下部分的小型测试程序: ... pid_t child_t; if((child_t
uClibc/glibc 是否提供任何将错误重定向到系统日志的功能?像“无法解析符号”这样的错误需要转到系统日志而不是控制台上的标准错误。 最佳答案 如果它是守护进程,最好的选择是使用具有此功能的初始
我正在做一个项目,我想使用 uClibc 编译 valgrind。谁能建议我如何进行? 我正在使用 fedora 和 i386 平台。目标平台也是 i386,稍后将在 MIPS 上运行。 谢谢 最佳答
我正在使用一个在初始化期间创建工作线程的共享库。该应用程序与 uClibc 链接。当它从 main() 返回时,它会在 __pthread_cond_wait() 中崩溃或从工作线程中崩溃,因为共享库
是否可以让基于 glibc 和 uClibc 的应用程序在一个系统上并行运行? 背景:我们有基于 gcc 的二进制交叉编译器配置为与 uClibc 链接。我们已经用它交叉编译了 glibc。现在我们要
我已经在谷歌上搜索了很多次以在信号处理程序中找到 backtrace() 的正确解决方案并尝试了几乎所有方法,但我无法在我的信号处理程序中成功获得回溯 - 这不是 SIGUSR1 处理程序。 在 uc
这是一个重新发布,之前的帖子已关闭,移至 SERVERFAULT 并再次关闭。我认为此帖子是一个有效的 stackoverflow 问题,因为我认为它由某些自动制作/编译/链接错误引起。这是一个编程问
我有一个二进制文件,我需要它才能在使用 uclibc 的嵌入式系统上工作,该二进制文件是针对 glibc 编译的,应该可以吗? 当我尝试运行它时,我收到一条错误消息,指出二进制文件不存在,因此我检查了
我们在 ARM 9 上运行 uclibc linux。问题是 uclibc 不支持回溯。发生核心转储时,我无法获取调用堆栈。 有人对此有好的解决方案吗? 例如,现有的 uclibc backtrace
情况 - 我正在使用第三方堆栈。我有第三方的源代码。这段代码相当笨拙,并且有很多与缓冲区溢出相关的问题。 我的解决方案 - 为了追查这个问题,我覆盖了现有的函数,如 sprintf 和 memcpy,
我正在尝试构建自己的 uClibc 嵌入式系统。我遇到了一些问题,但是2天后,我解决了所有问题。只剩下一个:pthread 无法正常工作。这是一个简单的程序,来自 python 的配置脚本: #inc
我正在编写一个在 Linux(内核 3.0)上运行的用户空间音频应用程序,它需要实时行为。我应该选择 glibc 还是 uClibC? uClibC 和 glibc 在实时行为方面如何比较? (编辑:
我在嵌入式环境中工作。我有一个用于 ARM 架构的交叉编译器,它是 eglibc 作为主要库(即默认的 libc 与工具链一起出现)。现在我想要一些应用程序与 uClibc 链接。所以我用那个工具链编
我正在使用 buildroot 构建一个嵌入式系统,我想用 node.js 替换 nginx+php。 我的系统正在使用 eglibc,但我想减小系统的大小,所以我想切换到 uclibc。 node.
有没有人有在基于 uclibc 的系统上运行使用 boost 库的 C++ 应用程序的经验?有可能吗?你会使用哪个 C++ 标准库? uclibc++ 可以与 boost 一起使用吗? 最佳答案 我们
我是一名优秀的程序员,十分优秀!