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
另外,你要知道只用共享內存是不互斥的,你必須結合信號量一起使用才能防止互斥問題的出現。如果你共享的只是一個整形變數可能問題不大,因為對頁面對齊的整形變數的讀寫都是原子操作,但如果你共享的是個復雜的結構體就得小心了。