来自「包含几个用不同方式(共享内存、socket、FIFO、消息队列等)实现进程通信的」· 代码 · 共 63 行

TXT
63
字号
/*************************************************************   
 * 用消息队列实现的进程间通信的例子example2-05.c  example2-06.c  
 ************************************************************/   
   
/*****************************************    
 * 消息队列实例  客户端程序example2-06.c  
 *****************************************/   
   
#include    <SYS msg.h>    
#include    <SYS ipc.h>    
#include    <STDIO.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;   
    size_t      len;   
    ssize_t     n;   
    char        *ptr;   
    struct mymesg   mesg;   
   
    msgid = msgget(4321, 0);    /* 打开消息队列 */   
    snprintf(mesg.mesg_data, MAXMESGDATA, "%ld", (long)getpid());  //getpid()取得目前进程的进程识别码,通过格式化字符复制操作,复制给mesg.mesg_data    
    len = strlen(mesg.mesg_data);   
    ptr = mesg.mesg_data + len;   
    fgets(ptr, MAXMESGDATA - len, stdin); /* 读入路径名 */       //由前句可知,将路径名读入,加到mesg_data之后    
    len = strlen(mesg.mesg_data);   
    if (mesg.mesg_data[len-1] == '\n')    //通过判断得到数据实际的长度(不包括换行符\n)    
        len--;   
    mesg.mesg_len = len;   
    mesg.mesg_type = 1;   
    msg_send(msgid, &mesg);             /* 将路径名写入消息队列 */        //    
    mesg.mesg_type = getpid();          /* 以自己的进程号做为消息类型 */   
    while((n = mesg_recv(msgid, &mesg)) > 0)     /* 从消息队列中读回服务进程返回的消息*/   
        write(stdout, mesg.mesg_data);  /* 将获得的文件内容写到标准输出 */   
    exit(0);   
}   

⌨️ 快捷键说明

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