Linux共享記憶體之段錯誤

2021-08-01 01:14:49 字數 833 閱讀 3163

最近為了學習作業系統,練習寫乙個shell,然後其中採用了共享記憶體的方案。

然而在共享記憶體初始化的時候移植了之前寫共享記憶體實驗已經成功的初始化**,卻出現了段錯誤。主要**如下:

#include "stupidshell.h"

int *loop;

int shm_id;

char *shm_buff;

cmdpoolstruct * pool;

int main()

出現錯誤以後,

1.首先是perror shmget 、 shmat看看是否成功。結果都是success的;

2.然後再懷疑申請的記憶體超過了最大值,或者是轉換申請的記憶體比cmdpoolstruct結構體小,然後修改測試,發現都是沒有問題的;

3.接著用ipcs命令檢視共享記憶體是否建立,許可權是否正確,也是沒有問題的;

4.然後列印shmat返回的指標,發現每次執行shmat返回的指標的變動是非常大,每一位都可能出現變化,正常來說至少該指標的前幾位是不會變的,那麼說問題就是出在了shmat的返回指標無效上了;

5.然後一直往回推,shmat->shmget->ftok還是沒有找到問題的關鍵。

6.在除錯了很久之後,再仔細對比移植前的**,發現少了

#include
然後將信將疑地加到了新**裡,結果真的把問題解決了。

對於這樣的錯誤真的很無奈,perror(「shmat」)是成功的,然而返回的指標卻是非法的,標頭檔案沒有包含,編譯器卻沒有任何提示,還都執行正常。。。。。

這次教訓告訴廣大的袁門,編譯器不可信,錯誤流輸出不可以信!

linux筆記之共享記憶體

1.程序間通訊的三種方法 2.共享記憶體的優點 執行時省去了若干次拷貝,是以上三種程式間通訊中最快的 3.共享記憶體的缺點 訊息佇列 管道等自帶同步或互斥機制,而共享記憶體不自帶,故需要使用訊號量來實現共享記憶體的互斥和同步。1.建立共享記憶體 int creat shm int size 建立 呼...

linux之System V共享記憶體

共享記憶體與其他程序通訊方式相比較,不需要複製資料,直接讀寫記憶體,是一種效率非常高的程序通訊方案。但它本身不提供同步訪問機制,需要我們自己控制。在linux中,只要把共享記憶體段連線到程序的位址空間中,這個程序就可以訪問共享記憶體中的位址了。linux系統提供的共享記憶體操作函式與訊號量 訊息佇列...

Linux程序通訊之共享記憶體

一 建立共享記憶體,使用shmget函式 int shmget key tkey,int size,int shm 返回值 如果成功,返回共享記憶體段識別符號。如果失敗,則返回 1 errno einval 無效的記憶體段大小 eexist 記憶體段已經存在,無法建立 eidrm 記憶體段已經被刪除...