深入瞭解進程間通信:System V信號量+共享內存

{"type":"doc","content":[{"type":"blockquote","content":[{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null},"content":[{"type":"text","marks":[{"type":"strong","attrs":{}}],"text":"前言:","attrs":{}},{"type":"text","marks":[{"type":"italic","attrs":{}}],"text":"共享內存","attrs":{}},{"type":"text","text":"指 (shared memory)在多處理器的計算機系統中,可以被不同中央處理器(CPU)訪問的大容量內存。由於多個CPU需要快速訪問存儲器,這樣就要對存儲器進行緩存(Cache)。","attrs":{}}]}],"attrs":{}},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null}},{"type":"image","attrs":{"src":"https://static001.geekbang.org/infoq/f1/f1dbc213c94443c380ee9c6f76b54612.png","alt":"在這裏插入圖片描述","title":null,"style":null,"href":null,"fromPaste":true,"pastePass":true}},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null}},{"type":"heading","attrs":{"align":null,"level":2},"content":[{"type":"text","text":"writer:","attrs":{}}]},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null}},{"type":"codeblock","attrs":{"lang":"cpp"},"content":[{"type":"text","text":"#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#define SEM_KEY 4001\n#define SHM_KEY 5678\nunion semun {\n int val;\n};\nint main(void){\n /*create a shm*/\n int semid,shmid;\n shmid = shmget(SHM_KEY,sizeof(int),IPC_CREAT|0666);\n if(shmid<0){\n printf(\"create shm error\\n\");\n return -1;\n }\n void * shmptr;\n shmptr =shmat(shmid,NULL,0);\n if(shmptr == (void *)-1){\n printf(\"shmat error:%s\\n\",strerror(errno));\n return -1;\n }\n int * data = (int *)shmptr;\n semid = semget(SEM_KEY,2,0666);\n struct sembuf sembuf1;\n union semun semun1;\n while(1){\n sembuf1.sem_num=1;\n sembuf1.sem_op=-1;\n sembuf1.sem_flg=SEM_UNDO;\n semop(semid,&sembuf1,1);\n scanf(\"%d\",data); \n sembuf1.sem_num=0;\n sembuf1.sem_op=1;\n sembuf1.sem_flg=SEM_UNDO;\n semop(semid,&sembuf1,1);\n }\n return 0;\n}","attrs":{}}]},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null}},{"type":"heading","attrs":{"align":null,"level":2},"content":[{"type":"text","text":"reader:","attrs":{}}]},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null}},{"type":"codeblock","attrs":{"lang":"cpp"},"content":[{"type":"text","text":"#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#define SEM_KEY 4001\n#define SHM_KEY 5678\nunion semun {\n int val;\n};\nint main(void){\n /*create a shm*/\n int semid,shmid;\n shmid = shmget(SHM_KEY,sizeof(int),IPC_CREAT|0666);\n if(shmid<0){\n printf(\"create shm error\\n\");\n return -1;\n }\n void * shmptr;\n shmptr =shmat(shmid,NULL,0);\n if(shmptr == (void *)-1){\n printf(\"shmat error:%s\\n\",strerror(errno));\n return -1;\n }\n int * data = (int *)shmptr; \n semid = semget(SEM_KEY,2,IPC_CREAT|0666);\n union semun semun1;\n semun1.val=0;\n semctl(semid,0,SETVAL,semun1);\n semun1.val=1;\n semctl(semid,1,SETVAL,semun1);\n struct sembuf sembuf1;\n while(1){\n sembuf1.sem_num=0;\n sembuf1.sem_op=-1;\n sembuf1.sem_flg=SEM_UNDO;\n semop(semid,&sembuf1,1);\n printf(\"the NUM:%d\\n\",*data);\n sembuf1.sem_num=1;\n sembuf1.sem_op=1;\n sembuf1.sem_flg=SEM_UNDO;\n semop(semid,&sembuf1,1);\n }\n return 0;\n}","attrs":{}}]},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null}},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null},"content":[{"type":"text","marks":[{"type":"strong","attrs":{}}],"text":"相關視頻:","attrs":{}}]},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null},"content":[{"type":"text","text":"【Linux內核】Linux內核進程間通信組件的實現(上):","attrs":{}},{"type":"link","attrs":{"href":"https://www.zhihu.com/zvideo/1288126445278330880","title":null},"content":[{"type":"text","text":"https://www.zhihu.com/zvideo/1288126445278330880","attrs":{}}]}]},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null}},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null},"content":[{"type":"text","text":"【Linux內核】Linux內核進程間通信組件的實現(下) :","attrs":{}},{"type":"link","attrs":{"href":"https://www.zhihu.com/zvideo/1288128472473387008","title":null},"content":[{"type":"text","text":"https://www.zhihu.com/zvideo/1288128472473387008","attrs":{}}]}]},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null}},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null}}]}
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章