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);

}

猜你喜欢

转载自www.cnblogs.com/sinkinben/p/10739125.html