十年网站开发经验 + 多家企业客户 + 靠谱的建站团队
量身定制 + 运营维护+专业推广+无忧售后,网站问题一站解决
把
创新互联是一家集网站建设,丰顺企业网站建设,丰顺品牌网站建设,网站定制,丰顺网站建设报价,网络营销,网络优化,丰顺网站推广为一体的创新建站企业,帮助传统企业提升企业形象加强企业竞争力。可充分满足这一群体相比中小企业更为丰富、高端、多元的互联网需求。同时我们时刻保持专业、时尚、前沿,时刻以成就客户成长自我,坚持不断学习、思考、沉淀、净化自己,让我们为更多的企业打造出实用型网站。
if((msgid=msgget(IPC_PRIVATE,0666))==-1)
{
printf("error111");
exit(0);
}
放到fork()函数之前就可以了。
创建消息队列需要在fork()之前,因为fork()产生的是两个进程,他们的资源是相互独立的。
fork()之后创建的消息队列,另一个进程不能识别。
消息队列正常定义的type类型就是long,你看看是不是你定义的有问题。
#includesys/types.h
#includesys/ipc.h
#includesys/msg.h
#includestdio.h
struct msgbuf
{
long type;//类型
char buf[1024];
};
int main()
{
int msgid;
msgid=msgget(0x1000,IPC_CREAT | 0777);
struct msgbuf mb={1,"hello world"};
int ret;
ret=msgsnd(msgid,mb,sizeof(struct msgbuf)-sizeof(long),0);
//这里的长度不包括类型的大小
}
给个例子给你看看吧,这里是linux中一个C语言程序,他用到了linux提供的系统调用,很长的程序了,或许你没耐心看,我在最后给你列出那些地方用了系统调用
#include stdio.h
#include stdlib.h
#include unistd.h
#include sys/types.h
#include sys/ipc.h
#include sys/msg.h
#define BUFF_LEN 1024
#define RET_ERROR 1
#define RET_OK 0
typedef struct msg_send_struct { //这就是一个消息的数据结构
long my_type; //我们就是根据这个字段来区分每块消息的
char my_text[BUFF_LEN];
} msg_send_struct;
int main() {
char * path = "/";
int i_porject_id = 7;
key_t key;
msg_send_struct msg_send; //定义发送消息
int i_ret;
int i_msg_id;
int i_flag = 0666|IPC_CREAT; //为消息管道的创建指定参数,IPC_CREAT表示这个消息队列是创建,而不是搜索已经存在的消息队列
key = ftok(path, i_porject_id);//为消息队列生成一个key,当然你也可以手动指定,当你运气很好没有和已经窜在的消息队列的key起冲突的时候
if(key == 1) {
printf("building key error\n");
exit(1);
}
i_msg_id = msgget(key, i_flag);//根据你的参数决定是创建还是搜索KEY值得消息队列
if(i_msg_id == -1) {
printf("create msg queue error\n");
exit(1);
}
printf("i_msg_id = %d\n", i_msg_id);
msg_send.my_type = 1;
strcpy(msg_send.my_text, "hello world"); //初始化消息
i_ret = msgsnd(i_msg_id, msg_send, strlen("hello world") + 1, IPC_NOWAIT);//开始发送,nowait表示如果队列中消息满了当前进程不等待直接返回错误,反之很容易理解吧
if(i_ret == -1) {
printf("msg send error\n");
exit(1);
}
exit(0);
}
下面是系统调用:
#include sys/types.h
#include sys/ipc.h
#include sys/msg.h这些头文件可不是库函数,他里面就是linux提供的系统调用。
key = ftok(path, i_porject_id);//为消息队列生成一个key,当然你也可以手动指定,当你运气很好没有和已经窜在的消息队列的key起冲突的时候
linux中系统调用,利用文件系统和ID来创建KEY。
i_msg_id = msgget(key, i_flag);//根据i_flag值决定是创建还是寻找消息队列的系统调用。
i_ret = msgsnd(i_msg_id, msg_send, strlen("hello world") + 1, IPC_NOWAIT);//发送消息的系统调用msgsnd函数。
这里涉及到进程通信中的消息队列内容,如果不明白没什么关系,可以看出来他和C的库函数调用一模一样,只不过实现方式,这需要你的知识积累到一定程度,有很大差别。对于一个程序员来说,我们看不出什么他们和库函数有什么区别,这算是一种对我们的透明性。
补充:这个例子是我写来学习进程通信内容的,由于采用了linux系统调用,所以只能在linux下面运行,还有就是我没有考虑权限问题,所以要编译请用超级用户root,由于消息队列的特性,这个程序没有释放队列(我把释放代码写在了接受消息的程序中),第2次运行就会报消息队列不能创建的错误。