/*1.創建共享記憶體,寫行程通過鍵盤不斷向記憶體寫入“hello world”;
如果結束寫操作,則通過鍵盤輸入“end”
2.讀行程從共享記憶體讀取資料,并列印,直到讀到“end”為止,
*/
#include <stdio.h>
#include <unistd.h>
#include <stdlib.h>
#include <sys/shm.h>
#define MAXSIZE 1024
struct shm{
int write; //記錄讀行程是否已經將內容讀取
char buffer[MAXSIZE];
};
int main()
{
int shmid;
struct shm *share;
void *shmptr = NULL;
/*
int shmget(key_t key, size_t size, int flag);
key: 識別符號的規則
size:共享存盤段的位元組數
flag:讀寫的權限
回傳值:成功回傳共享存盤的id,失敗回傳-1
*/
if((shmid = shmget(0X44,MAXSIZE,0666|IPC_CREAT)) < 0)//得到一個共享記憶體識別符號
perror("shmget");
/*
void *shmat(int shmid, const void *addr, int flag);
shmid:共享存盤的id
addr:一般為0,表示連接到由內核選擇的第一個可用地址上,否則,如果flag沒有指定SHM_RND,則連接到addr所指定的地址上,如果flag為SHM_RND,則地址取整
flag:如前所述,一般為0
回傳值:如果成功,回傳共享存盤段地址,出錯回傳-1
*/
if((shmptr = shmat(shmid,0,0)) == (void *)-1)//把共享記憶體區物件映射到呼叫行程的地址空間
perror("shmat");
printf("This is the read process!!!\n");
share = (struct shm *)shmptr;//指向同一個地址空間
while(1)
{
if(share->write != 0)
{
if(!strncmp(share->buffer,"end",3) == 0)//將share->buffer和"end"的前三個位元組進行比較,如果==0就代表兩個字符相等
{
printf("%s",share->buffer);//從共享記憶體中輸出寫的內容
share->write = 0;//重置保證在回圈里面
}
else
break;
}
}
if(shmdt(shmptr) < 0)//斷開共享記憶體連接
perror("shmdt");
exit(0);
}
/*1.創建共享記憶體,寫行程通過鍵盤不斷向記憶體寫入“hello world”;
如果結束寫操作,則通過鍵盤輸入“end”
2.讀行程從共享記憶體讀取資料,并列印,直到讀到“end”為止,
*/
#include <stdio.h>
#include <unistd.h>
#include <stdlib.h>
#include <sys/shm.h>
#define MAXSIZE 1024
struct shm{
int write; //記錄讀行程是否已經將內容讀取
char buffer[MAXSIZE];
};
int main()
{
int shmid;
void *shmptr = NULL;
char str[MAXSIZE]; //存盤輸入的內容
struct shm *share;
if((shmid = shmget(0X44,MAXSIZE,0666|IPC_CREAT)) < 0)//得到一個共享記憶體識別符號
perror("shmget");
if((shmptr = shmat(shmid,0,0)) == (void *)-1)//把共享記憶體區物件映射到呼叫行程的地址空間
perror("shmat");
printf("This is the write process!!!\n");
share = (struct shm *)shmptr;//指向同一個地址空間
while(1)
{
if(share->write == 1)//如果讀行程未啟動
{
sleep(1);
printf("Waiting the read process!!!\n");
}
printf("please input hello world or input end\n");
fgets(str,MAXSIZE,stdin);//獲取從鍵盤輸入的內容
sprintf(share->buffer,"%s",str);//將輸入的內容存到共享記憶體中
share->write = 1;//重置保證能寫入到共享記憶體里面
if(strncmp(str,"end",3) == 0)//如果輸入end就跳出
break;
sleep(1);
}
if(shmdt(shmptr) < 0)//斷開共享記憶體連接
perror("shmdt");
exit(0);
}
轉載請註明出處,本文鏈接:https://www.uj5u.com/qianduan/385318.html
標籤:其他
上一篇:Linux下安裝部署Redis
下一篇:公網IP和內網IP如何分辨?
