第25章 实现进程间通信(IPC)

目标:实现系统调用
int send_msg(int pid, struct msg *msg);
int receive_msg(struct msg *msg);



消息结构如下所示:
#define TASK_MSG_NR    10
struct msg{
    int pid;        //消息的发送者
    int type;
    int size;
    union{
    char c;
    int i;
    long l;
    void *p;
    }x;
};

struct msgbox{
    unsigned long msg_nr;  //信箱中有多少条信息
    int msg_start;
    int msg_end;
    struct msg box[TASK_MSG_NR];  //循环数组
};

#define DEFAULT_STACK_SIZE  4096
struct task_struct{
    struct tss_struct    tss;
    unsigned long long tss_descriptor;
    unsigned long long ldt_descriptor;
    unsigned long long ldt[2];
    unsigned int task_function;
    void * stack0;
    void * stack3;
    unsigned int stack0_size;
    unsigned int stack3_size;
    int state;
    int priority;
    int time_slice;
    int pid;
    int ppid;
    struct task_struct *next, *prev;
    struct task_struct *hnext, *hprev;
    struct prio_array *py;
    struct timer timer;
    struct msgbox msgbox;
};


发送消息函数和接收消息函数如下所示

int sys_send_msg(int pid, struct msg *msg)
{
    
    int ret = 0;
    struct task_struct *task = NULL;

    cli();
    if(pid < 0 || !msg)
    {
      ret = 1;
      goto end;
    }
    
    //查询是否存在这个pid的任务
    task = query_task_from_hash(pid);
    if(!task)
    {
      ret = 2;
      goto end;
    }

    //查看任务的信箱是否有空位
    if(task->msgbox.msg_nr < TASK_MSG_NR) //有空位
    {
      //复制消息到任务的信箱的空位中
      task->msgbox.msg_end = ++(task->msgbox.msg_end)%TASK_MSG_NR;
      task->msgbox.box[task->msgbox.msg_end] = *msg;

      //消息数目增1
      ++(task->msgbox.msg_nr); 
    }
    else //无空位
    {
      ret = 3;
      goto end;
    }
end:
    sti();
    return ret;
}


int sys_receive_msg(struct msg *msg)
{
    int ret = 0;

    cli();
    if(!msg)
    {
      ret = 1;
      goto end;
    }

    //查看任务的信箱是否有消息
    if(current->msgbox.msg_nr > 0) //有消息
    {
      //复制任务信箱中的消息到msg中
      current->msgbox.msg_start = ++(current->msgbox.msg_start)%TASK_MSG_NR;
      *msg =     current->msgbox.box[current->msgbox.msg_start];

      //消息数目减1
      --(current->msgbox.msg_nr); 
    }
    else //无消息
    {
      ret = 2;
      goto end;
    }
end:
    sti();
    return ret;
}


  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值