手机站
网通分站
电信主站
密 码:
用户名:
当前位置 : 主页>网站运营>建站经验>列表

Unix 多进程编程

来源:互联网 作者:west263.com 时间:2008-04-16
西部数码-全国虚拟主机10强!40余项虚拟主机管理功能,全国领先!双线多线虚拟主机南北访问畅通无阻!免费赠送企业邮局,.CN域名,自助建站480元起,免费试用7天,满意再付款! P4主机租用799元/月.月付免压金!

buf.mtype,buf.mtext);
else {
printf("get message failed\n");
exit(3);
}
buf.mtype=3L
if (msgsnd(wmsqid,&buf,sizeof(struct msgbuf)-sizeof(long),
IPC_NOWAIT)>0)
printf("send message OK\n");
else {
printf("send message failed\n");
exit(4);
}
msgctl(wmsqid,IPC_RMID,(struct msqid *)NULL);
17.shmat()
功能:联接共享内存的操作.
语法:#include
#include
#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.
18.shmdt()
功能:断开共享内存联接的操作.
语法:#include
#include
#include
void *shmdt(shmaddr)
void *shmaddr;
说明:本系统调用将由shmaddr指定的共享内存段从调用进程的数据段
脱离出去.
返回值:若调用成功则返回值为0,否则返回值为-1.
19.shmget()
功能:取得共享内存段
语法:#include
#include
#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.
20.shmctl()
功能:共享内存控制操作.
语法:#include
#include
#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
#include
#include
#define SHMKEY 74
#define K 1024
int shmid;
cleanup()
{
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("addr1 0x%x addr2 0x%x\n",addr1,addr2);
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("index %d\tvalue%d\n",i,*pint );
shmdt(addr1);
shmdt(addr2);
pause();
}
21.semctl()
功能:信号量控制操作.
语法:#include
#include
#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指向的结构中.需要有读权限.

文章整理:西部数码--专业提供域名注册虚拟主机服务
http://www.west263.com
以上信息与文章正文是不可分割的一部分,如果您要转载本文章,请保留以上信息,谢谢!