#include
#include
#include
#include
int system(const char * cmdstring)
{
pid_t pid;
int status;
if(cmdstring == NULL){
return (1);
}
if((pid = fork())<0){
status = -1;
}
else if(pid == 0)
{
execl("/bin/sh", "sh", "-c", cmdstring, (char *)0);
exit(127);
}
else{
while(waitpid(pid, &status, 0) < 0){
if(errno != EINTER){
status = -1;
break;
}
}
}
return status;
}
system函数调用了 shell脚本 创建了一个新的进程。在linux内核里 system之后 用fork()创建子进程,该子进程 复制了 父进程的 资源,但相互之间没有 共享 是独立的。
但当系统内存不足的情况下,会创建失败,往往不能完成该命令。所以可以调用vfork();该函数同样也创建子进程,不过会共享父进程的资源,不需要另外开辟。
两者的区别 还在于 当你的子进程依赖父进程下面的变量以及环境时,用vfork()系统会挂掉。vfork();产生的子进程,必须执行完成了才来返回执行 父进程的命令,当你不依托父进程,之后的环境时,完全可以用vfork();函数;
fork();子进程里面环境不会影响到 父进程,而 vfork() 则会影响父进程
阅读(925) | 评论(0) | 转发(0) |