1. 程式人生 > >Linux程序設計:進程通信

Linux程序設計:進程通信

string.h 關鍵詞 borde %d sys tab 基本 long pad

?

日期:忘了。

關鍵詞: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程序設計:進程通信