michile

导航

2013年2月6日

分配和释放信号量

摘要: 与用于分配、释放共享内存的shmget和shmctl类似,系统调用semget和semctl负责分配、释放信号量。调用semget函数并传递如下参数:一个用于标识信号量组的键值,该组中包含的信号量数量和与shmget所需的相同的权限位标识。该函数返回的是信号量组的标识符。你可以通过指定正确的键值来获取一个已经存在的信号量的标识符;这种情况下,传递的信号量组的容量可以为0。信号量会一直保存在系统中,甚至所有使用它们的进程都退出后也不会自动被销毁。最后一个使用信号量的进程必须明确地删除所使用的信号量组,来确保系统中不会有太多闲置的信号量组,从而导致无法创建新的信号量组。可以通过调用semctl来删 阅读全文

posted @ 2013-02-06 22:47 michile 阅读(3279) 评论(0) 推荐(0) 编辑

信号量

摘要: 信号量是一个可用于同步多线程环境的计数器。摘 高级linux程序设计 完美废人译 阅读全文

posted @ 2013-02-06 22:34 michile 阅读(178) 评论(0) 推荐(0) 编辑

代码列表5.1 (shm.c) 尝试共享内存

摘要: #include <stdoi.h> #include <sys/shm.h> #include <sys/stat.h> int main () { int segment_id; char* shared_memory; struct shmid_ds shmbuffer; int segment_size; const int shared_segment_size = 0x6400; /* 分配一个共享内存块*/ segment_id = shmget (IPC_PRIVATE, shared_segment_size, IPC_CREAT | IP 阅读全文

posted @ 2013-02-06 22:25 michile 阅读(165) 评论(0) 推荐(0) 编辑

控制和释放共享内存块

摘要: 调用shmctl("SHared Memory ConTroL",控制共享内存)函数会返回一个共享内存块的相关信息。同时shmctl允许程序修改这些信息。该函数的第一个参数是一个共享内存块标识。要获取一个共享内存块的相关信息,则为该函数传递 IPC_STAT 作为第二个参数,同时传递一个指向一个struct shmid_ds对象的指针作为第三个参数。要删除一个共享内存块,则应将IPC_RMID作为第二个参数,而将NULLL作为第三个参数。当最后一个绑定该共享内存块的进程与其脱离时,该共享内存块将被删除。你应当在结束使用每个共享内存块的时候都使用shmctl进行释放,以防止超 阅读全文

posted @ 2013-02-06 22:10 michile 阅读(483) 评论(0) 推荐(0) 编辑

绑定和脱离

摘要: 要让一个进程获取对一块共享内存的访问,这个进程必须先调用shmat(SHared Memory Attach,绑定到共享内存)。将shmget返回的共享内存标识符SHMID传递给这个函数作为第一个参数。该函数的第二个参数是一个指针,指向你希望用于映射该共享内存块的进程内存地址;如果你指定NULL则Linux会自动选择一个合适的地址用于映射。第三个参数是一个标志位,包含了以下选项:· SHM_RND表示第二个参数指定的地址应被向下靠拢到内存页面大小的整数倍。如果你不指定这个标志,你将不得不在调用shmat 的时候手工将共享内存块的大小按页面大小对齐。· SHM_RDONLY表 阅读全文

posted @ 2013-02-06 22:08 michile 阅读(111) 评论(0) 推荐(0) 编辑

LDD3--模块编程注意事项

摘要: 因为没有库连接到模块中, 源文件不应当包含通常的头文件, <stdarg.h>和非常特殊的情况是仅有的例外. 只有实际上是内核的一部分的函数才可以在内核模块里使用. 内核相关的任何东西都在头文件里声明, 这些头文件在你已建立和配置的内核源码树里; 大部分相关的头文件位于 include/linux 和 include/asm, 但是别的 include 的子目录已经添加到关联特定内核子系统的材料里了。另外一个在内核编程和应用程序编程之间的重要不同是每一个环境是如何处理错误: 在应用程序开发中段错误是无害的, 一个调试器常常用来追踪错误到源码中的问题, 而一个内核错误即使不终止整个系 阅读全文

posted @ 2013-02-06 17:51 michile 阅读(193) 评论(0) 推荐(0) 编辑

LDD3--驱动设备分类

摘要: 字符设备一个字符( char ) 设备是一种可以当作一个字节流来存取的设备( 如同一个文件 ); 一个字符驱动负责实现这种行为. 这样的驱动常常至少实现 open, close, read, 和 write 系统调用. 文本控制台( /dev/console )和串口( /dev/ttyS0 及其友 )是字符设备的例子, 因为它们很好地展现了流的抽象. 字符设备通过文件系统结点来存取, 例如 /dev/tty1 和 /dev/lp0. 在一个字符设备和一个普通文件之间唯一有关的不同就是, 你经常可以在普通文件中移来移去, 但是大部分字符设备仅仅是数据通道, 你只能顺序存取.然而, 存在看起来象 阅读全文

posted @ 2013-02-06 17:07 michile 阅读(241) 评论(0) 推荐(0) 编辑

LDD3--linux内核角色【copy】

摘要: 进程管理内核负责创建和销毁进程, 并处理它们与外部世界的联系(输入和输出). 不同进程间通讯(通过信号, 管道, 或者进程间通讯原语)对整个系统功能来说是基本的, 也由内核处理. 另外, 调度器, 控制进程如何共享 CPU, 是进程管理的一部分. 更通常地, 内核的进程管理活动实现了多个进程在一个单个或者几个 CPU 之上的抽象.内存管理 计算机的内存是主要的资源, 处理它所用的策略对系统性能是至关重要的. 内核为所有进程的每一个都在有限的可用资源上建立了一个虚拟地址空间. 内核的不同部分与内存管理子系统通过一套函数调用交互, 从简单的 malloc/free 对到更多更复杂的功能.文件系统 阅读全文

posted @ 2013-02-06 16:58 michile 阅读(213) 评论(0) 推荐(0) 编辑