我们专注攀枝花网站设计 攀枝花网站制作 攀枝花网站建设
成都网站建设公司服务热线:400-028-6601

网站建设知识

十年网站开发经验 + 多家企业客户 + 靠谱的建站团队

量身定制 + 运营维护+专业推广+无忧售后,网站问题一站解决

c语言msgsnd函数 c语言mid函数使用方法

linux c语言进程间通信疑问,上述程序只是想父进程创建一个消息队列,发给子进程消息,但是为什么没有成功

创新互联是一家集网站建设,丰顺企业网站建设,丰顺品牌网站建设,网站定制,丰顺网站建设报价,网络营销,网络优化,丰顺网站推广为一体的创新建站企业,帮助传统企业提升企业形象加强企业竞争力。可充分满足这一群体相比中小企业更为丰富、高端、多元的互联网需求。同时我们时刻保持专业、时尚、前沿,时刻以成就客户成长自我,坚持不断学习、思考、沉淀、净化自己,让我们为更多的企业打造出实用型网站。

if((msgid=msgget(IPC_PRIVATE,0666))==-1)

{

printf("error111");

exit(0);

}

放到fork()函数之前就可以了。

创建消息队列需要在fork()之前,因为fork()产生的是两个进程,他们的资源是相互独立的。

fork()之后创建的消息队列,另一个进程不能识别。

关于c语言中消息队列发送的结构体?

消息队列正常定义的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操作系统中 使用系统调用的一般方式是怎样的?

给个例子给你看看吧,这里是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次运行就会报消息队列不能创建的错误。


网站名称:c语言msgsnd函数 c语言mid函数使用方法
文章URL:http://shouzuofang.com/article/dohjcio.html

其他资讯