免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
最近访问板块 发新帖
查看: 2081 | 回复: 5
打印 上一主题 下一主题

[进程管理] vfork后子进程chdir为啥父进程不变 [复制链接]

论坛徽章:
1
巨蟹座
日期:2014-04-23 23:20:17
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2014-04-16 10:41 |只看该作者 |倒序浏览
本帖最后由 registcn 于 2014-04-16 10:42 编辑

vfork子进程先运行,且父子进程共享task_struct结构,那子进程改变工作目录后父进程应该一起变,那么(下面代码中测试了一下改变共享变量的情况,父子进程同时改变了)为啥chdir父进程没换过来?
  1. #include<stdio.h>
  2. #include<sys/types.h>

  3. int main(){
  4.        char ptr1[20];
  5.        char ptr2[50];
  6.        pid_t tmp;
  7.        int a=10;
  8.        if(tmp=vfork()==0){
  9.         chdir("/home/work/");
  10.         getcwd(ptr1,20);
  11.         a++;
  12.         printf("cwd = %s,%d\n",ptr1,a);
  13.         exit(0);
  14.        }
  15.         getcwd(ptr2,50);
  16.         printf("cwd = %s %d\n",ptr2,a);
  17. return;
  18. }
复制代码
难道vfork情况下也发生了写时复制?那为啥变量a没发生写时复制呢

论坛徽章:
15
射手座
日期:2014-02-26 13:45:082015年迎新春徽章
日期:2015-03-04 09:54:452015年辞旧岁徽章
日期:2015-03-03 16:54:15羊年新春福章
日期:2015-02-26 08:47:552015年亚洲杯之卡塔尔
日期:2015-02-03 08:33:45射手座
日期:2014-12-31 08:36:51水瓶座
日期:2014-06-04 08:33:52天蝎座
日期:2014-05-14 14:30:41天秤座
日期:2014-04-21 08:37:08处女座
日期:2014-04-18 16:57:05戌狗
日期:2014-04-04 12:21:33技术图书徽章
日期:2014-03-25 09:00:29
2 [报告]
发表于 2014-04-17 09:55 |只看该作者
vfork时,父子进程应该是不共享task_struct的吧?
copy_process会复制task_struct
变量a在堆栈,父子共享,所以修改后同时生效。

论坛徽章:
0
3 [报告]
发表于 2014-04-17 10:29 |只看该作者
vfork()会产生一个新的子进程.但是vfork创建的子进程与父进程共享数据段,而且由vfork创建的
子进程将先于父进程运行.
vfork()用法与fork()相似.但是也有区别,具体区别归结为以下3点:
1. fork():子进程拷贝父进程的数据段,代码段. vfork():子进程与父进程共享数据段.
2. fork():父子进程的执行次序不确定.
vfork():保证子进程先运行,在调用exec或_exit之前与父进程数据是共享的,在它调用exec
或_exit之后父进程才可能被调度运行。
3. vfork()保证子进程先运行,在她调用exec或_exit之后父进程才可能被调度运行。如果在
调用这两个函数之前子进程依赖于父进程的进一步动作,则会导致死锁。
4.当需要改变共享数据段中变量的值,则拷贝父进程。

论坛徽章:
6
金牛座
日期:2013-10-08 10:19:10技术图书徽章
日期:2013-10-14 16:24:09CU十二周年纪念徽章
日期:2013-10-24 15:41:34狮子座
日期:2013-11-24 19:26:19未羊
日期:2014-01-23 15:50:002015年亚洲杯之阿联酋
日期:2015-05-09 14:36:15
4 [报告]
发表于 2014-04-17 11:17 |只看该作者
回复 1# registcn
vfork后,父子进程共享数据段,所以在子进程修改变量a后,在父进程中可以看到变量的修改;

vfork后,父子进程都有单独的task_struct结构体,而chdir系统调用修改是current->fs,修改部分是属于task_struct结构体,所以子进程修改后不影响父进程。

   

论坛徽章:
1
巨蟹座
日期:2014-04-23 23:20:17
5 [报告]
发表于 2014-04-17 16:55 |只看该作者
如果源码是这样的。您就是大神回复 4# 瀚海书香


   

论坛徽章:
6
金牛座
日期:2013-10-08 10:19:10技术图书徽章
日期:2013-10-14 16:24:09CU十二周年纪念徽章
日期:2013-10-24 15:41:34狮子座
日期:2013-11-24 19:26:19未羊
日期:2014-01-23 15:50:002015年亚洲杯之阿联酋
日期:2015-05-09 14:36:15
6 [报告]
发表于 2014-04-18 07:52 |只看该作者
本帖最后由 瀚海书香 于 2014-04-18 07:52 编辑

回复 5# registcn
自己看代码吧
SYSCALL_DEFINE1(chdir, const char __user *, filename)
{
        struct path path;
        int error;
        unsigned int lookup_flags = LOOKUP_FOLLOW | LOOKUP_DIRECTORY;
retry:
        error = user_path_at(AT_FDCWD, filename, lookup_flags, &path);
        if (error)
                goto out;

        error = inode_permission(path.dentry->d_inode, MAY_EXEC | MAY_ACCESS);
        if (error)
                goto dput_and_out;

        set_fs_pwd(current->fs, &path);

dput_and_out:
        path_put(&path);
        if (retry_estale(error, lookup_flags)) {
                lookup_flags |= LOOKUP_REVAL;
                goto retry;
        }   
out:
        return error;
}
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

北京盛拓优讯信息技术有限公司. 版权所有 京ICP备16024965号-6 北京市公安局海淀分局网监中心备案编号:11010802020122 niuxiaotong@pcpop.com 17352615567
未成年举报专区
中国互联网协会会员  联系我们:huangweiwei@itpub.net
感谢所有关心和支持过ChinaUnix的朋友们 转载本站内容请注明原作者名及出处

清除 Cookies - ChinaUnix - Archiver - WAP - TOP