Chinaunix首页 | 论坛 | 博客
  • 博客访问: 34250
  • 博文数量: 10
  • 博客积分: 270
  • 博客等级: 二等列兵
  • 技术积分: 105
  • 用 户 组: 普通用户
  • 注册时间: 2012-01-05 21:42
文章分类

全部博文(10)

文章存档

2012年(10)

我的朋友

分类: C/C++

2012-01-16 16:55:27

#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) |
0

上一篇:errno

下一篇:栈 堆

给主人留下些什么吧!~~