西安邮电大学Linux高级编程进程间通信

上传人:痛*** 文档编号:131998427 上传时间:2022-08-07 格式:PPTX 页数:73 大小:686.04KB
收藏 版权申诉 举报 下载
西安邮电大学Linux高级编程进程间通信_第1页
第1页 / 共73页
西安邮电大学Linux高级编程进程间通信_第2页
第2页 / 共73页
西安邮电大学Linux高级编程进程间通信_第3页
第3页 / 共73页
资源描述:

《西安邮电大学Linux高级编程进程间通信》由会员分享,可在线阅读,更多相关《西安邮电大学Linux高级编程进程间通信(73页珍藏版)》请在装配图网上搜索。

1、第5章System V进程间通信 System VIPC基础基础 消息队列消息队列 信号量通信机制信号量通信机制 共享内存共享内存 为了提供与其他系统的兼容性,Linux也支持三种System V的进程间通信机制:消息队列、信号量和共享内存消息队列、信号量和共享内存,Linux对这些机制的实施大同小异。我们把信号量、消息队列和共享内存统称System V IPC对象。就像每个文件都有一个打开文件号一样,每个对象也都有唯一的识别号,进程可以通过系统调用传递的识别号来存取这些对象。与文件的存取一样,对这些对象的存取也要验证存取权限,System V IPC可以通过系统调用对对象的创建者设置这些对象

2、的存取权限。2022-8-72 ipcs 命令Ipcs命令用于显示消息队列、共享内存、信号量的信息。q 显示消息队列 s 显示信号量m 显示共享内存 a 详细信息对每一个资源,这个命令会显示:TYPE 包括信息队列(q),共享内存(m),或者信号量(s)。ID 资源条目的唯一的表示号KEY应用程序存取资源使用的参数。MODE 存取模式和许可权限的标记OWNER and GROUP 登录名和用户属主的组号2022-8-73key值和ID值 Linux系统为每个IPC机制都分配了唯一的ID,所有针对该IPC机制的操作都使用对应的ID。因此,通信的双方都需要通过某个办法来获取ID值。显然,创建者根据

3、创建函数的返回值可获取该值,但另一个进程如何实现呢?由于Linux两个进程不能随意访问对方的空间(一个特殊是,子进程可以继承父亲进程的数据,实现父亲进程向子进程的单向传递),也就不能够直接获取这一ID值。为解决这一问题,IPC在实现时约定使用key值做为参数创建,如果在创建时使用相同的key值将得到同一个IPC对象的ID(即一方创建,另一方获取的是ID),这样就保证了双方可以获取用于传递数据的IPC机制ID值。2022-8-74 ftok extern key_t ftok(_const char*_pathname,int _proj_id);此函数有两个参数,pathname为文件路径名,

4、可以是特殊文件(例如目录文件),也可以是当前目录“.”,而通常也是设置此参数为当前目录,因为当前目录一般都是存在的,且不会被立即删除。第二个参数为一个int型变量。2022-8-75例:ftok的使用#include#include main()key_t key;key=ftok(.,1);printf(the key is%xn,key);2022-8-7人民邮电出版社出版杨宗德编著6 ftok ftok函数创建key值过程中使用了该文件属性的st_dev和st_ino。具体构成如下:key值的第31-24为ftok()第二个参数的低8位;key值的第23-16为该文件的st_dev属性的

5、低8位;key值的第15-0为该文件的st_ino属性的低16位;因此,如果使用相同的文件路径及整数,得到的key值是唯一的,而唯一的key值创建某类IPC机制时将得到同一个IPC机制(但如果使用相同的key值分别创建一个消息队列和一个信号量,两者没有联系),而文件路径的访问对两个进程来说很容易统一,因此,便捷的实现了两进程通信机制的确定。2022-8-77例:ftok函数和参数的关系#include#include#include#include main(int argc,char*argv)key_t key;int i;struct stat buf;if(argc!=3)printf

6、(error usagen);return 1;i=atoi(argv2);2022-8-78例:ftok函数和参数的关系if(stat(argv1,&buf)=-1)perror(stat);exit(EXIT_FAILURE);printf(file st_dev=%xn,buf.st_dev);printf(file st_ino=%xn,buf.st_ino);printf(number=%xn,i);key=ftok(argv1,i);printf(key=0 x%x,key);2022-8-79第5章System V进程间通信 System VIPC基础基础 消息队列消息队列 信号

7、量通信机制信号量通信机制 共享内存共享内存 消息队列的基本概念消息队列就是一个消息的链表,是一系列保存在内核中的消息的列表。用户进程可以向消息队列添加消息,也可以从消息队列读取消息。消息队列与管道通信相比,其优势是对每一个消息指定特定消息类型,接收的时候不需要按队列次序,而是可以根据自定义条件接收特定类型的消息。可以把消息看作一个记录,具有特定的格式以及特定的优先级。对消息队列有写权限的进程可以向消息队列中按照一定的规则添加新消息;对消息队列有读权限的进程则可以从消息队列中读取消息。2022-8-711消息队列属性2022-8-712消息struct msg结构体/come from/usr/

8、src/kernels/uname r/inlcude/linux/msg.h/*one msg_msg structure for each message*/struct msg_msgstruct list_head m_list;long m_type;int m_ts;/*message test size */struct msg_msgseg*next;void*security;/*the actual message follows immediately*/;2022-8-713消息队列2022-8-714对消息队列的说明对消息队列的限定:/come from/usr/in

9、clude/linux/msg.h#define MSGMNI 16 /*=IPCMNI*/*max#of msg queue identifiers*/#define MSGMAX 8192 /*=INT_MAX*/*max size of message(bytes)*/#define MSGMNB 16384 /*=INT_MAX*/*default max size of a message queue */不同的系统限制值可以通过msgctl函数使用IPC_INFO参数获得。2022-8-715消息队列常用的系统调用函数函数功能功能ftok根据文件路径和参数生成标准keymsgget

10、创建或打开消息队列msgsnd添加消息msgrcv读取消息msgctl控制消息队列2022-8-716创建消息队列 extern int msgget(key_t _key,int _msgflg);第一个参数key为由ftok创建的key值。第二个参数_msgflg的低位用来确定消息队列的访问权限。如0770,为文件的访问权限类型。此外,还可以附加以下参数值。这些值可以与基本权限以或的方式一起使用。/come from/usr/include/bit/ipc.h/*resource get request flags*/#define IPC_CREAT 00001000 /*create

11、if key is nonexistent*/#define IPC_EXCL 00002000/*fail if key exists*/#define IPC_NOWAIT 00004000/return error on wait*/2022-8-717msgget返回说明:成功执行时,返回消息队列标识值。失败返回-1,errno被设为以下的某个值,有时也会返回0,这个时候也是可以正常使用的。EACCES:指定的消息队列已存在,但调用进程没有权限访问它,而且不拥有CAP_IPC_OWNER权限EEXIST:key指定的消息队列已存在,而msgflg中同时指定IPC_CREAT和IPC_E

12、XCL标志ENOENT:key指定的消息队列不存在,同时msgflg中不指定IPC_CREAT标志ENOMEM:需要建立消息队列,但内存不足ENOSPC:需要建立消息队列,但已达到系统的最大消息队列容量2022-8-718例:创建消息队列#include#include#include int main()key_t key;key=ftok(.,1);printf(the key is%xn,key);int id;id=msgget(key+1,IPC_CREAT|0666);printf(id=%dn,id);system(“ipcs”);2022-8-7人民邮电出版社出版杨宗德编著19

13、消息队列属性控制 extern int msgctl(int _msqid,int _cmd,struct msqid_ds*_ buf);第一个参数_msqid为消息队列标识符,该值为使用msgget函数创建消息队列的返回值。第二个参数_cmd为执行的控制命令,即要执行的操作。包括以下选项:/come from/usr/include/linux/ipc.h/*Control commands used with semctl,msgctl and shmctl see also specific commands in sem.h,msg.h and shm.h*/#define IPC_

14、RMID 0 /*remove resource*/#define IPC_SET 1 /*set ipc_perm options*/#define IPC_STAT 2 /*get ipc_perm options*/#define IPC_INFO 3 /*see ipcs*/2022-8-720例:删除消息队列#include#include#include int main()key_t key;int id;key=ftok(.,1);id=msgget(key+1,IPC_CREAT|0666);printf(id=%dn,id);msgctl(id,IPC_RMID,NULL)

15、;sytem(“ipcs”);2022-8-7人民邮电出版社出版杨宗德编著21发送信息到消息队列 extern int msgsnd(int _msqid,_const void*_msgp,size_t _msgsz,int _msgflg)第一个参数msqid为指定的消息队列标识符(由msgget生成的消息队列标识符),即将消息添加到那个消息队列中。第二个参数msgp为指向的用户定义缓冲区。第三个参数为接收信息的大小,其数据类型为size_t,即unsigned int类型。其大小为0到系统对消息队列的限定值。第四个参数用来指定在达到系统为消息队列锁定的界限(如达到字数限制)时应采取的操作

16、。2022-8-722发送信息到消息队列(2)第二个参数其定义如下:/come from/usr/include/linux/msg.h/*message buffer for msgsnd and msgrev calls*/struct msgbuflong mtype;/*type of message */char mtext1;/*message text*/mtype是一个正整数,由产生消息的进程生成,用于表示消息的类型,因此,接收进程可以用来进行消息选择(消息队列在存储信息时是按发送的先后顺序放置的)。mtext是文本内容,即消息内容,此处大小为1,显然不够用,在使用时自己重新定

17、义此结构。2022-8-723发送信息到消息队列(3)第四个参数用来指定在达到系统为消息队列锁定的界限(如达到字数限制)时应采取的操作。:如果设置为IPC_NOWAIT,如果需要等待,则不发送消息并且调用进程立即返回错误信息EAGAIN.如果设置为0,则忽略标志位。成功调用后,此函数将返回0,否则返回-1,同时将对消息队列msqid数据结构的成员执行下列操作:msg_qnum以1为增量递增。msg_lspid设置为调用进程的进程ID。msg_stime设置为当前时间。2022-8-724从消息队列接收信息extern int msgrev(int _msqid,void*_msgp,size_

18、t _msgsz,long int _msgtyp,int _msgflg);此函数从与msqid指定的消息队列标识符相关联的队列中读取消息,并将其放置到msgp指向的结构中。第一个参数为读的对象,即从哪个消息队列获得消息。第二个参数为一个临时消息数据结构,用来保存读取的信息。其定义与发送信息的第二个参数相同。第三个参数msgsz指定mtext的大小(以字节为单位)。如果收到的消息大于msgsz,并且msgflg&MSG_NOERROR为真,则将该消息截至msgsz字节,消息的截断部分将丢失,并且不向调用进程提供截断的提示2022-8-725从消息队列接收信息(2)第四个参数msgtyp指定请

19、求的消息类型:msgtyp=0 收到队列中的第一条消息,任意类型。msgtyp0 收到第一条msgtyp类型的消息。msgtyp0收到第一条最低类型(小于或等于msgtyp的绝对值)的消息。第五个参数msgflg指定所需类型消息不在队列上时将要采取的操作。0,表示忽略;IPC_NOWAIT,如果消息队列为空,则返回一个ENOMSG,并将控制权交回调用函数的进程。2022-8-726消息队列应用实例#include#include#include#include#include#include#include struct msgmbuflong msg_type;char msg_text51

20、2;2022-8-727消息队列应用实例 int main()int qid;key_t key;int len;struct msgmbuf msg;if(key=ftok(.,a)=-1)perror(ftok);exit(EXIT_FAILURE);if(qid=msgget(key,IPC_CREAT|0666)=-1)perror(msgget);exit(EXIT_FAILURE);2022-8-728消息队列应用实例 printf(ID of the queue is:%dn,qid);puts(please input the mssage:);if(fgets(&msg)-m

21、sg_text,512,stdin)=NULL)puts(no message!);exit(EXIT_FAILURE);msg.msg_type=getpid();len=strlen(msg.msg_text);if(msgsnd(qid,&msg,len,0)0)perror(msgsnd);exit(EXIT_FAILURE);2022-8-729消息队列应用实例 if(msgrcv(qid,&msg,512,0,0)msg_text);if(msgctl(qid,IPC_RMID,NULL)0)perror(msgctl);exit(EXIT_FAILURE);exit(0);202

22、2-8-730第5章System V进程间通信 System VIPC基础基础 消息队列消息队列 信号量通信机制信号量通信机制 共享内存共享内存 信号量基本概念信号量是操作系统中解决进程或线程同步与互斥的最重要机制之一。Linux内核提供System V的信号量机制,用于实现进程之间通信。信号量常用系统调用见下表函数函数功能功能sem_init初始化一个信号量sem_wait阻塞线程sem_post增加信号量的值sem_destory释放信号量2022-8-732信号量集合属性2022-8-733信号量结构/come from/usr/src/kernels/uname-r/include/l

23、inux/sem.h/*One semaphore structure for each semaphore in the system.*/struct semint semval;/*current value*/int sempid;/*pid of last operation*/;2022-8-734信号量通信机制概念图 2022-8-735创建信号量集合 extern int semget(key_t _key,int _nsems,int _semflg);第一个参数为key_t类型的key值,一般由ftok函数产生。第二个参数_nsems为创建的信号量个数,各信号量以数组的方式

24、存储。这个数组用于初始化数组对象。第三个参数_semflg用来标识信号量集合的权限。如0770,为文件的访问权限类型。此外,还可以附加以下参数值。这些值可以与基本权限以或的方式一起使用。/come from/usr/include/bit/ipc.h/*resource get request flags*/#define IPC_CREAT 00001000 /*create if key is non existent*/#define IPC_EXCL 00002000 /*fail if key exists */#define IPC_NOWAIT 00004000 /*return

25、 error on wait */2022-8-736控制信号量集合、信号量extern int semctl(int _semid,int _semnum,int _cmd,)该函数最多可有四个参数(有可能只有三个参数)。第一个参数_semid为要操作的信号量集合标识符,该值一般由semget函数返回。第二个参数为集合中信号量的编号。如果标识某个信号量,此值为该信号量的下标(从0到n-1);如果标识整个信号量集合,则设置为0。第三个参数为要执行的操作,如果是对整个信号量集合,这些操作在/usr/include/linux/ipc.h文件中定义。其操作包括IPC_RMID、IPC_SET、IP

26、C_STAT和IPC_INFO,具体含义同msgctl的相关操作。2022-8-7372022-8-738信号量操作 extern int semop(int _semid,struct sembuf*_sops,size_t _nsops);此函数第一个参数为要操作的信号量集合标识符,该值一般由semget函数返回。第二个参数为struct sembuf结构的变量,其定义如下:/come from/usr/include/linux/sem.h/*semop system calls takes an array of these.*/struct sembuf unsigned short

27、 sem_num;/*semaphore index in array */short sem_op;/*semaphore operation */short sem_flg;/*operation flags */2022-8-739信号量操作(2)此结构体有三个成员变量。1)sem_num为操作的信号量编号。2)sem_op为作用于信号量的操作:该值如果为正整数表示增加信号量的值,如果为负整数表示减小信号量的值,如果为0表示对信号量的当前值进行是否为0的测试。3)sem_flg为操作标识。2022-8-740使用信号量实现生产消费问题 生产消费问题是一个经典的数学问题,要求生产者消费者在

28、固定的仓库空间条件下,生产者每生产一个产品将占用一个仓库空间,生产者生产的产品库存不能越过仓库的存储量,消费者每消费一个产品将增加一个仓库空间,消费者在仓库产品为0时不能再消费。本例中采用信号量来解决这个问题,为了便于理解,本例中使用了两个信号量,一个用来管理消费者(以下为sem_produce),一个用来管理生产者(以下为sem_custom),即sem_produce表示当前仓库可用空间的数量,sem_custom用来表示当前仓库中产品的数量。对于生产者来说,其需要申请的资源为仓库中的剩余空间,因此,生产者在生产一个产品前,申请sem_produce信号量,当此信号量的值大于0,即有可用空

29、间,将生产产品,并将sem_produce的值减去1(因为占用了一个空间);同时,当其生产一个产品后,当前仓库的产品数量增加1,需要将sem_custom信号量自动加1。对于消费者来说,其需要申请的资源为仓库中的产品,因此,消费者在消费一个产品前,将申请sem_custom信号量,当此信号量的值大于0时,即有可用产品,将消费一个产品,并将sem_custom信号量的值减去(因为消费了一个产品),同时,当消费一个产品,当前仓库的剩余空间增加1,需要将sem_produce信号量自动加1。2022-8-741第5章System V进程间通信 System VIPC基础基础 消息队列消息队列 信号量

30、通信机制信号量通信机制 共享内存共享内存 共享内存的基本概念共享内存允许两个或多个进程共享一个给定的存储区,这一段存储区可以被两个或两个以上的进程映射至自身的地址空间中,数据不需要在进程间复制,所以这是最快的一种IPC。使用共享内存时,多个进程之间对一给定的存储区需进行同步访问。即若一个进程正在将数据放入共享存储区,则在它做完这一操作之前,其他进程不应当去读取这些数据。通常,信号量被用来实现对共享存储的访问。2022-8-743共享内存属性2022-8-744共享内存IPC原理 2022-8-745共享内存与管道对比 2022-8-746共享内存的常用函数函数函数功能功能mmap建立共享内存映

31、射munmap解除共享内存映射shmget获取共享内存区域的IDshmctl共享内存控制shmat映射共享内存对象shmdt分离共享内存对象2022-8-747内存映射函数mmap将某个文件的指定内容映射到内存空间中,该函数声明如下:#include void*mmap(void*start,size_t length,int prot,int flags,int fd,off_t offset);此函数将在进程的虚拟地址空间(起始为start,长度为length字节)和与文件描述符fd关联的文件(偏移量为offset,长度为length)之间建立映射。参数start一般情况下设置为NULL,

32、由系统分配。第三个参数prot描述映射的内存权限,该参数是以下选项的组合:PORT_READ 允许读该内存 PORT_WRITE 允许写该内存PORT_EXEC 允许执行该内存段 PORT_NONE 该内存段不能被访问2022-8-748内存映射参数flags控制程序对该内存段的改变所造成的影响,常用选项如下:MAP_PRIVATE:内存段是私有的,对他的修改只在此局部范围内有效,其他进程不可见。MAP_SHARED:共享映射,某进程对该段内存空间的更新对其他进程来说是可见的,但该文件的内容并不会立即更新,要更新文件内容,需要调用msync和munmap函数。2022-8-749例:内存映射的

33、使用#include#include#include#include#include typedef structchar name4;int age;people;main(int argc,char*argv)pid_t result;int i;people*p_map;char temp;2022-8-750例:内存映射的使用p_map=(people*)mmap(NULL,sizeof(people)*10,PROT_READ|PROT_WRITE,MAP_SHARED|MAP_ANONYMOUS,-1,0);result=fork();if(result0)perror(fork)

34、;exit(EXIT_FAILURE);else if(result=0)sleep(2);for(i=0;i5;i+)printf(read by child:No.%ds age is:%dn,i+1,(*(p_map+i).age);2022-8-751例:内存映射的使用(*p_map).age=110;munmap(p_map,sizeof(people)*10);exit(0);elsetemp=a;for(i=0;iname,&temp,2);(p_map+i)-age=20+i);2022-8-752例:内存映射的使用sleep(5);printf(read by parent:

35、the sum of age is:%dn,(*p_map).age);printf(unmapingn);munmap(p_map,sizeof(people)*10);printf(unmap successful!n);2022-8-753创建共享内存 extern int shmget(key_t _key,size_t _size,int _shmflg);第一个参数为key_t类型的key值,一般由ftok函数产生。第二个参数size为欲创建的共享内存段大小(单位为字节)。第三个参数shmflg用来标识共享内存段的创建标识。包括/come from/usr/include/linu

36、/ipc.h#define IPC_CREAT 01000 /*Create key if key does not exist.*/#define IPC_EXCL 020000 /*Fail if key exists.*/#define IPC_NOWAIT 04000 /*Return error on wait.*/2022-8-754创建共享内存 另外,在/usr/include/linux/shm.h文件还定义了另外两个选项:/come from/usr/include/linux/shm.h/*permission flag for shmget */#define SHM_R

37、 0400 /*or S_IRUGO from */#define SHM_W 0200 /*or S_IWUGO from */2022-8-755共享内存控制 extern int shmctl(int _shmid,int _cmd,struct shmid_ds*_buf);第一个参数为要操作的共享内存标识符,该值一般由shmget函数返回。第二个参数为要执行的操作,这些操作在/usr/include/linux/ipc.h文件中定义。其操作包括IPC_RMID、IPC_SET、IPC_STAT和IPC_INFO,具体含义同msgctl的相关操作。如果是超级用户,还可以执行以下两个命令

38、:/come from/usr/include/sys/shm.h/*super user shmctl commands */#define SHM_LOCK 11#define SHM_UNLOCK 12第三个参数为struct shmid_ds结构的临时共享内存变量信息,此内容根据第二个参数的不一样而改变。2022-8-756映射共享内存对象进程使用共享内存前,需要将该共享内存与当前进程建立联系,即将该共享内存使用shmat函数映射到当前进程。其函数声明如下:#include extern void*shmat(int _shmid,_const void*_shmaddr,int _s

39、hmflag);如果执行成功,将返回共享内存段首地址。第一个参数_shmid为要操作的共享内存标识符,该值一般由shmget函数返回。第二个参数shmaddr指定共享内存的映射地址。如果该值为非零,则将用此值作为映射共享内存的地址,如果此值为0,则由系统来选择映射的地址。一般都将此值设置为0。2022-8-757映射共享内存对象#include extern void*shmat(int _shmid,_const void*_shmaddr,int _shmflag);第三个参数用来指定共享内存短的访问权限和映射条件。/come from/usr/include/linux/shm.h/*m

40、ode for attach*/#define SHM_RDNOLY 010000 /*read-only access*/#define SHM_RND 020000 /*round attach attach address to SHMLBA bounary*/#define SHM_REMAP 040000 /*take-over region on attach */#define SHM_EXEC 0100000 /*execution access */2022-8-758分离共享内存对象在共享内存使用完毕后,需要使用shmdt函数将其与当前进程分离。其函数声明如下:/come

41、from/usr/include/sys/shm.hextern int shmdt(_const void*_shmaddr);其参数即为与当前进程分离的共享内存标志ID。2022-8-759例一#include#include#include#include#include#include typedef structchar name4;int age;people;main()int shm_id,i;key_t key;people*p_map;char*name=/dev/shm/myshm2;2022-8-760例一key=ftok(name,0);shm_id=shmget(k

42、ey,4096,IPC_CREAT);if(shm_id=-1)perror(shmget);exit(EXIT_FAILURE);p_map=(people*)shmat(shm_id,NULL,0);for(i=0;iname);printf(age:%dn,(p_map+i)-age);if(shmdt(p_map)=-1)perror(shmdt);2022-8-761例一#include#include#include#include#include#include typedef structchar name4;int age;people;main()int shm_id,i;

43、key_t key;people*p_map;char*name=/dev/shm/myshm2;2022-8-762例一key=ftok(name,0);if(key=-1)perror(ftok);exit(EXIT_FAILURE);shm_id=shmget(key,4096,IPC_CREAT|0666);if(shm_id=-1)perror(shmget);exit(EXIT_FAILURE);p_map=shmat(shm_id,0,0);/(people*)shmat(shm_id,0,0);temp=a;for(i=0;iname,&temp,1);(p_map+i)-ag

44、e=20+i;if(shmdt(p_map)=-1)perror(shmdt);2022-8-7人民邮电出版社出版杨宗德编著63例二#include#include#include#include#include#include#include typedef structchar str150;char str250;int no1,no2;str;2022-8-764例二main(int argc,char*agv)int shm_id,i;key_t key;str*p_map;time_t timep;struct tm*p;char*name=/dev/shm/myshm2;key=

45、ftok(name,0);shm_id=shmget(key,4096,IPC_CREAT|0666);if(shm_id=-1)perror(shmget);exit(EXIT_FAILURE);p_map=(str*)shmat(shm_id,NULL,0);p_map-no1=0;p_map-no2=0;printf(This is A.n);fgets(p_map-str2,sizeof(p_map-str2),stdin);p_map-no1=1;2022-8-765例二while(1)if(p_map-no2=1)time(&timep);gmtime(&timep);p=loca

46、ltime(&timep);printf(A:%s%d:%d:%dn,p_map-str1,p-tm_hour,p-tm_min,p-tm_sec);p_map-str10=0;p_map-no2=0;elsecontinue;if(p_map-no1=0)fgets(p_map-str2,sizeof(p_map-str2),stdin);p_map-no1=1;if(shmdt(p_map)=-1)perror(shmdt);2022-8-766例二#include#include#include#include#include#include#include typedef struct

47、char str150;char str250;int no1,no2;str;2022-8-7人民邮电出版社出版杨宗德编著67例二main(int argc,char*agv)int shm_id,i;key_t key;str*p_map;time_t timep;struct tm*p;char*name=/dev/shm/myshm2;key=ftok(name,0);shm_id=shmget(key,4096,IPC_CREAT|0666);if(shm_id=-1)perror(shmget);exit(EXIT_FAILURE);p_map=(str*)shmat(shm_id

48、,NULL,0);p_map-no1=0;p_map-no2=0;printf(This is B.n);2022-8-7人民邮电出版社出版杨宗德编著68例二while(1)if(p_map-no1=1)time(&timep);gmtime(&timep);p=localtime(&timep);printf(A:%s%d:%d:%dn,p_map-str2,p-tm_hour,p-tm_min,p-tm_sec);p_map-no1=0;p_map-str20=0;elsecontinue;if(p_map-no2=0)fgets(p_map-str1,sizeof(p_map-str1)

49、,stdin);p_map-no2=1;if(shmdt(p_map)=-1)perror(shmdt);2022-8-7人民邮电出版社出版杨宗德编著69注意:在创建子进程时,需要注意一下几点:使用fork函数创建一个子进程后,该进程继承父进程挂载的共享内存;如果调用exec执行一个新的程序,则所有挂载的共享内存将被自动卸载;如果在某个进程中调用了exit函数,所有挂载的共享内存将与当前进程脱离关系。2022-8-7人民邮电出版社出版杨宗德编著70共享内存应用示例 共享内存的权限管理示例共享内存处理应用示例 代码见教材。2022-8-771上机1.实现两个进程间使用消息队列进行通信。2.创建一个信号量。3.调试课件P64-69的例子。2022-8-772谢谢观看/欢迎下载BY FAITH I MEAN A VISION OF GOOD ONE CHERISHES AND THE ENTHUSIASM THAT PUSHES ONE TO SEEK ITS FULFILLMENT REGARDLESS OF OBSTACLES.BY FAITH I BY FAITH

展开阅读全文
温馨提示:
1: 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
2: 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
3.本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
5. 装配图网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
关于我们 - 网站声明 - 网站地图 - 资源地图 - 友情链接 - 网站客服 - 联系我们

copyright@ 2023-2025  zhuangpeitu.com 装配图网版权所有   联系电话:18123376007

备案号:ICP2024067431-1 川公网安备51140202000466号


本站为文档C2C交易模式,即用户上传的文档直接被用户下载,本站只是中间服务平台,本站所有文档下载所得的收益归上传人(含作者)所有。装配图网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对上载内容本身不做任何修改或编辑。若文档所含内容侵犯了您的版权或隐私,请立即通知装配图网,我们立即给予删除!