UNIX系统开发-系统调用-进程间高级通信
基本上所有的系统调用成功时返回0或正数,失败时返回负值。
消息通信
每个消息队列都有一个msqid_ds类型的控制结构,该结构中包括对消息队列的访问权限,其数据结构如下:unix系统主要用于
struct msqid_ds
{
struct ipc_perm msg_perm; /*操作权限结构 */
struct msg msg_first; /*指向消息队列的第一个结构*/
struct msg msg_last; /*指向消息队列的最后一个结构*/
ushort msg_cbytes; /*队列中当前字节数*/
ushort msg_qnum; /*队列中消息数*/
ushort msg_qbytes; /*队列可容纳的最大字节数*/
ushort msg_lspid; /*最后发送消息的进程号*/
ushort msg_lrpid; /*最后接收消息的进程号*/
ushort msg_stime; /*最后发送时间*/
ushort msg_rtime; /*最后接收时间*/
time_t msg_ctime; /*消息队列最后修改时间*/
};
msgget系统调用的格式
#include <sys/types.h>
#include <sys/ipc.h>
#include <sys/msg.h>
int msgget(key,msgflg)
key_t key; /*消息队列关键字*/
int msgflags; /*创建标志和访问方式(类似于文件访问权限)*/
参数与功能说明:
msgflg低9位类似于文件访问权限的低9位,其他位指明消息队列的建立方式:
若指定的关键字消息队列不存在,msgflg&IPC_CREAT为真,则为他建立一个新的消息队列; msgflg&IPC_CREAT为假,返回-1。若指定的关键字消息队列存在,则返回该消息队列的描述符。
若msgflg&IPC_CREAT&IPC_EXCL为真,若指定的关键字消息队列不存在,失败返回-1;否则正常返回。
若key等于IPC_PRIVATE,则msgget调用总是成功的。
msgsnd系统调用的格式
#include <sys/types.h>
#include <sys/ipc.h>
#include <sys/msg.h>
int msgsnd(msqid,msgp,msgsz,msgflg)
int msqid; /*消息队列关键字*/
struct msgbuf msgp; /指向消息缓冲的指针*/
int msgsz,msgflg; /*消息大小、发送标志*/
参数与功能说明:
发送一个消息到相关的消息队列上。其中msgp指向消息结构,他的基本格式是:
struct msgbuf
{
int mtype; /*消息类型*/
char mtext[];/*消息正文*/
}
msgflg具体含义为:
msgflg&IPC_NOWAIT为真,那么如果操作条件不满足,则出错返回-1;
msgflg&IPC_NOWAIT为假,那么如果操作条件不满足,则睡眠等待。;
msgrcv系统调用的格式
#include <sys/types.h>
#include <sys/ipc.h>
#include <sys/msg.h>
int msgrcv(msqid,msgp,msgsz,msgtyp,msgflg)
int msqid; /*消息队列关键字*/
struct msgbuf msgp; /指向消息缓冲的指针*/
int msgsz,msgflg; /*消息大小、发送标志*/
long msgtyp; /*消息接收类型*/
参数与功能说明:
从消息队列中接收一个消息。其中msgp指向消息结构,他的基本格式是:
struct msgbuf
{
int mtype; /*消息类型*/
char mtext[];/*消息正文*/
}
msgflg具体含义为:
msgflg&IPC_NOWAIT为真,那么如果接收的消息没有到达,则出错返回-1;
msgflg&IPC_NOWAIT为假,那么如果接收的消息没有到达,则睡眠等待。;
msgflg&MSG_NOERROR为真,那么如果msgrcv中的msgsz参数小于所接收的消息正文的长度,则本次可以接收msgsz字节,并且不把这种情况视为出错。
msgtyp的取值及含义为:]
msgtyp>0时,接收消息队列中类型为msgtyp的第一个消息。
msgtyp=0时,接收消息队列中的第一个消息。
msgtyp<0时,接收消息队列中类型值msgtyp最小且<=|mstyp|的第一个消息。
msgctl系统调用的格式
#include <sys/types.h>
#include <sys/ipc.h>
#include <sys/msg.h>
int msgctl(msqid,cmd,buf)
int msqid; /*消息队列关键字*/
int cmd ; /控制命令*/
struct msqid_ds *buf; /*指向消息队列控制块的指针*/
参数与功能说明:
根据控制命令cmd对msqid消息队列进行相应的控制。参数buf是指向用户程序地址空间中一个msqid_ds结构的指针,以便将相关控制信息在核心和用户地址空间之间进行传送。
cmd控制命令的取值及含义如下:
IPC_STAT:将指定消息队列的控制块信息写到buf结构中。
IPC_SET:将buf中信息写到指定消息队列的控制块中。
IPC_RMID:删除指定消息队列,释放消息队列标志符。
共享内存段
每个共享内存段都有一个shmid_ds类型的控制结构,该结构中包括对共享内存段的访问权限,其数据结构如下:
struct shmid_ds
{
struct ipc_perm shm_perm; /*操作权限结构 */
int shm_segsz; /*以字节为单位的共享段大小*/
struct region *shm_reg; /*指向共享段的指针*/
char pad[4]; /*系统使用*/
ushort shm_lpid; /*最后使用shmop的时间*/
ushort shm_cpid; /*创建进程的id*/
ushort shm_nattch; /*系统使用*/
ushort shm_cnattc; /*系统使用*/
time_t shm_atime; /*最后使用shmat的时间*/
time_t shm_dtime; /*最后使用shmdt的时间*/
time_t shm_ctime; /*共享内存段最后修改时间*/
};
shmget系统调用的格式
#include <sys/types.h>
#include <sys/ipc.h>
#include <sys/shm.h>
int shmget(key,size,shmflg)
key_t key; /*共享内存段关键字*/
int size; /*共享内存段大小*/
int shmflag; /*创建标志和访问方式(类似于文件访问权限)*/
参数与功能说明:
shmflg低9位类似于文件访问权限的低9位,其他位指明消息队列的建立方式:
若指定的关键字消息队列不存在,shmflg&IPC_CREAT为真,则为他建立一个新的消息队列; shmflg&IPC_CREAT为假,返回-1。若指定的关键字消息队列存在,则返回该消息队列的描述符。
若shmflg&IPC_CREAT&IPC_EXCL为真,若指定的关键字消息队列不存在,失败返回-1;否则正常返回。
若key等于IPC_PRIVATE,则shmget调用总是成功的。
shmat系统调用的格式
#include <sys/types.h>
#include <sys/ipc.h>
#include <sys/shm.h>
int shmat(shmid,addr,shmflg)
int shmid; /*共享内存段标志符*/
char *addr; /*用户指定的一个进程虚拟空间的地址,该共享内存段附在这个地址之后*/
int shmflg; /*创建标志和访问方式(类似于文件访问权限)*/
参数与功能说明:
shmat调用将标志符为shmid的共享内存段映射到进程的虚拟数据空间中,其首地址与参数addr有关。Shmflg为映射标志,说明以何种方式映射及映射到何处。Shmat正常返回该共享内存段在进程虚拟数据空间中的首地址,并且共享内存段访问计数加一;错误返回-1。
shmdt系统调用的格式
#include <sys/types.h>
#include <sys/ipc.h>
#include <sys/shm.h>
int shmdt(addr)
char *addr; /*用户指定的一个进程虚拟空间的地址,该共享内存段附在这个地址之后*/
参数与功能说明:
shmdt调用将共享内存段脱离到进程的虚拟数据空间中,参数addr是shmat的返回值。shmdt正常返回0,并且共享内存段访问计数减一;错误返回-1。
shmctl系统调用的格式
#include <sys/types.h>
#include <sys/ipc.h>
#include <sys/shm.h>
int shmctl(shmid,cmd,buf)
int shmid; /*共享内存段关键字*/
int cmd ; /控制命令*/
struct shmid_ds *buf; /*指向共享内存段控制块的指针*/
参数与功能说明:
根据控制命令cmd对shmid所指定的共享内存段进行相应的控制。参数buf是指向用户程序地址空间中一个shmid_ds结构的指针,以便将相关控制信息在核心和用户地址空间之间进行传送。
cmd控制命令的取值及含义如下:
IPC_STAT:将指定共享内存段的控制块信息写到buf结构中。
IPC_SET:将buf中信息写到指定共享内存段的控制块中。
IPC_RMID:删除指定共享内存段,释放共享内存段标志符。
SHM_LOCK:将共享内存段锁定在内存,禁止换出(只有特权用户才能这样用)
SHM_UNLOCK:将共享内存段解锁,允许换出(只有特权用户才能这样用)

版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。