- 论坛徽章:
- 0
|
调用system到底会不会复制父进程的东西呢?
我看到还有人自己写的my_system用vfork代替fork 号称这样不会复制没用的东西:
原文如下:
因为新fork出来的子进程会自动把父进程的数据段继承一份出来,如果父进程的数据段比较大的话,会占用较多的内存。建议自己做一个system函数,用vfork取代fork即可。
自己的system函数
int my_system(char* cmd)
{
intstatus = 0;
pid_t pid;
if ((pid = vfork()) <0)
{
printf("vfork process error! \n");
status = -1;
}
else if (pid==0)
{
const char *new_argv[4];
struct sigaction sa_cld;
sa_cld.sa_handler = SIG_DFL;
sa_cld.sa_flags = 0;
/* 在子进程中放开SIGINT信号 */
sigemptyset(&sa_cld.sa_mask);
sigaction (SIGINT, &sa_cld, NULL);
sigaction (SIGQUIT, &sa_cld, NULL);
new_argv[0] = SHELL_NAME;
new_argv[1] = "-c";
new_argv[2] = cmd;
new_argv[3] = NULL;
if (execve(SHELL_PATH,(char *const *) new_argv, environ) <0)
{
printf("fail to execve %s! errno: %d\n",cmd,errno);
exit(1);
}
else
{
exit(0);
}
}
else
{
waitpid(pid,&status,0);
}
return status;
} |
|