1.创建共享内存,写进程每隔2秒向内存写入一次“hello world”;
如果结束写操作,则写进程写入“end”;
2.读进程从共享内存读取数据,并打印。直到读到“end”为止。
源代码:
write.c
#include <stdio.h>
#include <stdlib.h>
#include <sys/ipc.h>
#include <sys/shm.h>
#include <unistd.h>
#include <sys/types.h>
#include <errno.h>
#include <string.h>
#include <signal.h>
#include <stdlib.h>
#include <sys/ipc.h>
#include <sys/shm.h>
#include <unistd.h>
#include <sys/types.h>
#include <errno.h>
#include <string.h>
#include <signal.h>
char* make_shmid()
{
int shmid;
char *p = NULL;
shmid=shmget(4321,4096,IPC_CREAT);
p = shmat(shmid,NULL,0);
return p;
}
{
int shmid;
char *p = NULL;
shmid=shmget(4321,4096,IPC_CREAT);
p = shmat(shmid,NULL,0);
return p;
}
void make_write(char *a)
{
char w_buff[15] = "Hello world";
sleep(2);
strcpy(a,w_buff);
}
{
char w_buff[15] = "Hello world";
sleep(2);
strcpy(a,w_buff);
}
void tt(int sig)
{
char *a;
a=make_shmid();
char end_buf[5] = "end";
strcpy(a,end_buf);
exit(0);
}
{
char *a;
a=make_shmid();
char end_buf[5] = "end";
strcpy(a,end_buf);
exit(0);
}
int main()
{
char *a;
a=make_shmid();
while(1)
{
make_write(a);
signal(SIGINT,tt);
}
shmdt(a);
return 0;
}
{
char *a;
a=make_shmid();
while(1)
{
make_write(a);
signal(SIGINT,tt);
}
shmdt(a);
return 0;
}
read.c
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <sys/ipc.h>
#include <sys/shm.h>
#include <sys/types.h>
#include <unistd.h>
#include <errno.h>
#include <stdlib.h>
#include <string.h>
#include <sys/ipc.h>
#include <sys/shm.h>
#include <sys/types.h>
#include <unistd.h>
#include <errno.h>
int main(void)
{
int shm_id;
{
int shm_id;
shm_id = shmget(4321,4096,IPC_CREAT);
if(shm_id == -1)
{
perror("shmget error");
exit(1);
}
char *r_buff;
while(1){
r_buff = shmat(shm_id,NULL,0);
if((strcmp(r_buff,"end")) != 0){
printf("%s\n",r_buff);
memset(r_buff,'\0',strlen(r_buff));
sleep(2);
}
else{
printf("%s\n",r_buff);
break;
}
if(shm_id == -1)
{
perror("shmget error");
exit(1);
}
char *r_buff;
while(1){
r_buff = shmat(shm_id,NULL,0);
if((strcmp(r_buff,"end")) != 0){
printf("%s\n",r_buff);
memset(r_buff,'\0',strlen(r_buff));
sleep(2);
}
else{
printf("%s\n",r_buff);
break;
}
}
shmdt(r_buff);
shmctl(shm_id,IPC_RMID,NULL);
return 0;
}