#define TEXT_SZ 2048
struct shared_use_st {
int written_by_you;
char some_text [TEXT_SZ];
};
#include <unistd.h>
#include <stdlib.h>
#include <stdio.h>
#include <string.h>
#include <sys/shm.h>
#include "shm_com.h"
int main()
{
int running = 1;
void *shared_memory = (void *)0;
struct shared_use_st *shared_stuff;
int shmid;
srand ((unsigned int)getpid ());
shmid = shmget ((key_t)1234, sizeof (struct shared_use_st),0666 | IPC_CREAT);
if (shmid == -1) {
fprintf (stderr, "shmget failed\n");
exit (EXIT_FAILURE);
}
/*使共享内存可被程序访问*/
shared_memory = shmat (shmid, (void *)0, 0);
if (shared_memory == (void *)-1) {
fprintf (stderr, "shmat failed\n");
exit (EXIT_FAILURE);
}
printf ("Memory attached at %X\n", (int)shared_memory);
shared_stuff = (struct shared_use_st *)shared_memory;
shared_stuff->written_by_you = 0;
while (running) {
if (shared_stuff->written_by_you) {
printf ("You wrote: %s", shared_stuff->some_text);
sleep (rand () % 4);
shared_stuff->written_by_you = 0;
if (strncmp (shared_stuff->some_text, "end", 3) == 0) {
running = 0;
}
}
}
/*与共享内存分离并删除之*/
if (shmdt (shared_memory) == -1) {
fprintf (stderr, "shmdt failed\n");
exit (EXIT_FAILURE);
}
if (shmctl (shmid, IPC_RMID, 0) == -1) {
fprintf (stderr, "shmctl(IPC_RMID) failed\n");
exit (EXIT_FAILURE);
}
exit (EXIT_SUCCESS);
}
#include <unistd.h>
#include <stdlib.h>
#include <stdio.h>
#include <string.h>
#include <sys/shm.h>
#include "shm_com.h"
int main()
{
int running = 1;
void *shared_memory = (void *)0;
struct shared_use_st *shared_stuff;
char buffer [BUFSIZ];
int shmid;
shmid = shmget ((key_t)1234, sizeof (struct shared_use_st), 0666 | IPC_CREAT);
if (shmid == -1) {
fprintf (stderr, "shmget failed\n");
exit (EXIT_FAILURE);
}
shared_memory = shmat (shmid, (void *)0, 0);
if (shared_memory == (void *)-1) {
fprintf (stderr, "shmat failed\n");
exit (EXIT_FAILURE);
}
printf ("Memory attached at %X\n", (int)shared_memory);
shared_stuff = (struct shared_use_st *)shared_memory;
while (running) {
while (shared_stuff->written_by_you == 1) {
sleep (1);
printf ("waiting for client...\n");
}
printf ("Enter some text: ");
fgets (buffer, BUFSIZ, stdin);
strncpy (shared_stuff->some_text, buffer, TEXT_SZ);
shared_stuff->written_by_you = 1;
if (strncmp (buffer, "end", 3) == 0) {
running = 0;
}
}
if (shmdt (shared_memory) == -1) {
fprintf (stderr, "shmdt failed\n");
exit (EXIT_FAILURE);
}
exit (EXIT_SUCCESS);
}
beyes@linux-beyes:~/C/share_memory> ./shm1.exe
Memory attached at B806F000
You wrote: hello consumer
You wrote: what are you doing ?
... ....
beyes@linux-beyes:~/C/share_memory> ./shm2.exe
Memory attached at B7F76000
Enter some text: hello consumer
waiting for client...
waiting for client...
waiting for client...
Enter some text: what are you doing ?
waiting for client...
waiting for client...
waiting for client...
Enter some text:
... ...
欢迎光临 曲径通幽论坛 (http://www.groad.net/bbs/) | Powered by Discuz! X3.2 |