⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄

📁 包含几个用不同方式(共享内存、socket、FIFO、消息队列等)实现进程通信的小程序
💻
字号:
/*************************************************************  
 * 用消息队列实现的进程间通信的例子example2-05.c  example2-06.c 
 ************************************************************/  
  
/***************************************************************************** 
 * 首先服务进程建立一个消息队列,然后去读此消息队列中客户端发来的消息 
  (此消息中应该包括客户端的进程ID和一个文件的路径名)。  
 * 读到消息后,服务器端会按指定的路径名去读文件,然后将文件内容再写回消息队列。 
 * 此后,客户端会来读取服务进程为它返回的文件内容,然后打印到标准输出。 
 *****************************************************************************/  
    
/*****************************************   
 * 消息队列实例 服务器端程序example2-05.c 
 *****************************************/  
  
#include    <STDIO.H>   
#include    <SYS msg.h>   
#include    <SYS ipc.h>   
#include    <SYS types.h>   
#include    <ERRNO.H>   
#include    <STRING.H>   
  
#define MAXMESGDATA     1000   
#define SVMSG_MODE      777   
  
struct mymesg {         //定义用户自己的数据结构   
        long        mesg_len;       /* #bytes in mesg_data, can be 0 */  
        long        mesg_type;      /* message type, must be > 0 */  
        char        mesg_data[MAXMESGDATA];  
};  
  
size_t msg_send(int id, struct mymesg *mptr)  
{  
    return(msgsnd(id, &(mptr->mesg_type), mptr->mesg_len, 0));  
}  
  
/* end mesg_send */  
size_t mesg_recv(int id, struct mymesg *mptr)  
{  
    ssize_t n;  
  
    n = msgrcv(id, &(mptr->mesg_type), MAXMESGDATA, mptr->mesg_type, 0);  
    mptr->mesg_len = n;      /* return #bytes of data */  
  
    return(n);              /* -1 on error, 0 at EOF, else >0 */  
}  
  
  
int main()  
{  
    int msgid;  
    FILE    *fp;  
    char    *ptr;  
    pid_t   pid;  
    ssize_t n;  
    struct mymesg mesg;  
  
    msgid = msgget(1234, SVMSG_MODE | IPC_CREAT); /*、以1234为key创建一个消息队列 */  
  
    for( ; ; ) {    /*循环从消息队列中读取客户请求 */  
        mesg.mesg_type = 1;  
        if ((n = mesg_recv(msgid, &mesg)) == 0) {       //判断消息是否为空   
            printf("pathname missing");  
            continue;  
        }  
        mesg.mesg_data[n] = '\0';   /*将消息的数据段格式化成以空字符结束的字符串 */      //即在数据末尾添加“\0”作为结束标志。   
        if ((ptr = strchr(mesg.mesg_data, ' ')) == NULL) {  
            printf("bogus request: %s", mesg.mesg_data);  
            continue;  
        }  
        *ptr++ = 0;  
        pid = atol(mesg.mesg_data); /*获得发送消息的客户进程的进程号 */  
        mesg.mesg_type = pid;     
        if ((fp = fopen(ptr, "r")) == NULL) { /*以只读方式打开所请求文件 */  
            snprintf(mesg.mesg_data + n, sizeof(mesg.mesg_data) -n, ":can't open, %s\n", strerror(errno));  
            mesg.mesg_len = strlen(ptr);  
            memmove(mesg.mesg_data, ptr, mesg.mesg_len);  
            msg_send(msgid, &mesg); /*将文件内容写回消息队列 */     //即服务器将读到的客户端请求的消息返回给客户端   
        }  
        else {  /*若文件不存在,则将客户的请求消息内容再写回消息队列 */     
            while(fgets(mesg.mesg_data, MAXMESGDATA, fp) != NULL) {  
                mesg.mesg_len = strlen(mesg.mesg_data);  
                msg_send(msgid, &mesg);  
            }  
            fclose(fp);  
        }  
        mesg.mesg_len = 0;  
        msg_send(msgid, &mesg);  
    }  
    exit(0);  
}  

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -