2013年1月15日
摘要: 系统调用:semop();调用原型:int semop(int semid,struct sembuf*sops,unsign ednsops);返回值:0,如果成功。-1,如果失败:errno=E2BIG(nsops大于最大的ops数目)EACCESS(权限不够)EAGAIN(使用了IPC_NOWAIT,但操作不能继续进行)EFAULT(sops指向的地址无效)EIDRM(信号量集已经删除)EINTR(当睡眠时接收到其他信号)EINVAL(信号量集不存在,或者semid无效)ENOMEM(使用了SEM_UNDO,但无足够的内存创建所需的数据结构)ERANGE(信号量值超出范围) 第一个参数是 阅读全文
posted @ 2013-01-15 16:44 冈萨雷斯 阅读(202) 评论(0) 推荐(0) 编辑
摘要: 系统调用:semctl();原型:int semctl(int semid,int semnum,int cmd,union semunarg);返回值:如果成功,则为一个正数。如果失败,则为-1:errno=EACCESS(权限不够)EFAULT(arg指向的地址无效)EIDRM(信号量集已经删除)EINVAL(信号量集不存在,或者semid无效)EPERM(EUID没有cmd的权利)ERANGE(信号量值超出范围) 系统调用semctl用来执行在信号量集上的控制操作。这和在消息队列中的系统调用msgctl是十分相似的。但这两个系统调用的参数略有不同。因为信号量一般是作为一个信号量集使用的, 阅读全文
posted @ 2013-01-15 16:44 冈萨雷斯 阅读(374) 评论(0) 推荐(0) 编辑
摘要: 可以使用系统调用semget()创建一个新的信号量集,或者存取一个已经存在的信号量集:系统调用:semget();原型:int semget(key_t key,int nsems,int semflg);返回值:如果成功,则返回信号量集的IPC标识符。如果失败,则返回-1:errno=EACCESS(没有权限)EEXIST(信号量集已经存在,无法创建)EIDRM(信号量集已经删除)ENOENT(信号量集不存在,同时没有使用IPC_CREAT)ENOMEM(没有足够的内存创建新的信号量集)ENOSPC(超出限制) 系统调用semget()的第一个参数是关键字值(一般是由系统调用ftok()返回 阅读全文
posted @ 2013-01-15 16:42 冈萨雷斯 阅读(307) 评论(0) 推荐(0) 编辑
摘要: 系统建立IPC通讯(如消息队列、共享内存时)必须指定一个ID值。通常情况下,该id值通过ftok函数得到。ftok原型如下:key_t ftok( char * fname, int id )fname就时你指定的文件名,id是子序号。在一般的UNIX实现中,是将文件的索引节点号取出,前面加上子序号得到key_t的返回值。如指定文件的索引节点号为65538,换算成16进制为0x010002,而你指定的ID值为38,换算成16 进制为0x26,则最后的key_t返回值为0x26010002。查询文件索引节点号的方法是: ls -i当删除重建文件后,索引节点号由操作系统根据当时文件系统的使用情况分 阅读全文
posted @ 2013-01-15 13:41 冈萨雷斯 阅读(104) 评论(0) 推荐(0) 编辑
摘要: #include<sys/types.h>#include<sys/ipc.h>#include<sys/msg.h>int msgrcv(int msqid, void *msgp, size_t msgsz, long msgtyp, int msgflg); //从消息队列读取信息参数: msgtyp: msgtyp = 0:收取队列中的第一条消息,任意类型。 msgtyp > 0:收取第一条 msgtyp 类型的消息。 msgtyp < 0:收取第一条最低类型(小于或等于 msgtyp 的绝对值)的消息。 其他参数参考msgsnd函数。 阅读全文
posted @ 2013-01-15 13:38 冈萨雷斯 阅读(758) 评论(0) 推荐(0) 编辑
摘要: #include<sys/types.h>#include<sys/ipc.h>#include<sys/msg.h>int msgsnd(int msqid, const void *msgp, size_t msgsz, int msgflg); //将消息送入消息队列参数: msqid:消息队列的标识符。 msgp:指向消息缓冲区的指针,此位置用来暂时存储发送和接收的消息,是一个用户可定义的通用结构,形态如下struct msgbuf { long mtype; /* 消息类型,必须 > 0 */ char mtext[1]; /* 消息文本 * 阅读全文
posted @ 2013-01-15 13:36 冈萨雷斯 阅读(511) 评论(0) 推荐(0) 编辑
摘要: #include<sys/types.h>#include<sys/ipc.h>#include<sys/msg.h>int msgctl (int msqid, int cmd, struct msqid_ds *buf); //消息队列属性控制参数: msqid:消息队列的标识符。 cmd:执行的控制命令,即要执行的操作。包括以下选项: IPC_STAT:读取消息队列属性。取得此队列的msqid_ds 结构,并将其存放在buf指向的结构中。 IPC_SET :设置消息队列属性。 IPC_RMID:删除消息队列。 IPC_INFO:读取消息队列基本情况。此 阅读全文
posted @ 2013-01-15 13:35 冈萨雷斯 阅读(404) 评论(0) 推荐(0) 编辑
摘要: #include<sys/types.h>#include<sys/ipc.h>#include<sys/msg.h>int msgget(key_t key, int msgflg); //创建消息队列参数: key:消息队列关联的键。为IPC_PRIVATE时表示创建自己的消息队列 msgflg:消息队列的建立标志和访问权限。msgflg 的低位用来确定消息队列的访问权限。 IPC_CREAT:如果 key不存在,创建 IPC_EXCL:如果 key 存在,返回失败 IPC_NOWAIT:如果需要等待,直接返回错误 如果单独使用IPC_CREAT,则ms 阅读全文
posted @ 2013-01-15 13:29 冈萨雷斯 阅读(407) 评论(0) 推荐(0) 编辑
摘要: 一、要搞清楚fork的执行过程,就必须先讲清楚操作系统中的“进程(process)”概念。一个进程,主要包含三个元素:一个可以执行的程序;和该进程相关联的全部数据(包括变量,内存空间,缓冲区等等);程序的执行上下文(execution context)。 不妨简单理解为,一个进程表示的,就是一个可执行程序的一次执行过程中的一个状态。操作系统对进程的管理,典型的情况,是通过进程表完成的。进程表中的每一个表项,记录的是当前操作系统中一个进程的情况。对于单 CPU的情况而言,每一特定时刻只有一个进程占用 CPU,但是系统中可能同时存在多个活动的(等待执行或继续执行的)进程。一个称为“程序计数器(pr 阅读全文
posted @ 2013-01-15 10:00 冈萨雷斯 阅读(302) 评论(0) 推荐(0) 编辑