摘要: #include<sys/types.h> #include<linux/sem.h> #include<linux/shm.h> #include<unistd.h> #include<stdio.h> #include<errno.h> #include<time.h> #define MAXSHM 5 //定义缓冲区数组的下标变量个数 /* 定义3个信号量的内部标识 */ int fullid; int emptyid; int mutexid; /* 主函数 */ int main() { /*... 阅读全文
posted @ 2012-05-27 19:21 Jeakon 阅读(1346) 评论(0) 推荐(0) 编辑
摘要: 使用共享内存的目的:共享内存共享内存是进程间通信中最简单的方式之一。共享内存允许两个或更多进程访问同一块内存,就如同 malloc() 函数向不同进程返回了指向同一个物理内存区域的指针。当一个进程改变了这块地址中的内容的时候,其它进程都会察觉到这个更改。使用共享内存的流程:1.进程必须首先分配它。2.随后需要访问这个共享内存块的每一个进程都必须将这个共享内存绑定到自己的地址空间中。3.当完成通信之后,所有进程都将脱离共享内存,并且由一个进程释放该共享内存块。 分配:int segment_id = shmget (shm_key, int size , shmflag ); 1.进程通过调用s 阅读全文
posted @ 2012-05-27 19:00 Jeakon 阅读(472) 评论(0) 推荐(0) 编辑
摘要: 系统调用mmap()通过映射一个普通文件实现共享内存。系统V则是通过映射特殊文件系统shm中的文件实现进程间的共享内存通信。也就是说,每个共享内存区域对应特殊文件系统shm中的一个文件(这是通过shmid_kernel结构联系起来的),后面还将阐述。1、系统V共享内存原理进程间需要共享的数据被放在一个叫做IPC共享内存区域的地方,所有需要访问该共享区域的进程都要把该共享区域映射到本进程的地址空间中去。系统V共享内存通过shmget获得或创建一个IPC共享内存区域,并返回相应的标识符。内核在保证shmget获得或创建一个共享内存区,初始化该共享内存区相应的shmid_kernel结构注同时,还将 阅读全文
posted @ 2012-05-27 18:50 Jeakon 阅读(263) 评论(0) 推荐(0) 编辑
摘要: 在ANSI C中,对文件的操作分为两种方式,即流式文件操作和I/O文件操作,下面就分别介绍之。一、流式文件操作 这种方式的文件操作有一个重要的结构FILE,FILE在stdio.h中定义如下:typedef struct {int level; /* fill/empty level of buffer */unsigned flags; /* File status flags */char fd; /* File descriptor */unsigned char hold; /* Ungetc char if no buffer */int bsize; /* Buffer size. 阅读全文
posted @ 2012-05-27 16:51 Jeakon 阅读(230) 评论(0) 推荐(0) 编辑
摘要: 在文件IO的编程过程中,经常会遇到如何求取文件长度的问题,这里将工作及教学中积累的一些常用方法写出来与大家分享。第一类:lseek/fseek1、lseek代码片段:int GetFileSize(char *_pName) { int iFd = -1; int iLen = 0; if (_pName == NULL) { return -1; } iFd = open(_pName, O_RDONLY); if (iFd >= 0) { iLen = lseek(iFd, 0, SEEK_END); close(i... 阅读全文
posted @ 2012-05-27 14:22 Jeakon 阅读(595) 评论(0) 推荐(0) 编辑
摘要: 在线程对共享相同内存操作时,就会出现多个线程对同一资源的使用,为此,需要对这些线程进行同步,以确保它们在访问共享内存的时候不会访问到无效的数值。以下是线程的几种同步方式:1、互斥量。 通过使用pthread的互斥接口保护数据,确保同一时间只有一个线程访问数据。互斥量从本质上讲是一把锁,在访问共享资源前对互斥量进行加锁,在访问完成后释放互斥量上的锁。如下例所示,就是互斥量对共享数据的操作:#include <stdio.h> #include <pthread.h> int value = 5;//共享变量 pthread_mutex_t mutex;//互斥变量 voi 阅读全文
posted @ 2012-05-27 14:19 Jeakon 阅读(572) 评论(0) 推荐(0) 编辑
摘要: Linux进程间通信之信号量信号量是一种用于提供不同进程间或一个给定进程的不同线程间同步手段的原语。在UNIX下有三种分别如下:Posix有名信号量;Posix基于内存的信号量;System V信号量。在这里只和大家分享下有关System V信号量。System V通过定义计数信号量集来对信号量的操作,计数信号量集是一个或多个信号量构成一个集合,其中每个都是计数信号量。对于系统中的每个信号量集,内核维护一个如下的信息结构,它定义在<sys/sem.h>头文件中。struct semid_ds{struct ipc_perm sem_perm; /* operation permis 阅读全文
posted @ 2012-05-27 14:14 Jeakon 阅读(699) 评论(0) 推荐(0) 编辑
摘要: Linux进程间通信之共享内存 共享内存区是可用IPC形式中最快的。一旦这样的内存区映射到共享它的进程的地址空间,这些进程间数据的传递就不再涉及内核(这里说的不涉及内核的含义是:进程不再通过执行任何进入内核的系统调用来彼此传递数据)。然而往该共享内存区存放信息或从中取走信息的进程间通常需要某种形式的同步,同步的方式有多种,比如:信号量、互斥锁等等。以下两图分别描述了读写消息时,一个要进入内核,而一个不进入内核的情况:对于System V共享内存区,内核维护如下的信息结构,它定义在<sys/shm.h>头文件中:struct shmid_ds{struct ipc_perm shm_ 阅读全文
posted @ 2012-05-27 14:11 Jeakon 阅读(294) 评论(0) 推荐(0) 编辑
摘要: 浅谈Linux进程作者:嵌入式学院武汉华嵌中心技术支持涂佩君内容清单:1. 在 Linux 内核内进程表示2. 在 Linux 内进程管理3. 在 Linux 内核创建一个进程引言 Linux的用户空间进程的创建和管理所涉及的原理与 UNIX有很多共同点,但也有一些特定于 Linux 的独特之处。在本文中,了解 Linux 进程的生命周期,探索用户进程创建、内存管理内幕。Linux 是一种动态系统,能够适应不断变化的计算需求。Linux 计算需求的表现是以进程 的通用抽象为中心的。进程可以是短期的(从命令行执行的一个命令),也可以是长期的(一种网络服务)。因此,对进程及其调度进行一般管理就显得 阅读全文
posted @ 2012-05-27 13:57 Jeakon 阅读(231) 评论(0) 推荐(0) 编辑
摘要: 一、用户空间内存分配:malloc、calloc、realloc1、malloc原型如下:extern void *malloc(unsigned int num_bytes);功能:分配长度为num_bytes字节块。工作机制:malloc函数的实质体现在,它有一个将可用的内存块连接为一个长长的列表的所谓空闲链表。调用malloc函数时,它沿连接表寻找一个大到足以满足用户请求所需要的内存块。然后,将该内存块一分为二(一块的大小与用户请求的大小相等,另一块的大小就是剩下的字节)。接下来,将分配给用户的那块内存传给用户,并将剩下的那块(如果有的话)返回到连接表上。2、calloc原型如下:voi 阅读全文
posted @ 2012-05-27 13:53 Jeakon 阅读(388) 评论(0) 推荐(0) 编辑