⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 多进程编程的相关知识总结(一).txt

📁 本资源中含有有关LINUX进程通信的一些文章
💻 TXT
📖 第 1 页 / 共 5 页
字号:

             前所述,包括消息类型和消息正文.msgsz为可接收的消息正文的 
             字节数.若接收到的消息正文的长度大于msgsz,则会被截短到 
             msgsz字节为止(当消息标志msgflg&MSG_NOERROR为真时),截掉的 

             部份将被丢失,而且不通知消息发送进程. 
             msgtyp指定消息类型: 
             . 为0则接收消息队列中第一个消息. 
             . 大于0则接收消息队列中第一个类型为msgtyp的消息. 
             . 小于0则接收消息队列中第一个类型值不小于msgtyp绝对值且 
               类型值又最小的消息. 
             msgflg指定操作行为: 
             . 若(msgflg&IPC_NOWAIT)是真的,调用进程会立即返回,若没有 
               接收到消息则返回值为-1,errno设置为ENOMSG. 
             . 若(msgflg&IPC_NOWAIT)不是真的,则调用进程会被挂起直到下 

               面情况之一发生: 
                 * 队列中的消息的类型是有效的. 
                 * 消息队列标志被系统删除.系统调用返回-1. 
                 * 调用进程接收到一个未被忽略的中断信号,调用进程继续 
                   执行或被终止. 
             调用成功后,对应指定的消息队列的相关结构做如下动作: 
             . 消息数(msg_qnum)减1. 
             . 消息队列最近接收进程号(msg_lrpid)改为调用进程号. 
             . 消息队列接收时间(msg_rtime)改为当前系统时间. 
             以上信息可用命令ipcs -a看到. 
        返回值:调用成功则返回值等于接收到实际消息正文的字节数. 
             不成功则返回-1.
    15.msgctl() 
        功能:消息控制操作 
        语法:#include <sys/types.h> 
             #include <sys/ipc.h> 
             #include <sys/msg.h> 
             int msgctl(msqid,cmd,buf) 
             int msqid,cmd; 
             struct msqid_ds *buf; 
        说明:本系统调用提供一系列消息控制操作,操作动作由cmd定义,以下 
             cmd定义值表明了各操作动作的定义. 
             . IPC_STAT:将msqid相关的数据结构中各个元素的当前值放入由 

                 buf指向的结构中. 
             . IPC_SET:将msqid相关的数据结构中的下列元素设置为由buf指 

                 向的结构中的对应值. 
                 msg_perm.uid 
                 msg_perm.gid 
                 msg_perm.mode 
                 msg_qbytes 
                 本命令只能由有效UID等于msg_perm.cuid或msg_perm.uid的 

                 进程或有效UID有合适权限的进程操作.只有具有合适权限的 

                 用户才能增加msg_qbytes的值. 
             . IPC_RMID:删除由msqid指示的消息队列.将它从系统中删除并 
                 破坏相关的数据结构. 
                 本命令只能由有效UID等于msg_perm.cuid或msg_perm.uid的 

                 进程或有效UID有合适权限的进程操作. 
        返回值:调用成功则返回值为0,否则为-1. 
    16.msgget() 
        功能:取得一个消息队列. 
        语法:#include <sys/types.h> 
             #include <sys/ipc.h> 
             #include <sys/msg.h> 
             int msgget(key,msgflg) 
             key_t key; 
             int msgflg; 
        说明:本系统调用返回与参数key相关的消息队列的标识符. 
             若以下事实成立,则与消息队列相关的标识符和数据结构将被创 
             建出来:
             . 若参数key等于IPC_PRIVATE. 
             . 若参数key没有一个已存在的消息队列标识符与之相关,同时值 

               (msgflg&IPC_CREAT)为真. 
             创建消息队列时,与新的消息队列标识符相关的数据结构将被初 
             始化为如下: 
             . msg_perm.cuid和msg_perm.uid设置为调用进程的有效UID. 
             . msg_perm.cgid和msg_perm.gid设置为调用进程的有效GID. 
             . msg_perm.mode访问权限比特位设置为msgflg访问权限比特位. 

             . msg_qnum,msg_lspid,msg_lrpid,msg_stime,msg_rtime设置为0
. 
             . msg_ctime设置为当前系统时间. 
             . msg_qbytes设置为系统允许的最大值. 
        返回值:调用成功则返回一非0值,称为消息队列标识符;否则返回值为-1
. 
        例子:本例将包括上述所有消息队列操作的系统调用: 
             #define RKEY 0x9001L    /*读消息队列的KEY值*/ 
             #define WKEY 0x9002L    /*写消息队列的KEY值*/ 
             #define MSGFLG 0666     /*消息队列访问权限*/ 
             #define IPC_WAIT 0      /*等待方式在include文件中未定义*/

             int rmsqid;             /*读消息队列标识符*/ 
             int wmsqid;             /*写消息队列标识符*/ 
             struct msgbuf { 
                 long mtype; 
                 char mtext[200]; 
             } buf; 
             /*若读消息队列已存在就取得标识符,否则则创建并取得标识符*/

             if ((rmsqid=msgget(RKEY,MSGFLG|IPC_CREAT))<0) { 
printf("get read message queue failed\n"); 
exit(1); 
} 
/*若写消息队列已存在则失败,若不存在则创建并取得标识符*/ 
if ((wmsqid=msgget(WKEY, 
MSGFLG|IPC_CREAT|IPC_TRUNC))<0) { 
printf("get write message queue failed\n"); 
exit(2); 
} 
/*接收所有类型的消息*/ 
if (msgrcv(rmsqid,&buf,sizeof(struct msgbuf)-sizeof(long)
, 
0L,IPC_WAIT)>0) 
                 printf("get %ld type message from queue:%s\n", 
                        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 <sys/types.h> 
             #include <sys/ipc.h> 
             #include <sys/shm.h> 
             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 <sys/types.h> 
             #include <sys/ipc.h>
             #include <sys/shm.h> 
             void *shmdt(shmaddr) 
             void *shmaddr; 
        说明:本系统调用将由shmaddr指定的共享内存段从调用进程的数据段 
             脱离出去. 
        返回值:若调用成功则返回值为0,否则返回值为-1. 
    19.shmget() 
        功能:取得共享内存段 
        语法:#include <sys/types.h> 
             #include <sys/ipc.h> 
             #include <sys/shm.h> 
             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 <sys/types.h> 
             #include <sys/ipc.h> 
             #include <sys/shm.h> 
             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 <sys/types.h> 
             #include <sys/ipc.h> 
             #include <sys/shm.h> 
             #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 <sys/types.h> 
             #include <sys/ipc.h> 
             #include <sys/sem.h> 
             int semctl(semid,memnum,cmd,arg) 
             int semid,semnum,cmd; 
             union semun { 
                   int val; 
                   struct semid_ds *buf; 
                   ushort *array; 
             }arg; 
        说明:本系统调用提供了一个信号量控制操作,操作行为由cmd定义,这 
             些命令是对由semid和semnum指定的信号量做操作的.每个命令都 

             要求有相应的权限级别: 

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -