日期:忘了。
关键词:Linux程序设计;System-V;进程通信;共享内存;消息队列。
一、共享内存
1.1 基本知识
(待补充)
1.2 代码
- shm_comm.h
#define TEXT_SZ 2048 struct shared_use_st { int written_by_you; char some_text[TEXT_SZ]; }; |
- shm1.c
#include <unistd.h> #include <stdio.h> #include <stdlib.h> #include <string.h> #include <sys/shm.h> #include "shm_com.h"
int main() { int running = 1; void *shm_ptr = NULL; struct shared_use_st *share_stuff; char buff[TEXT_SZ]; int shmid;
shmid = shmget((key_t)1234, sizeof(struct shared_use_st), 0666|IPC_CREAT); printf("shmid = %x\n", shmid); if(shmid == -1) { fprintf(stderr, "shmget failed\n"); exit(EXIT_FAILURE); }
shm_ptr = shmat(shmid, NULL, 0); if(shm_ptr == (void *)-1) { fprintf(stderr, "shmat failed\n"); exit(EXIT_FAILURE); } printf("Memory attached at %p\n", shm_ptr);
share_stuff = (struct shared_use_st*)shm_ptr;
while(running) { if(share_stuff->written_by_you == 1) { sleep(1); printf("waiting for client\n"); } printf("Enter texts:"); fgets(buff, TEXT_SZ, stdin); strncpy(share_stuff->some_text, buff, TEXT_SZ); share_stuff->written_by_you = 1;
if(strncmp(share_stuff->some_text, "end", 3) == 0) { running = 0; } }
if(shmdt(shm_ptr) == -1) { fprintf(stderr, "shmdt failed\n"); exit(EXIT_FAILURE); } exit(EXIT_SUCCESS);
} |
- shm2.c
#include <unistd.h> #include <stdio.h> #include <stdlib.h> #include <string.h> #include <sys/shm.h> #include "shm_com.h"
int main() { int running = 1; void *shm_ptr = NULL; struct shared_use_st *share_stuff; char buff[TEXT_SZ]; int shmid;
shmid = shmget((key_t)1234, sizeof(struct shared_use_st), 0666|IPC_CREAT); printf("shmid = %x\n", shmid); if(shmid == -1) { fprintf(stderr, "shmget failed\n"); exit(EXIT_FAILURE); }
shm_ptr = shmat(shmid, NULL, 0); if(shm_ptr == (void *)-1) { fprintf(stderr, "shmat failed\n"); exit(EXIT_FAILURE); } printf("Memory attached at %p\n", shm_ptr);
share_stuff = (struct shared_use_st*)shm_ptr;
while(running) { if(share_stuff->written_by_you == 1) { sleep(1); printf("waiting for client\n"); } printf("Enter texts:"); fgets(buff, TEXT_SZ, stdin); strncpy(share_stuff->some_text, buff, TEXT_SZ); share_stuff->written_by_you = 1;
if(strncmp(share_stuff->some_text, "end", 3) == 0) { running = 0; } }
if(shmdt(shm_ptr) == -1) { fprintf(stderr, "shmdt failed\n"); exit(EXIT_FAILURE); } exit(EXIT_SUCCESS);
} |
二、消息队列
2.1 基本知识
待补充。
2.2 代码
- msg1.c
#include <stdlib.h> #include <stdio.h> #include <string.h> #include <errno.h> #include <unistd.h>
#include <sys/msg.h> struct msg_t { long int msg_type; char content[BUFSIZ]; };
int main() { int running = 1; int msgid; long int msg_to_receive = 0; //决定队列消息优先级,0表示获取队列第一个可用消息 struct msg_t msg;
msgid = msgget((key_t)1234, 0666 | IPC_CREAT); printf("msgid = %d\n", msgid); if (msgid == -1) { fprintf(stderr, "msgget failed\n"); exit(EXIT_FAILURE); }
while (running) { if (msgrcv(msgid, (void *)&msg, BUFSIZ, msg_to_receive, 0) == -1) { fprintf(stderr, "msgrcv failde\n"); exit(EXIT_FAILURE); } printf("You wrote %s", msg.content); if(strncmp(msg.content, "end", 3) == 0) running = 0; } if (msgctl(msgid, IPC_RMID, 0) == -1) { fprintf(stderr, "msgcntl failed\n"); exit(EXIT_FAILURE); } exit(EXIT_SUCCESS);
} |
- msg2.c
#include <stdlib.h> #include <stdio.h> #include <string.h> #include <errno.h> #include <unistd.h> #include <sys/msg.h> #define MAX_TEXT 512 struct msg_t { long int msg_type; char content[BUFSIZ]; };
int main() { int running = 1; struct msg_t msg; int msgid; char buffer[BUFSIZ];
msgid = msgget((key_t)1234, 0666 | IPC_CREAT); printf("msgid = %d\n", msgid);
if (msgid == -1) { fprintf(stderr, "msgget failed\n"); exit(EXIT_FAILURE); }
while (running) { printf("Enter texts:"); fgets(buffer, BUFSIZ, stdin); msg.msg_type = 1; strcpy(msg.content, buffer);
if(msgsnd(msgid, (void *)&msg, BUFSIZ, 0) == -1) { fprintf(stderr, "msgsnd failed\n"); exit(EXIT_FAILURE); } if(strncmp(msg.content, "end", 3) == 0) { running = 0; } }
exit(EXIT_SUCCESS); } |