導航:首頁 > 編程系統 > linux共享內存刪除

linux共享內存刪除

發布時間:2021-03-05 16:36:09

1. linux在終端怎麼取消shmat的共享內存

要讓一個進程獲取對一塊共享內存的訪問,這個進程必須先調用 shmat(SHared Memory Attach,綁定到共享內存)。將 shmget 返回的共享內存標識符 SHMID 傳遞給這個函數作為第一個參數。該函數的第二個參數是一個指針,指向您希望用於映射該共享內存塊的進程內存地址;如果您指定NULL則Linux會自動選擇一個合適的地址用於映射。第三個參數是一個標志位,包含了以下選項:
SHM_RND表示第二個參數指定的地址應被向下靠攏到內存頁面大小的整數倍。如果您不指定這個標志,您將不得不在調用shmat的時候手工將共享內存塊的大小按頁面大小對齊。 SHM_RDONLY表示這個內存塊將僅允許讀取操作而禁止寫入。 如果這個函數調用成功則會返回綁定的共享內存塊對應的地址。通過 fork 函數創建的子進程同時繼承這些共享內存塊;如果需要,它們可以主動脫離這些共享內存塊。 當一個進程不再使用一個共享內存塊的時候應通過調用 shmdt(Shared Memory Detach,脫離共享內存塊)函數與該共享內存塊脫離。將由 shmat 函數返回的地址傳遞給這個函數。如果當釋放這個內存塊的進程是最後一個使用該內存塊的進程,則這個內存塊將被刪除。對 exit 或任何exec族函數的調用都會自動使進程脫離共享內存塊。

2. 如何設置linux的共享內存

首先先使用shmget建立一塊共享內存,然後向該內存中寫入數據並返回該共享內存shmid
使用另一個程序通過上一程序返回的shmid讀該共享內存內的數據
建立共享內存並寫入數據的程序

#include<stdio.h>
#include<string.h>
#include<sys/ipc.h>
#include<sys/shm.h>
#include<stdlib.h>
#include<errno.h>
voidget_buf(char*buf)
{
inti=0;
while((buf[i]=getchar())!=' '&&i<1024)
i++;
}
intmain(void)
{
intshmid;
shmid=shmget(IPC_PRIVATE,sizeof(char)*1024,IPC_CREAT|0666);
if(shmid==-1)
{
perror("shmget");
}
char*buf;
if((int)(buf=shmat(shmid,NULL,0))==-1)
{
perror("shmat");
exit(1);
}
get_buf(buf);
printf("%d ",shmid);
return0;
}
讀取數據的程序
#include<stdio.h>
#include<sys/ipc.h>
#include<sys/shm.h>
#include<stdlib.h>
intmain(intargc,char**argv)
{
intshmid;
shmid=atoi(argv[1]);
char*buf;
if((int)(buf=shmat(shmid,NULL,0))==-1)
{
perror("shmat");
exit(1);
}
printf("%s ",buf);
shmdt(buf);
return0;
}

命令行的第一個參數設為第一個程序輸出的數字

使用完以後可以使用
ipcrm -m 19562507
來刪除該共享內存

3. 在linux中共享內存里分別存放了整數和字元,怎麼將它們分別取出來

一、應用
共享內存的使用,主要有以下幾個API:ftok()、shmget()、shmat()、shmdt()及shmctl()。
1)用ftok()函數獲得一個ID號.
應用說明:
在IPC中,我們經常用用key_t的值來創建或者打開信號量,共享內存和消息隊列。
函數原型:
key_t ftok(const char *pathname, int proj_id);
Keys:
1)pathname一定要在系統中存在並且進程能夠訪問的
3)proj_id是一個1-255之間的一個整數值,典型的值是一個ASCII值。
當成功執行的時候,一個key_t值將會被返回,否則-1被返回。我們可以使用strerror(errno)來確定具體的錯誤信息。
考慮到應用系統可能在不同的主機上應用,可以直接定義一個key,而不用ftok獲得:
#define IPCKEY 0x344378
2)shmget()用來開辟/指向一塊共享內存的函數
應用說明:
shmget()用來獲得共享內存區域的ID,如果不存在指定的共享區域就創建相應的區域。
函數原型:
int shmget(key_t key, size_t size, int shmflg);
key_t key 是這塊共享內存的標識符。如果是父子關系的進程間通信的話,這個標識符用IPC_PRIVATE來代替。如果兩個進程沒有任何關系,所以就用ftok()算出來一個標識符(或者自己定義一個)使用了。
int size 是這塊內存的大小.
int flag 是這塊內存的模式(mode)以及許可權標識。
模式可取如下值:
IPC_CREAT 新建(如果已創建則返回目前共享內存的id)
IPC_EXCL 與IPC_CREAT結合使用,如果已創建則則返回錯誤
然後將「模式」 和「許可權標識」進行「或」運算,做為第三個參數。
如: IPC_CREAT | IPC_EXCL | 0640
例子中的0666為許可權標識,4/2/1 分別表示讀/寫/執行3種許可權,第一個0是UID,第一個6(4+2)表示擁有者的許可權,第二個4表示同組許可權,第3個0表示他人的許可權。
這個函數成功時返回共享內存的ID,失敗時返回-1。
關於這個函數,要多說兩句。
創建共享內存時,shmflg參數至少需要 IPC_CREAT | 許可權標識,如果只有IPC_CREAT 則申請的地址都是k=0xffffffff,不能使用;
獲取已創建的共享內存時,shmflg不要用IPC_CREAT(只能用創建共享內存時的許可權標識,如0640),否則在某些情況下,比如用ipcrm刪除共享內存後,用該函數並用IPC_CREAT參數獲取一次共享內存(當然,獲取失敗),則即使再次創建共享內存也不能成功,此時必須更改key來重建共享內存。

4. linux共享內存的控制釋放

要讓一個進程獲取對一塊共享內存的訪問,這個進程必須先調用 shmat(SHared Memory Attach,綁定到共享內存)。
將 shmget 返回的共享內存標識符 SHMID 傳遞給這個函數作為第一個參數。
該函數的第二個參數是一個指針,指向希望用於映射該共享內存塊的進程內存地址;
如果指定NULL則Linux會自動選擇一個合適的地址用於映射。
第三個參數是一個標志位,包含了以下選項:
SHM_RND表示第二個參數指定的地址應被向下靠攏到內存頁面大小的整數倍。
如果不指定這個標志,將不得不在調用shmat的時候手工將共享內存塊的大小按頁面大小對齊。
SHM_RDONLY表示這個內存塊將僅允許讀取操作而禁止寫入。
如果這個函數調用成功則會返回綁定的共享內存塊對應的地址。
通過 fork 函數創建的子進程同時繼承這些共享內存塊;
如果需要,它們可以主動脫離這些共享內存塊。
當一個進程不再使用一個共享內存塊的時候應通過調用 shmdt(Shared Memory Detach,脫離共享內存塊)函數與該共享內存塊脫離。
將由 shmat 函數返回的地址傳遞給這個函數。
如果當釋放這個內存塊的進程是最後一個使用該內存塊的進程,則這個內存塊將被刪除。
對 exit 或任何exec族函數的調用都會自動使進程脫離共享內存塊。

5. 如何設置LINUX的共享內存

我們可以修改shmmax內核參數,使SGA存在於一個共享內存段中。
通過修改/proc/sys/kernel/shmmax參數可以達到此目的。
[root@neirong root]# echo 1073741824 > /proc/sys/kernel/shmmax
[root@neirong root]# more /proc/sys/kernel/shmmax
1073741824這里設為1G。
對於shmmax文件的修改,系統重新啟動後會復位。可以通過修改 /etc/sysctl.conf 使更改永久化。
在該文件內添加以下一行 kernel.shmmax = 1073741824 這個更改在系統重新啟動後生效.
1、設置 SHMMAX
SHMMAX
參數定義共享內存段的最大尺寸(以位元組為單位)。在設置 SHMMAX 時,切記 SGA 的大小應該適合於一個共享內存段。 SHMMAX 設置不足可能會導致以下問題:
ORA-27123:unable to attach to shared memory segment
您可以通過執行以下命令來確定 SHMMAX 的值:
# cat /proc/sys/kernel/shmmax
33554432
SHMMAX 的默認值是 32MB 。我一般使用下列方法之一種將 SHMMAX 參數設為 2GB :
通過直接更改 /proc 文件系統,你不需重新啟動機器就可以改變 SHMMAX 的默認設置。我使用的方法是將以下命令放入 /etc/rc.local 啟動文件中:
# >echo "2147483648" > /proc/sys/kernel/shmmax
您還可以使用 sysctl 命令來更改 SHMMAX 的值:
# sysctl -w kernel.shmmax=2147483648
最後,通過將該內核參數插入到 /etc/sysctl.conf 啟動文件中,您可以使這種更改永久有效:
# echo "kernel.shmmax=2147483648" >> /etc/sysctl.conf
2、設置 SHMMNI
我們現在來看 SHMMNI 參數。這個內核參數用於設置系統范圍內共享內存段的最大數量。該參數的默認值是 4096 。這一數值已經足夠,通常不需要更改。
您可以通過執行以下命令來確定 SHMMNI 的值:
# cat /proc/sys/kernel/shmmni
4096
3、設置 SHMALL
最後,我們來看 SHMALL 共享內存內核參數。該參數控制著系統一次可以使用的共享內存總量(以頁為單位)。簡言之,該參數的值始終應該至少為:
ceil(SHMMAX/PAGE_SIZE)
SHMALL 的默認大小為 2097152 ,可以使用以下命令進行查詢:
# cat /proc/sys/kernel/shmall
2097152
SHMALL 的默認設置對於我們的 Oracle9 i RAC 安裝來說應該足夠使用。
注意: 在 i386 平台上 Red Hat Linux 的 頁面大小 為 4096 位元組。但是,您可以使用 bigpages ,它支持配置更大的內存頁面尺寸。

6. linux環境下已經設置的共享內存,能不能更改其大小

shmget 創建的共享內存不能調整大小
對於mmap,或許可以,沒這么做過
mmap 應該是以頁為單位映射的,通常是4k
你如果之前的大小是100,調整為200
這應該沒有明顯區別

7. linux查看共享內存命令

共享內存查看
使用ipcs命令,不加如何參數時,會把共享內存、信號量、消息隊列的信息都列印出來,如果只想顯示共享內存信息,使用如下命令:
[root@localhost ~]# ipcs -m

------ Shared Memory Segments --------
key shmid owner perms bytes nattch status
0x00000000 1867776 root 600 393216 2 dest
0x00000000 1900545 root 600 393216 2 dest
0x00030021 1703938 zc 666 131104 1
0x0003802e 1736707 zc 666 131104 1
0x00030004 1769476 zc 666 131104 1
0x00038002 1802245 zc 666 131104 1
0x00000000 1933318 root 600 393216 2 dest
0x00000000 1966087 root 600 393216 2 dest
0x00000000 1998856 root 600 393216 2 dest
0x00000000 2031625 root 600 393216 2 dest
0x00000000 2064394 root 600 393216 2 dest
0x0014350c 2261003 cs 666 33554432 2
0x00000000 2129932 root 600 393216 2 dest
0x00000000 2162701 root 600 393216 2 dest
0x00143511 395837454 root 666 1048576 1
其中:
第一列就是共享內存的key;
第二列是共享內存的編號shmid;
第三列就是創建的用戶owner;
第四列就是許可權perms;
第五列為創建的大小bytes;
第六列為連接到共享內存的進程數nattach;
第七列是共享內存的狀態status。其中顯示「dest」表示共享內存段已經被刪除,但是還有用戶在使用它,當該段內存的mode欄位設置為SHM_DEST時就會顯示「dest」。當用戶調用shmctl的IPC_RMID時,內存先查看多少個進程與這個內存關聯著,如果關聯數為0,就會銷毀這段共享內存,否者設置這段內存的mod的mode位為SHM_DEST,如果所有進程都不用則刪除這段共享內存。

8. 如何查看linux共享內存內容

可以使用samba協議。Samba是在Linux和UNIX系統上實現SMB協議的一個免費軟體,由伺服器及客戶端程序構成。SMB是一種在區域網上共享文件和列印機的一種通信協議,它為區域網內的不同計算機之間提供文件及列印機等資源的共享服務。具體配置步驟如下:
步驟1:安裝samba
sudo apt-get install samba samba-common-bin
步驟2:新建共享目錄並設置許可權
sudo mkdir /home/share
sudo chmod 777 /home/share
步驟3:修改配置文件
sudo nano /etc/samba/smb.conf
在smb.conf最後添加:
[share]
path = /home/share
browseable = yes
writable = yes
comment = smb share test
public = no#yes無需密碼 no需要密碼
步驟4:添加遠程訪問用戶
sudo useradd smbuser
sudo smbpasswd -a smbuser
步驟5:重新啟動服務
sudo service samba restart
對於windows操作系統,在資源管理器里輸入\\Linux的IP地址,會提示輸入上述步驟設置的用戶名和密碼,輸入正確後即可訪問分享內容。

9. linux命令怎麼刪除共享內存

可以使用samba協議。Samba是在Linux和UNIX系統上實現SMB協議的一個免費軟體,由伺服器版及客戶端程序構成。權SMB是一種在區域網上共享文件和列印機的一種通信協議,它為區域網內的不同計算機之間提供文件及列印機等資源的共享服務。

閱讀全文

與linux共享內存刪除相關的資料

熱點內容
linux啟動選擇內核 瀏覽:670
華碩用什麼編程 瀏覽:277
金山數據恢復已付款怎麼辦 瀏覽:326
win10滑鼠箭頭改變 瀏覽:906
主角叫凌寒的小說 瀏覽:230
word怎麼在字加框 瀏覽:537
俄二戰電影舊槍普通話在線觀看 瀏覽:387
電影看見大胸女 瀏覽:541
tcpstate配置文件 瀏覽:939
著名片站 瀏覽:103
一段簡單的編程由什麼組成 瀏覽:561
手機android文件夾沒有內容 瀏覽:281
寶書網txt官網入口當書網 瀏覽:10
四創大數據 瀏覽:547
少兒編程能做出哪些游戲 瀏覽:156
大數據分析趙麗穎價值 瀏覽:2
iphone來自電腦的照片怎麼刪除 瀏覽:648
姜惠恩禁止的愛 瀏覽:981
三君四妾by小透明 瀏覽:585
修車女女電影 瀏覽:451

友情鏈接