| 
 | 
 
两个聊天端,分别称之为 server和 client . 
 
server 端代码: 
 #include <stdio.h> 
 #include <fcntl.h> 
 #include <stdlib.h> 
 #include <string.h> 
 #include <sys/types.h> 
 #include <sys/ipc.h> 
 #include <sys/msg.h> 
 #include <sys/stat.h> 
 #include <string.h> 
  
 #define    BUF_SIZE    256 
 #define PROJ_ID        32 
 #define PATH_NAME    "/tmp" 
 #define    SERVER_MSG    1 
 #define    CLIENT_MSG    2 
  
 int main() 
 { 
     struct mymsgbuf { 
         long msgtype; 
         char ctrlstring [BUF_SIZE]; 
     } msgbuffer; 
  
     int    qid; 
     int    msglen; 
     int    msgkey; 
      
     if ((msgkey = ftok (PATH_NAME, PROJ_ID)) == -1) { 
         perror ("ftok error!\n"); 
         exit (1); 
     } 
  
     if ((qid = msgget (msgkey, IPC_CREAT|0660)) == -1) { 
         perror ("msgget error!\n"); 
         exit (1); 
     } 
      
     while (1) { 
         printf ("server: "); 
         fgets (msgbuffer.ctrlstring, BUF_SIZE, stdin); 
         if (strncmp ("exit", msgbuffer.ctrlstring, 4) == 0) { 
             msgctl (qid, IPC_RMID, NULL); 
             break; 
         } 
  
         msgbuffer.ctrlstring [strlen (msgbuffer.ctrlstring) - 1] = '\0'; 
         msgbuffer.msgtype = SERVER_MSG; 
         if (msgsnd (qid, &msgbuffer, strlen (msgbuffer.ctrlstring) + 1, 0) == -1){    /*+1为包括'\0'进去*/ 
             perror ("Server msgsnd error!\n"); 
             exit (1); 
         } 
  
         if (msgrcv (qid, &msgbuffer, BUF_SIZE, CLIENT_MSG, 0) == -1) { 
             perror ("Server msgrcv error!\n"); 
             exit (1); 
         } 
  
         printf ("Client: %s\n", msgbuffer.ctrlstring); 
     } 
  
     exit (0); 
 }  
client 端代码: 
 #include <stdio.h> 
 #include <fcntl.h> 
 #include <stdlib.h> 
 #include <sys/types.h> 
 #include <sys/ipc.h> 
 #include <sys/msg.h> 
 #include <sys/stat.h> 
 #include <string.h> 
  
  
 #define    BUF_SIZE     256 
 #define PROJ_ID        32 
 #define PATH_NAME    "/tmp" 
 #define    SERVER_MSG    1 
 #define    CLIENT_MSG    2 
  
 int main() 
 { 
     struct mymsgbuf { 
         long msgtype; 
         char ctrlstring [BUF_SIZE]; 
     } msgbuffer; 
      
     int    qid; 
     int    msglen; 
     key_t    msgkey; 
  
     if ((msgkey = ftok (PATH_NAME, PROJ_ID)) == -1) { 
         perror ("ftok error!\n"); 
         exit (1); 
     } 
  
     if ((qid = msgget (msgkey, IPC_CREAT|0660)) == -1) { 
         perror ("msgget error!\n"); 
         exit (1); 
     } 
  
     while (1) { 
         if (msgrcv (qid, &msgbuffer, BUF_SIZE, SERVER_MSG, 0) == -1) { 
             perror ("Server msgrcv error!\n"); 
             exit (1); 
         } 
  
         printf ("server: %s\n", msgbuffer.ctrlstring); 
         printf ("client: "); 
          
         fgets (msgbuffer.ctrlstring, BUF_SIZE, stdin); 
         if (strncmp ("exit", msgbuffer.ctrlstring, 4) == 0) { 
             break; 
         } 
  
         msgbuffer.ctrlstring [strlen (msgbuffer.ctrlstring) - 1] = '\0'; 
         msgbuffer.msgtype = CLIENT_MSG; 
      
         if (msgsnd (qid, &msgbuffer, strlen (msgbuffer.ctrlstring) + 1, 0) == -1) { 
             perror ("client msgsnd error!\n"); 
             exit (1); 
         } 
     } 
  
     exit (0); 
 }  server 运行及输出:beyes@linux-beyes:~/C/queue> ./server.exe  
server: hello sam 
Client: hello tom 
server: what are you doing now ? 
Client: yes ,i am working, very busy!! 
server: so do i, i will exit now 
Client: ok bye 
server: exit  
client 运行及输出:beyes@linux-beyes:~/C/queue> ./client.exe  
server: hello sam 
client: hello tom 
server: what are you doing now ? 
client: yes ,i am working, very busy!! 
server: so do i, i will exit now 
client: ok bye 
Server msgrcv error! 
: Identifier removed  |   
 
 
 
 |