摘要: 文件操作 大多数情况下,只需知道5个基本的函数--open,close,read,write,ioctl(将控制信息传递给设备驱动程序)。在Linux中,一切都是文件。文件除了本身包含的文件内容以外,它还会有一个名字和一些属性,也就是文件的管理信息,包括文件的创建/修改日期和文件的访问权限等。这些属性都被保存在文件的inode节点中,它是文件系统中的一个特殊的数据块,它同时还包含文件的长度和文件在磁盘上的存放位置。系统使用的是文件的inode编号,目录结构为文件起个名字仅仅是为了人们使用方便。 可以通过ln命令在不同的目录中创建指向同一个文件的链接,删除一个文件的时候,实质上市删除了该文件.. 阅读全文
posted @ 2012-07-01 20:36 鼻子很帅的猪 阅读(356) 评论(0) 推荐(0) 编辑
摘要: Memory mapped I/O就是把磁盘上的file映射到内存上,当我们从内存上fetch byte时,对应的file就被读取。同样的,当我们在内存上存储字节的时候,对应的file就被写入。这就让我们不需通过read和write系统调用而去操作I/O。 mmap内存映射建立一段可以被多个进程读写的内存段。共享内存。 mmap函数作用是告诉内核把给定的文件file映射到内存的一块空间,mmap函数原型如下:#include <sys/mmam.h>void *mmap(void *addr, size_t len, int prot, int flag, int... 阅读全文
posted @ 2012-07-01 13:47 鼻子很帅的猪 阅读(4771) 评论(0) 推荐(0) 编辑
摘要: poll函数和select函数非常相似,但是函数接口不一样。 int poll(struct pollfd fdarray[], nfds_t nfds, int timeout); int select(int maxfdp1, fd_set *restrict readfds, fd_set *restrict expectfds, struct timeval * restrict tvptr); 其中poll函数中,结构pollfd如下: struct pollfd{ int fd; //file descriptor short event;//event o... 阅读全文
posted @ 2012-07-01 12:20 鼻子很帅的猪 阅读(16847) 评论(0) 推荐(0) 编辑
摘要: 字节作为最小的可寻址的单位,而不是位bit。机器级程序将存储器看做一个非常大的数组,成为虚拟存储器。存储器的每个字节都由一个唯一的数字来标识,称为它的地址,所有可能的地址的集合就叫虚拟地址空间virtual address space。虚拟地址的主要目的就是展现给程序一个概念性的映像,将访问内存,磁盘,特殊硬件结合起来,为程序提供一个看上去统一的字节数组。 C编译器还把每个指针和类型信息联系起来,这样就可以根据指针的类型,生成不同的及其级代码来存储指针所指向的数据。尽管C编译器维护者这个类型信息,但是它生成的机器级程序并不在乎数据类型的信息。每个程序对象都可以简单视为一个字节块。 与变... 阅读全文
posted @ 2012-06-30 22:37 鼻子很帅的猪 阅读(314) 评论(0) 推荐(0) 编辑
摘要: 对于总是想知道事情是如何运作的我,相信这本书能够解开我大多数的谜团。我相信,从程序员的角度去学习计算机系统是如何工作的会非常有趣。所以我会在博客上随时更新我阅读的笔记和心得。备忘吧。。。哈哈 总感觉记忆力不好~》~ 也希望能帮助一样有困惑的码农们。 阅读全文
posted @ 2012-06-29 00:13 鼻子很帅的猪 阅读(143) 评论(0) 推荐(0) 编辑
摘要: ioctl 函数本函数影响由fd 参数引用的一个打开的文件。#include<unistd.h>int ioctl( int fd, int request, .../* void *arg */ );返回0 :成功 -1 :出错第三个参数总是一个指针,但指针的类型依赖于request 参数。我们可以把和网络相关的请求划分为6 类:套接口操作文件操作接口操作ARP 高速缓存操作路由表操作流系统下表列出了网络相关ioctl 请求的request 参数以及arg 地址必须指向的数据类型:类别Request说明数据类型套接口SIOCATMARKSIOCSPGRPSIOCGPGRP是否位于 阅读全文
posted @ 2012-06-28 21:59 鼻子很帅的猪 阅读(248) 评论(0) 推荐(0) 编辑
摘要: 1. 前言 使用ioctl系统调用是用户空间向内核交换数据的常用方法之一,从ioctl这个名称上看,本意是针对I/O设备进行的控制操作,但实际并不限制是真正的I/O设备,可以是任何一个内核设备即可。2. 基本过程 在内核空间中ioctl是很多内核操作结构的一个成员函数,如文件操作结构struct file_operations(include/linux/fs.h)、协议操作结构struct proto_ops(include/linux/net.h)等、tty操作结构struct tty_driver(include/linux/tty_driver.h)等,而这些操作结构分别对应各种内.. 阅读全文
posted @ 2012-06-28 21:58 鼻子很帅的猪 阅读(585) 评论(0) 推荐(0) 编辑
摘要: 在客户端/服务器模型中,服务器端需要同时处理多个客户端的连接请求,此时就需要使用多路复用。 实现多路复用最简单的方法是采用非阻塞的方式套接字,服务器端不断的查询每一个套接字的状态,如果有数据到达则读出数据,如果没有数据到达则查看下一个套接字。这种方法虽然简单,但是轮询过程中浪费了大量的CPU时间,效率非常的低。 另一种方法是服务器进程并不主动的询问套接字的状态,而是向系统登记希望坚实的套接字,然后阻塞。当套接字上有事件发生时(如有数据到达),系统通知服务器进程告知那个套接字上发生了什么事件,服务器进程查询对应的套接字,并进行处理。在这种工作方式下,套接字上没有事件发生时,服务器进程不会... 阅读全文
posted @ 2012-06-26 23:56 鼻子很帅的猪 阅读(314) 评论(0) 推荐(0) 编辑
摘要: 1 套接字地址结构struct sockaddr{ unsigned short sa_family;//地址类型 char sa_data[14]; //14字节的地址协议}sa_family表示套接字的协议族类型,对应于TCP/IP的协议该是AF_INET;与该结构体等价的另一个数据结构:sockaddr_in。struct sockaddr_in{ unsigned short sin_family; //地址类型 unsigned short sin_port ; //端口号 struct in_addr sin_addr ;//IP地址 unsigned char sin... 阅读全文
posted @ 2012-06-26 23:42 鼻子很帅的猪 阅读(441) 评论(0) 推荐(0) 编辑
摘要: Linux进程间通信主要方法有:管道,命名管道,消息队列,信号量,共享内存,还有信号和套接字Socket。下面先简单介绍下管道:半双工的通信方式,数据只能单方向流动,而且只能在父子进程间使用。数据只能由一个进程流向另一个进程(其中一个写管道,一个读管道),如果要进行全双工通信,需要建立两个管道。管道还有一些限制条件,比如管道的缓冲区大小是受限制的。管道所传送的是无格式的字节流,这就要求发送和接受方需要事先约定好数据的格式。管道的创建#include <unistd.h>int pipe(int fd[2])一端只能用于读,由文件描述符fd[0]表示。另一端只能写,由文件描述符fd[ 阅读全文
posted @ 2012-06-25 23:21 鼻子很帅的猪 阅读(278) 评论(0) 推荐(0) 编辑