程序間通訊 訊息佇列與共享記憶體與訊號量

2021-09-28 15:37:47 字數 4440 閱讀 7056

訊息佇列:

訊息佇列是訊息的鏈結表 ,存放在核心中並由訊息佇列識別符號標識。

訊息佇列:

同一塊物理記憶體被對映到程序a、b各自的程序位址空間。

程序a可以即時看到程序b對共享記憶體中資料的更新,反之亦然。

由於多個程序共享同一塊記憶體區域,必然需要某種同步機制,互斥鎖和訊號量都可以。

訊號量:

可以被多個程序共享的變數。(訊號是cpu發給所以程序的通知,程序是否接受,是否處理要看程序本身)

訊息佇列:

key =

ftok

("./7-1"

,'b');

msgid =

msgget

(key, ipc_creat |

0666);

len =

msgsnd

(msgid,

(void*)

&sndbuf,

100,0)

;rcvlen=

msgrcv

(msgid,

(void*)

&rcvbuf,

100,1,

0);共享記憶體:

key=

ftok

("write.c"

,0x00);

shmid=

shmget

(key,

512,ipc_creat|

0600);

shmaddr=

(book *

)shmat

(shmid,

null,0

);shmdt

(shmaddr)

;//斷開對映

訊號量:

key=

ftok

("mysem"

,'s');

sem_id=

semget

(key,

2,ipc_creat|

0644);

ret=

semctl

(sem_id,

0,setall,arg)

;semop

(sem_id,

(struct sembuf*

)&sops[1]

,1);

semctl

(sem_id,

0,ipc_rmid)

;

write.c

#include

#include

#include

typedef

struct msgque

mq;int

main()

return0;

}#include

#include

#include

typedef

struct msgque

mq;int

main()

else

}return0;

}

write.c

/*共享記憶體實現程序通訊

key=ftok("write.c",0x00); //兩個非親緣程序用同乙個key

int shmid = shmget(key, 512, ipc_creat|0600);ipc_private(親緣間代替key)

char *shmaddr;

寫端:shmaddr = (char *)shmat(shmid,null,0);

//id與記憶體繫結,然後寫shmaddr

shmdt(shmaddr); //關閉後讓讀端讀

讀端:shmaddr=(char *)shmat(shmid,null,0);

*/#include

#include

#include

#include

#include

#include

#include

#include

typedef

struct book

book;

intmain

(void),

};key=

ftok

("write.c"

,0x00);

//建shm

if(key==-1

)printf

("key=%d\n"

,key)

; shmid=

shmget

(key,

512,ipc_creat|

0600);

if(shmid<0)

printf

("shmid =%d\n"

,shmid)

;//連shm

shmaddr=

(book *

)shmat

(shmid,

null,0

);if(shmaddr<

(book *)0

)memcpy

(shmaddr,allbook,

sizeof

(book)*2

);int i;

for(i=

0;i<

2;i++

)shmdt

(shmaddr)

;return0;

} read.c

#include

#include

#include

#include

#include

#include

#include

#include

typedef

struct book

book;

intmain

(void

)printf

("key=%d\n"

,key)

; shmid=

shmget

(key,

512,ipc_creat|

0600);

if(shmid<0)

printf

("shmid =%d\n"

,shmid)

;//連shm

shmaddr=

(book *

)shmat

(shmid,

null,0

);if(shmaddr<

(book *)0

)for

(i=0

;i<

2;i++

)shmdt

(shmaddr)

;return0;

}

#include

#include

#include

#include

#include

#include

#include

#include

int sem_id;

void

init()

arg;

key=

ftok

("mysem"

,'s');

sem_id=

semget

(key,

2,ipc_creat|

0644);

sem_array[0]

=0; sem_array[1]

=100

; arg.array = sem_array;

ret=

semctl

(sem_id,

0,setall,arg);if

(ret==-1

)printf

("productor init is %d\n"

,semctl

(sem_id,

0,getval));

//getval

printf

("space init is %d\n\n"

,semctl

(sem_id,

1,getval));

}void

del(

)int

main

(int argc,

char

*ar**)

del();

return0;

}//sem_customer.c

#include

#include

#include

#include

#include

#include

#include

#include

int sem_id;

void

init()

intmain

(int argc,

char

*ar**)

return0;

}

Linux程序間通訊(二) 共享記憶體 訊息佇列

一 共享記憶體 最高效的程序間通訊機制。多個程序共享一段記憶體。需要依靠某種同步機制,如互斥鎖或訊號量。通常步驟為 建立 對映 使用 撤銷對映 刪除 相關函式可以參考 linux 共享記憶體 include include include include include include semcom...

Linux程序間通訊(二) 共享記憶體 訊息佇列

一 共享記憶體 最高效的程序間通訊機制。多個程序共享一段記憶體。需要依靠某種同步機制,如互斥鎖或訊號量。通常步驟為 建立 對映 使用 撤銷對映 刪除 相關函式可以參考 linux 共享記憶體 include include include include include include semcom...

程序間通訊 共享記憶體 訊息佇列 訊號量

共享記憶體 共享記憶體是最快的程序間通訊方式,相較於其他程序間通訊方式,少了兩次核心態與使用者態之間的資料拷貝過程 原理及使用過程 在物理記憶體中開闢一塊記憶體空間 將這塊記憶體空間通過頁表對映到程序的虛擬位址空間中 程序可以直接通過程序虛擬位址空間訪問到這塊物理記憶體進行操作 若多個程序對映同一塊...