Linux程序設計:進程通信
?
日期:忘了。
關鍵詞: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); } |
Linux程序設計:進程通信