- 论坛徽章:
- 0
|
我在一个 arm 9 的板子上 执行了一个 system(“ ls -l ”)函数.
反复的运行多次,就发现 会阻塞在 这个函数, 没有返回了。
后来我把我使用的 uClibc-0_9_28 库里的 system 函数弄出来了。 最后发现是 , 在阻塞的时候 if ((pid = vfork()) ==0 ) 不执行。
导致 父进程在 死等 子进程的结束。
这里我有个很大的疑问, 为什么 fork() 不返回 0 , 子进程一直得不到调度吗???????
百思不得其解, 恳求 各位大侠有遇到这样问题的吗? 请指点下。 谢谢!
#include <stdio.h>
#include <stddef.h>
#include <signal.h>
#include <unistd.h>
#include <sys/wait.h>
/* uClinux-2.0 has vfork, but Linux 2.0 doesn't */
#include <sys/syscall.h>
#if ! defined __NR_vfork
#define vfork fork
#endif
int __libc_system(char *command)
{
int wait_val, pid;
__sighandler_t save_quit, save_int, save_chld;
if (command == 0)
return 1;
save_quit = signal(SIGQUIT, SIG_IGN);
save_int = signal(SIGINT, SIG_IGN);
save_chld = signal(SIGCHLD, SIG_DFL);
if ((pid = vfork()) < 0) {
signal(SIGQUIT, save_quit);
signal(SIGINT, save_int);
signal(SIGCHLD, save_chld);
return -1;
}
if (pid == 0) {
signal(SIGQUIT, SIG_DFL);
signal(SIGINT, SIG_DFL);
signal(SIGCHLD, SIG_DFL);
execl("/bin/sh", "sh", "-c", command, (char *) 0);
_exit(127);
}
/* Signals are not absolutly guarenteed with vfork */
signal(SIGQUIT, SIG_IGN);
signal(SIGINT, SIG_IGN);
#if 0
printf("Waiting for child %d\n", pid);
#endif
if (wait4(pid, &wait_val, 0, 0) == -1)
wait_val = -1;
signal(SIGQUIT, save_quit);
signal(SIGINT, save_int);
signal(SIGCHLD, save_chld);
return wait_val;
}
weak_alias(__libc_system, system) |
|