msgrcv:Identifier removed 错误解析!

今天学信号队列时搞半天才整出来

感谢某一博主的博文才得以解决:https://blog.csdn.net/cumtzdlxm/article/details/79213360

下面列出主要出错代码:

typedef struct {
        long msgtype;
        char data[30];
}MSG;

key_t key;
int msgid;
MSG msg;
if(key = ftok(".",'b') < 0){
                perror("ftok");
                exit(-1);
}
if(msgid = msgget(key, IPC_CREAT | 0666)<0){
                perror("msgget");
                exit(-1);
}

从其他博文中都说是类型问题,怎么改都不行。

这段代码看似没毛病,但是有个很致命的错误!
在if判断语句内,将其拿出来单纯看 msgid = msgget(key, IPC_CREAT | 0666)<0
你会发现,优先级的问题
先执行msgget(key, IPC_CREAT | 0666)<0,然后在对msgid进行赋值
造成msgid的值为0,原因是后面的判断为假。

注意:这里两个判断句都错在同一个地方,只拿了第二个讲解
实践的重要性,多写代码吧…

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 2
    评论
④ 模拟C/S通信,要求如下: a.模拟客户端(Client端)程序client,其功能是: 1.显示下列服务功能菜单: ************************** * 1:Query balance * * 2:Draw money * * 3:Save money * * 4:Change password * * 0:Exit * ************************* * 2.接收用户键入的功能号选择; 3.将用户键入的功能号作为一条信息发送到消息队列,然后结束。 b.模拟服务器端(Server端)程序server,其功能是: 1.从消息队列接收Client端发来的一条消息; 2.父进程创建一个子进程; 3.根据消息作如下处理: 若消息为"1",子进程1加载服务模块query,该模块的内容为显示以下信息:You have $10000! 若消息为"2",子进程1加载服务模块draw,该模块的内容为显示以下信息:You have drawn $10000! 若消息为"3",子进程1加载服务模块save,该模块的内容为显示以下信息:You have saved $10000! 若消息为"4",子进程1加载服务模块change,该模块的内容为显示以下信息:Your password has changed! 若消息为"0",退出子进程。 4.等待子进程终止后,Server进程删除消息缓冲队列,然后结束。 注意: I).各个子模块query、draw、save和change要事先编译连接好,放在你认为合适的子目录下; II).采用先运行客户端进程,然后运行服务器端进程的方式实现同步; III).注意子进程的加载方法 在linux系统下,根据要求给出代码要求
最新发布
05-27
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值