apue.h是一个《UNIX环境高级编程》作者自己写的一个头文件,所以任何版本的编译器中你都不会找到这个头文件。你可以在网上下载一个相对靠谱的文件,并把文件放到/usr/include目录下。这样代码中有#include <apue.h>就可以了。如果将这个头文件放置在qiu.c文件相同目录下,那么就是这样包含头文件: #include "apue.h"。不过建议初学者还是不要使用这个头文件,初期学习还是以扎实基本功为主,应该有必要了解每个函数需要包含什么头文件,因此直接使用这个文件并不见得是什么好事。包括后面一些出错处理函数,建议还是自己写一些简单的出错处理吧,对能力也是是一种锻炼。.
⑵ LINUX下系统编程,多进程间数据共享,即共享变量
共享内存相关的API怎么使用不难:
1. 首先调用shmget分配一个新的共享内存,这里你可以指定其大小,如果你要分配一个整形,那你可以将size参数设置成4,如果你要共享一个结构体那就将size参数设置成你的结构体大小,操作系统不关心你要共享什么,它只关心你要分配多少个字节的区间。而且实际上操作系统会将你要求的大小按照内存页面的大小进行对齐,也就是说它可能实际上给你分配若干个页面的物理存储空间,只要这个空间能够容纳你所指定的大小就ok了。它的第三个参数是关于一些访问权限设置的,要讲起来太长,建议自己搜索一下,或者用man查查帮助。总之,调用完shmget以后系统会给你创建一段共享内存,然后返回给你一个shmid,也就是这个共享内存的标识,你可以理解为给它取了个名字。
2. 接着调用shmat将这段共享内存映射到你的进程的虚拟地址空间上。这个函数的第一个参数就是你之前调用shmget创建的共享内存的名字shmid;第二个参数是个指针,指向你的进程虚存空间中的某个地址,你可以通过传入一个确定的地址强行要求操作系统将共享内存映射到你指定的虚存地址上(可能会失败,如果你指定的虚拟地址空间已经映射了别的物理存储空间),也可以通过传入0地址让系统给你选择一个合适的地址(它会通过返回值把地址返回给你)。第三个参数则允许你指定一些特殊的标志位,还是那句话,太复杂自己搜索一下看看,一般应用不需要用到。
至于例子嘛你可以看看下面这个链接:
http://ke..com/view/3025906.htm
另外,你要知道只用共享内存是不互斥的,你必须结合信号量一起使用才能防止互斥问题的出现。如果你共享的只是一个整形变量可能问题不大,因为对页面对齐的整形变量的读写都是原子操作,但如果你共享的是个复杂的结构体就得小心了。