打开APP
userphoto
未登录

开通VIP,畅享免费电子书等14项超值服

开通VIP
linux fork execv的使用

1、linux fork和vfork的区别:

调用fork时,fork 创造的子进程复制了父亲进程的资源,包括内存的内容task_struct内容,新旧进程使用同一代码段,复制数据段和堆栈段,这里的复制采用了注明的copy_on_write技术,即一旦子进程开始运行,则新旧进程的地址空间已经分开,两者运行独立运行。

调用vfork时,在调用exec函数和exit函数之前,子进程和父进程共享数据段数据。vfork函数创建的子进程完全运行在父进程的地址空间上,子进程对虚拟地址空间任何数据的修改都为父进程所见。在vfork时,先运行子进程,阻塞父进程运行。

如下面的程序:

int status;
 int number = 0;
 pid_t cpid;
 cpid = fork();
 if(cpid == 0) //child thread
 {
  char *argv[]={"ls","-la",NULL};
  number = 5;
  printf("in child %d  number=%d\n",getpid(),number);
  int ret =execv("/bin/ls",argv);
   if(ret == -1)
  {
   printf("exit error");
   perror("exit");
   _exit(100);
  }
  //  printf(" ret = %d before exit\n",ret);
 }
 else //father thread
 {
  printf("in father %d  number=%d\n",getpid(),number);
  waitpid(cpid,&status,0);

 }
 printf("wait pid status=%d\n",status);

因为使用的是fork,这里in child %d  number=5,但是in father %d  number=0;

如果是的是vfork,in father %d  number=5和in child %d  number=5相同。

2、如果调用exec函数,执行其他的进程,建议使用vfork,节省时间和资源。

3、在调用exec函数的时候,如果exec有返回,则是返回错误,错误代码在errno中,用perror打印,否则没有返回值,执行完成命令之后,直接退出线程。如上例子中,如果exec正确执行,printf(" ret = %d before exit\n",ret);则不会执行。

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

本站仅提供存储服务,所有内容均由用户发布,如发现有害或侵权内容,请点击举报
打开APP,阅读全文并永久保存 查看更多类似文章
猜你喜欢
类似文章
【热】打开小程序,算一算2024你的财运
用waitpid检测子进程的退出状态
Linux下的进程的
UNIX环境编程学习笔记(18)
fork与vfork的区别?
Linux进程学习总结 fork()和vfork()的学习
Linux fork与vfork的深入分析
更多类似文章 >>
生活服务
热点新闻
分享 收藏 导长图 关注 下载文章
绑定账号成功
后续可登录账号畅享VIP特权!
如果VIP功能使用有故障,
可点击这里联系客服!

联系客服