Chinaunix首页 | 论坛 | 博客
  • 博客访问: 78828
  • 博文数量: 14
  • 博客积分: 0
  • 博客等级: 民兵
  • 技术积分: 161
  • 用 户 组: 普通用户
  • 注册时间: 2014-01-03 12:32
文章分类

全部博文(14)

文章存档

2016年(1)

2015年(7)

2014年(6)

我的朋友

分类: LINUX

2014-12-24 09:49:51

 我们通过fork来产生子进程时,子进程是复制父进程的文件描述符表的,即,父进程中打开的文件,fork后,在子进程中仍然可以操作。
但是子进程中打开的文件,在父进程中可以操作吗?看下面代码:


点击(此处)折叠或打开

  1. pid_t pid = fork();
  2.     assert( pid >= 0 );
  3.     if( pid == 0 )
  4.     {
  5.         passfd = open( "recvmsg.txt" , O_RDWR , 0666 );
  6.         send_fd( pipefd[1] , passfd );
  7.         exit( 0 );
  8.     }
  9.     passfd = recv_fd( pipefd[0] );
  10.     char buf[1024];
  11.     memset( buf , 0 , 1024 );
  12.     read( passfd , buf , 1024 );
  13.     printf( "buf is %s\n" , buf );
  14.     close( passfd );



如果上面的代码中不考虑send和recv函数的调用,那么,上面的问题答案很明显,就是父进程不能操作子进程打开的文件,因为,复制后就各操作各的了,没有共享。

上面的send和recv里发生了什么?

答案是调用了sendmsg和recvmsg,并且通信的是UNIX域套接字,但是,这又怎样,不用UNIX域套接字,用其他方式也可以很方便的在父子进程间传递一个整数啊(文件描述符是一个整数)。

答案就在于struct msghdr 和 struct cmsghdr这两个结构中,在cmsghdr的cmsg_level字段的取值为SCM_RIGHTS时,表示传递的是一个文件描述符,这就是上面那段代码能够正确执行的关键。

那么问题来了,如果不用UNIX域套接字,还能不能传输文件描述符呢?
这个传输的内部实现是什么呢?
我还得继续学习……


阅读(1677) | 评论(0) | 转发(0) |
0

上一篇:12306

下一篇:fscanf

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