linux内核中的文件描述符(二)--socket和文件描述符
时间:11-22
来源:互联网
点击:
- dmsg(a0,(structmsghdr__user*)a1,a[2]);
- break;
- caseSYS_RECVMSG:
- err=sys_recvmsg(a0,(structmsghdr__user*)a1,a[2]);
- break;
- default:
- err=-EINVAL;
- break;
- }
- returnerr;
- }/*Itmaybealreadyanotherdescriptor8)Notkernelproblem.*/
- returnretval;
- out_release:
- sock_release(sock);
- returnretval;
- }
[plain]view plaincopyprint?
- asmlinkagelongsys_socket(intfamily,inttype,intprotocol)
- {
- intretval;
- structsocket*sock;
- retval=sock_create(family,type,protocol,&sock);//创建socket
- if(retval<0)
- gotoout;
- retval=sock_map_fd(sock);//分配一个未使用的文件描述符fd,并将socket和fd建立联系
- if(retval<0)
- gotoout_release;
- out:
- /*Itmaybealreadyanotherdescriptor8)Notkernelproblem.*/
- returnretval;
- out_release:
- sock_release(sock);
- returnretval;
- }
[plain]view plaincopyprint?
- structsocket{
- socket_statestate;
- unsignedlongflags;
- structproto_ops*ops;
- structfasync_struct*fasync_list;
- structfile*file;//通过这个和文件描述符建立联系
- structsock*sk;
- wait_queue_head_twait;
- shorttype;
- };
[plain]view plaincopyprint?
- intsock_map_fd(structsocket*sock)
- {
- intfd;
- structqstrthis;
- charname[32];
- /*
- *Findafiledescriptorsuitableforreturntotheuser.
- */
- fd=get_unused_fd();//分配一个未使用的fd
- if(fd>=0){
- structfile*file=get_empty_filp();
- if(!file){
- put_unused_fd(fd);
- fd=-ENFILE;
- gotoout;
- }
- this.len=sprintf(name,"[%lu]",SOCK_INODE(sock)->i_ino);
- this.name=name;
- this.hash=SOCK_INODE(sock)->i_ino;
- file->f_dentry=d_alloc(sock_mnt->mnt_sb->s_root,&this);
- if(!file->f_dentry){
- put_filp(file);
- put_unused_fd(fd);
- fd=-ENOMEM;
- gotoout;
- }
- file->f_dentry->d_op=&sockfs_dentry_operations;
- d_add(file->f_dentry,SOCK_INODE(sock));
- file->f_vfsmnt=mntget(sock_mnt);
- file->f_mapping=file->f_dentry->d_inode->i_mapping;
- sock->file=file;//建立联系
- file->f_op=SOCK_INODE(sock)->i_fop=&socket_file_ops;//socket操作函数,当使用文件系统的IO函数时,其实使用的是socket的IO函数
- file->f_mode=FMODE_READ|FMODE_WRITE;
- file->f_flags=O_RDWR;
- file->f_pos=0;
- file->private_data=sock;
- fd_install(fd,file);
- }
- out:
- returnfd;
- }
- staticstructfile_operationssocket_file_ops={
- .owner=THIS_MODULE,
- .llseek=no_llseek,
- .aio_read=sock_aio_read,
- .aio_write=sock_aio_write,
- .poll=sock_poll,
- .unlocked_ioctl=sock_ioctl,
- .mmap=sock_mmap,
- .open=sock_no_open,/*specialopencodetodisallowopenvia/proc*/
- .release=sock_close,
- .fasync=sock_fasync,
- .readv=sock_readv,
- .writev=sock_writev,
- .sendpage=sock_sendpage
- };
linux内核文件描述符socke 相关文章:
- Windows CE 进程、线程和内存管理(11-09)
- RedHatLinux新手入门教程(5)(11-12)
- uClinux介绍(11-09)
- openwebmailV1.60安装教学(11-12)
- Linux嵌入式系统开发平台选型探讨(11-09)
- Windows CE 进程、线程和内存管理(二)(11-09)
