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

📄

📁 包含几个用不同方式(共享内存、socket、FIFO、消息队列等)实现进程通信的小程序
💻
字号:
/*************************************************************   
 * 用消息队列实现的进程间通信的例子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 + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -