exit(4);
}
msgctl(wmsqid,IPC_RMID,(struct msqid *)NULL);
2.17.shmat() 联接共享内存的操作
功能:联接共享内存的操作. 语法:
#include
void *shmat(shmid,shmaddr,shmflg) int shmid;
void *shmaddr; int shmid;
说明:将由shmid指示的共享内存联接到调用进程的数据段中.被联接的 段放在地址,该地址由以下准则指定:
. 若shmaddr等于(void *)0,则段联接到由系统选择的第一个可 用的地址上.
. 若shmaddr不等于(void *)0同时(shmflg&SHM_RND)值为真,则 段联接到由(shmaddr-(shmaddr%SHMLBA))给出的地址上. . 若shmaddr不等于(void *)0同时(shmflg&SHM_RND)值为假,则 段联接到由shmaddr指定的地址上.
若(shmflg&sSHM_RDONLY)为真并且调用进程有读允许,则被联接 的段为只读;否则,若值不为真且调用进程有读写权限,则被联接 的段为可读写的.
返回值:若调用成功则返回被联接的共享内存段在数据段上的启始地址. 否则返回值为-1.
2.18.shmdt() 断开共享内存联接的操作
功能:断开共享内存联接的操作. 语法:
#include
说明:本系统调用将由shmaddr指定的共享内存段从调用进程的数据段 脱离出去.
返回值:若调用成功则返回值为0,否则返回值为-1.
2.19.shmget() 取得共享内存段
功能:取得共享内存段 语法:
#include
int shmget(key,size,shmflg) key_t key;
int size,shmflg;
说明:本系统调用返回key相关的共享内存标识符.
共享内存标识符和相关数据结构及至少size字节的共享内存段能 正常创建,要求以下事实成立:
. 参数key等于IPC_PRIVATE.
. 参数key没有相关的共享内存标识符,同时(shmflg&IPC_CREAT) 值为真.
共享内存创建时,新生成的共享内存标识相关的数据结构被初始 化如下:
. shm_perm.cuid和shm_perm.uid设置为调用进程的有效UID. . shm_perm.cgid和shm_perm.gid设置为调用进程的有效GID. . shm_perm.mode访问权限比特位设置为shmflg访问权限比特位. . shm_lpid,shm_nattch,shm_atime,shm_dtime设置为0. . shm_ctime设置为当前系统时间. . shm_segsz设置为0.
返回值:若调用成功则返回一个非0值,称为共享内存标识符,否则返回 值为-1.
2.20.shmctl() 共享内存控制操作
功能:共享内存控制操作. 语法:
#include
int shmctl(shmid,cmd,buf) int shmid,cmd;
struct shmid_ds *buf;
说明:本系统调用提供一系列共享内存控制操作.操作行为由cmd指定. 以下为cmd的有效值: . IPC_STAT:将shmid相关的数据结构中各个元素的当前值放入由 buf指向的结构中.
. IPC_SET:将shmid相关的数据结构中的下列元素设置为由buf指 向的结构中的对应值.
shm_perm.uid
shm_perm.gid shm_perm.mode
本命令只能由有效UID等于shm_perm.cuid或shm_perm.uid的 进程或有效UID有合适权限的进程操作.
. IPC_RMID:删除由shmid指示的共享内存.将它从系统中删除并 破坏相关的数据结构.
本命令只能由有效UID等于shm_perm.cuid或shm_perm.uid的 进程或有效UID有合适权限的进程操作. 返回值:若调用成功则返回0,否则返回-1. 例子:本例包括上述所有共享内存操作系统调用: #include
shmctl(shmid,IPC_RMID,0); exit(0); }
main() {
int *pint;
char *addr1,*addr2; extern char *shmat();
extern cleanup();
for (i=0;i<20;i++) signal(i,cleanup); shmid=shmget(SHMKEY,128*K,0777|IPC_CREAT); addr1=shmat(shmid,0,0); addr2=shmat(shmid,0,0);
printf(\ pint=(int*)addr1;
for (i=0;i<256;i++) *pint++=i; pint=(int*)addr1; *pint=256; pint=(int*)addr2; for (i=0;i<256;i++)
printf(\ shmdt(addr1); shmdt(addr2); pause(); }
2.21.semctl() 信号量控制操作
功能:信号量控制操作. 语法:
#include
int semctl(semid,memnum,cmd,arg) int semid,semnum,cmd; union semun { int val;
struct semid_ds *buf; ushort *array; }arg;
说明:本系统调用提供了一个信号量控制操作,操作行为由cmd定义,这 些命令是对由semid和semnum指定的信号量做操作的.每个命令都 要求有相应的权限级别:
. GETVAL:返回semval的值,要求有读权限. . SETVAL:设置semval的值到arg.val上.此命令成功执行后, semadj的值对应的所有进程的信号量全部被清除,要求有修 改权限.
. GETPID:返回sempid的值,要求有读权限. . GETNCNT:返回semncnt的值,要求有读权限. . GETZCNT:返回semzcnt的值,要求有读权限.
以下命令在一组信号量中的各个semval上操作:
. GETALL:返回每个semval的值,同时将各个值放入由arg.array 指向的数组中.当此命令成功执行后,semadj的值对应的所有 进程的信号量全部被清除,要求有修改权限.
. SETALL:根据由arg.array指向的数组设置各个semval值.当此 命令成功执行后,semadj的值对应的所有进程的信号量全部 被清除,要求有修改权限.
以下命令在任何情况下都是有效的: . IPC_STAT:将与semid相关的数据结构的各个成员的值放入由 arg.buf指向的结构中.要求有读权限.
. IPC_SET:设置semid相关数据结构的如下成员,设置数据从 arg.buf指向的结构中读取: sem_perm.uid sem_perm.gid
sem_perm.mode
本命令只能由有效UID等于sem_perm.cuid或sem_perm.uid的 进程或有效UID有合适权限的进程操作.
. IPC_RMID:删除由semid指定的信号量标识符和相关的一组信号 量及数据结构.本命令只能由有效UID等于sem_perm.cuid或
sem_perm.uid的进程或有效UID有合适权限的进程操作. 返回值:若调用成功,则根据cmd返回以下值: GETVAL:semval的值. GETPID:sempid的值. GETNCNT:semncnt的值. GETZCNT:semzcnt的值. 其他:0.
若调用失败则返回-1.
2.22.semget() 取得一组信号量
功能:取得一组信号量. 语法:
#include
int semget(key,nsems,semflg) key_t key;
int nsems,semflg;
说明:返回和key相关的信号量标识符.
若以下事实成立,则与信号量标识符,与之相关的semid_ds数据结 构及一组nsems信号量将被创建: . key等于IPC_PRIVATE.
. 系统内还没有与key相关的信号量,同时(semflg&IPC_CREAT) 为真.
创建时新的信号量相关的semid_ds数据结构被初始化如下: . 在操作权限结构,sem_perm.cuid和sem_perm.uid设置等于调用 进程的有效UID.
. 在操作权限结构,sem_perm.cgid和sem_perm.gid设置等于调用 进程的有效GID.
. 访问权限比特位sem_perm.mode设置等于semflg的访问权限比 特位.
. sem_otime设置等于0,sem_ctime设置等于当前系统时间.
返回值:若调用成功,则返回一非0值,称为信号量标识符;否则返回-1.
2.23.semop() 信号量操作
功能:信号量操作. 语法:
#include
int semop(semid,sops,nsops)