摘要: 共享内存共享内存可以说是最有用的进程间通信方式,也是最快的IPC形式。两个不同进程A、B共享内存的意思是,同一块物理内存被映射到进程A、B各自的进程地址空间。进程A可以即时看到进程B对共享内存中数据的更新,反之亦然。由于多个进程共享同一块内存区域,必然需要某种同步机制,互斥锁和信号量都可以。共享内存实现分为两个步骤:一、创建共享内存,使用shmget函数。二、映射共享内存,将这段创建的共享内存映射到具体的进程空间去,使用shmat函数。系统调用:shmget( ) ;原型:int shmget ( key_t key, int size, int shmflg );返回值:如果成功,返回共享内 阅读全文
posted @ 2012-05-28 21:02 龍傲霜 阅读(636) 评论(0) 推荐(0) 编辑
摘要: 消息队列就是消息的一个链表,它允许一个或多个进程向它写消息,一个或多个进程从中读消息。具有一定的FIFO的特性,但是可实现消息的随即查询。这些消息存在于内核中,由“队列ID”来标识。消息队列的实现包括创建和打开队列、添加消息、读取消息和控制消息队列这四种操作。msgget:创建和打开队列,其消息数量受系统限制。msgsnd:添加消息,将消息添加到消息队列尾部。msgrcv:读取消息,从消息队列中取走消息。msgctl:控制消息队列。int msgget (key_t key, int flag)key:返回新的或已有队列的ID,IPC_PRIVATEint msgsnd (int msqid, 阅读全文
posted @ 2012-05-28 20:52 龍傲霜 阅读(797) 评论(1) 推荐(0) 编辑
摘要: 服务器端程序的编译gcc -o file_server file_server.c客户端程序的编译gcc -o file_client file_client.c服务器程序和客户端程应当分别运行在2台计算机上.服务器端程序的运行,在一个计算机的终端执行./file_server客户端程序的运行,在另一个计算机的终端中执行./file_client 运行服务器程序的计算机的IP地址根据提示输入要传输的服务器上的文件,该文件在服务器的运行目录上在实际编程和测试中,可以用2个终端代替2个计算机,这样就可以在一台计算机上测试网络程序,服务器端程序的运行,在一个终端执行./file_server客户端程 阅读全文
posted @ 2012-05-24 23:56 龍傲霜 阅读(846) 评论(0) 推荐(0) 编辑
摘要: 一、概述在Linux系统中,以进程为单位来分配和管理资源。由于保护的缘故,一个进程不能直接访问另一个进程的资源,也就是说,进程之间互相封闭。在一个复杂的应用系统中,通常会使用多个相关的进程来共同完成一项任务,因此要求进程之间必须能够互相通信,从而来共享资源和信息。所以,一个操作系统内核必须提供进程间的通信机制。管道管道和有名管道是最早的进程间通信机制之一,管道可用于具有亲缘关系进程间的通信,有名管道克服了管道没有名字的限制,因此,除具有管道所具有的功能外,它还允许无亲缘关系进程间的通信。管道是指用于连接一个读进程和一个写进程,以实现它们之间通信的共享方式,又称pipe文件。管道是Linux支持 阅读全文
posted @ 2012-05-10 23:26 龍傲霜 阅读(668) 评论(0) 推荐(0) 编辑
摘要: linux系统中每个进程由一个进程id标识,在内核中对应一个task_struct结构的进程描述符,系统中所有进程的task_struct通过链表链接在一起,在内核中,经常需要通过进程id来获取进程描述符,最简单的方法可以通过遍历task_struct链表并对比id的值来获取,但这样效率太低,尤其当系统中运行很多个进程的时候。linux内核通过PID散列表来解决这一问题,能快速的通过进程ID获取到进程描述符。PID散列表包含4个表,因为进程描述符包含了表示不同类型PID的字段,每种类型的PID需要自己的散列表。enum pid_type{ PIDTYPE_PID, // 进程的PID PIDT 阅读全文
posted @ 2012-05-04 23:15 龍傲霜 阅读(1261) 评论(0) 推荐(0) 编辑
摘要: 1、下载Linux最新版本内核源码 3.3.32、将内核源码解压 tar jxvf linux***883、进入内核源码根目录 cd linux-3.3.34、查看内核源码目录结构 ls5、安装相关工具 sudo apt-get install vim sudo apt-get exuberant-ctags6、查看内核源码方法 make tags vim -t task_struct进入Linux Ubuntu 中 观看内核代码的几个按键命令使用make tags和vim -t task_struct,进入后想查看别的结构体的话,把光标移入想查看的结构体,按键Ctrl+],在往后观看别的结构 阅读全文
posted @ 2012-04-27 23:41 龍傲霜 阅读(1562) 评论(0) 推荐(0) 编辑
摘要: 这里展示怎样利用time.h中声明的函数对时间进行操作。这些操作包括取当前时间、算时间间隔、以不同的形式显示时间等内容。获得日历时间:我们可以通过time()函数来获得日历时间(Calendar Time),其原型为:time_t time(time_t *timer);一个简单的利用localtime()的小例子#include <stdio.h>#include <time.h>void main(){ time_t now; struct tm *timenow; char strtemp[255]; time(&now); timeno... 阅读全文
posted @ 2012-04-22 16:08 龍傲霜 阅读(676) 评论(0) 推荐(0) 编辑
摘要: 信号概念信号(signal)是一种进程间通信机制,它给应用程序提供一种异步的软件中断,使应用程序有机会接受其他程序活终端发送的命令(即信号)。应用程序收到信号后,有三种处理方式: 忽略 默认 捕捉进程收到一个信号后,会检查对该信号的处理机制。 如果是SIG_IGN,就忽略该信号; 如果是SIG_DFT,则会采用系统默认的处理动作,通常是终止进程或忽略该信号; 如果给该信号指定了一个处理函数(捕捉),则会中断当前进程正在执行的任务,转而去执行该信号的处理函数,返回后再继续执行被中断的任务。信号来源信号是传送给进程的一种事件通知,生成信号的事件有三大类: 1、程序错误:除零,非法内存... 阅读全文
posted @ 2012-03-28 01:04 龍傲霜 阅读(328) 评论(0) 推荐(0) 编辑
摘要: 程序例子是简单的HELLO WORLD!生成可执行文件 命令:#gcc hello.c -o hello运行程序 #./hello 屏幕即显示hello world!gcc编译器选项-o选项,表示输出的可执行文件。-c选项表示只输出目标代码,而不必输出可执行文件。-g选项表示要求编译器在编译的时候提供对程序的调试信息。例如: #gcc -c test1.c //将test1.c编译成test1.o #gcc -c test2.c //将test2.c编译成test2.o #gcc -o test test1.o test2.o //将test1.o和test2.o链接成可执行文件te... 阅读全文
posted @ 2012-03-27 23:37 龍傲霜 阅读(231) 评论(0) 推荐(1) 编辑
摘要: lseek()每一个已打开的文件都有一个读写位置,当打开文件时通常其读写位置是指向文件开头。fildes 为已打开的文件标识符。offset:偏移量,每一读写操作所需要移动的距离,单位是字节的数量,可正可负(向前移,向后移)。返回值:当调用成功时则返回目前的读写位置,也就是距离文件开头多少个字节。若有错误则返回-1。whence为下列其中一种:(SEEK_SET,SEEK_CUR和SEEK_END和依次为0,1和2) SEEK_SET 将读写位置指向文件头后再增加offset个位移量。 SEEK_CUR 以目前的读写位置往后增加offset个位移量。 SEEK_END 将读写位置指向文件... 阅读全文
posted @ 2012-03-27 22:39 龍傲霜 阅读(151) 评论(0) 推荐(0) 编辑