在apue阶段对状态机的理解

本文介绍了一个基于消息队列实现的数据收发系统中有限状态机的应用案例。通过具体代码示例展示了如何使用switch语句实现状态机,包括状态的判断与转换逻辑。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

             第一次开博客,第一做APUE的笔记,竟然发现自己的APUE大致的走了一个流程。不过还是毕竟还是收获了一点的东西,那就是有限状态机。

             有限状态机就是系统的所有状态以及在这个几个状态之间的转换,一般在转换状态机的时候就是所谓的,口语化的叫法叫做推动状态机,实现状态机语法一般是switch语句或者是if...else语句,我个人学会了前者。要实现推动状态机,要做的三点1进入状态机条件的初始化2各个状态之间的连贯跳转3必须要有状态机的退出态。比如在两个stdout之间利用消息队列实现收发数据,状态机的状态有

{

 MSG_PATH,

MSG_DATA,

MSG_ERR,

MSG_ROT,

}

要实现这样一个MSG版的状态机它的部分代码如下:

  switch(umsg.mtype)

    {
        case MSG_PATH:   
            uid=getuid();
            gid=getgid();
           stat(umsg.pathmsg.path,&st);
           if(uid==st.st_uid)
          {
             if(st.st_mode&S_IRUSR)
             {
                   umsg.datamsg.mtype=MSG_DATA;
                       break;
              }
               else
                  {
                     umsg.errmsg.mtype=MSG_ERR; 
                     umsg.errmsg.errn=EACCES;
                              break;
                    }
          }
          if(gid==st.st_gid)
          {
              if(st.st_mode&S_IRGRP)
                       {
                         umsg.datamsg.mtype=MSG_DATA;
                            break;
                         }
                     else
                      {
                          umsg.errmsg.mtype=MSG_ERR;
                             umsg.errmsg.errn=EACCES;
                                 break;
                            }
          }
           if(st.st_mode& S_IROTH)
                 {
                       umsg.datamsg.mtype=MSG_DATA;
                              break;
                   }
                else
                  {
                       umsg.errmsg.mtype=MSG_ERR;
                         umsg.errmsg.errn=EACCES;
                            break;
                    }
      case  MSG_DATA:
          file=open(umsg.pathmsg.path, O_RDONLY);                   //open(path)
           if (file<0)
            {
                   umsg.errmsg.errn=errno;
                   umsg.errmsg.mtype=MSG_ERR;
            }
          while(1)
              {
                 umsg.datamsg.datalen= read(file,umsg.datamsg.data,1024);  
                 if(umsg.datamsg.datalen<0)
                 {
                  if(errno==EINTR)
                    continue;
                       umsg.errmsg.errn=errno;
                         umsg.errmsg.mtype=MSG_ERR;
                             break;
                  }
                  if(umsg.datamsg.datalen==0)
                      {        

                                umsg.eotmsg.mtype=MSG_EOT;
                                  break;
                           }
                    if(umsg.datamsg.datalen>0)
                     {
                          ret1= msgsnd(msgid,&umsg,umsg.datamsg.datalen+4,0);                                                     //发送数据到对端。             
                            if(ret1<0)
                             {   
                                 umsg.errmsg.errn=errno;
                                   umsg.errmsg.mtype=MSG_ERR;
                                 }      
                         umsg.datamsg.mtype=MSG_DATA;
                           break;
                       }
                 }
      case MSG_ERR:                           
                      umsg.errmsg.mtype=MSG_EOT;
                             break;
       case MSG_EOT:  break;

       default:
           abort();
           break;
   }
 }
}

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值