把
創(chuàng)新互聯(lián)是一家集網(wǎng)站建設(shè),豐順企業(yè)網(wǎng)站建設(shè),豐順品牌網(wǎng)站建設(shè),網(wǎng)站定制,豐順網(wǎng)站建設(shè)報價,網(wǎng)絡(luò)營銷,網(wǎng)絡(luò)優(yōu)化,豐順網(wǎng)站推廣為一體的創(chuàng)新建站企業(yè),幫助傳統(tǒng)企業(yè)提升企業(yè)形象加強(qiáng)企業(yè)競爭力??沙浞譂M足這一群體相比中小企業(yè)更為豐富、高端、多元的互聯(lián)網(wǎng)需求。同時我們時刻保持專業(yè)、時尚、前沿,時刻以成就客戶成長自我,堅持不斷學(xué)習(xí)、思考、沉淀、凈化自己,讓我們?yōu)楦嗟钠髽I(yè)打造出實用型網(wǎng)站。
if((msgid=msgget(IPC_PRIVATE,0666))==-1)
{
printf("error111");
exit(0);
}
放到fork()函數(shù)之前就可以了。
創(chuàng)建消息隊列需要在fork()之前,因為fork()產(chǎn)生的是兩個進(jìn)程,他們的資源是相互獨(dú)立的。
fork()之后創(chuàng)建的消息隊列,另一個進(jìn)程不能識別。
消息隊列正常定義的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提供的系統(tǒng)調(diào)用,很長的程序了,或許你沒耐心看,我在最后給你列出那些地方用了系統(tǒng)調(diào)用
#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 { //這就是一個消息的數(shù)據(jù)結(jié)構(gòu)
long my_type; //我們就是根據(jù)這個字段來區(qū)分每塊消息的
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; //定義發(fā)送消息
int i_ret;
int i_msg_id;
int i_flag = 0666|IPC_CREAT; //為消息管道的創(chuàng)建指定參數(shù),IPC_CREAT表示這個消息隊列是創(chuàng)建,而不是搜索已經(jīng)存在的消息隊列
key = ftok(path, i_porject_id);//為消息隊列生成一個key,當(dāng)然你也可以手動指定,當(dāng)你運(yùn)氣很好沒有和已經(jīng)竄在的消息隊列的key起沖突的時候
if(key == 1) {
printf("building key error\n");
exit(1);
}
i_msg_id = msgget(key, i_flag);//根據(jù)你的參數(shù)決定是創(chuàng)建還是搜索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);//開始發(fā)送,nowait表示如果隊列中消息滿了當(dāng)前進(jìn)程不等待直接返回錯誤,反之很容易理解吧
if(i_ret == -1) {
printf("msg send error\n");
exit(1);
}
exit(0);
}
下面是系統(tǒng)調(diào)用:
#include sys/types.h
#include sys/ipc.h
#include sys/msg.h這些頭文件可不是庫函數(shù),他里面就是linux提供的系統(tǒng)調(diào)用。
key = ftok(path, i_porject_id);//為消息隊列生成一個key,當(dāng)然你也可以手動指定,當(dāng)你運(yùn)氣很好沒有和已經(jīng)竄在的消息隊列的key起沖突的時候
linux中系統(tǒng)調(diào)用,利用文件系統(tǒng)和ID來創(chuàng)建KEY。
i_msg_id = msgget(key, i_flag);//根據(jù)i_flag值決定是創(chuàng)建還是尋找消息隊列的系統(tǒng)調(diào)用。
i_ret = msgsnd(i_msg_id, msg_send, strlen("hello world") + 1, IPC_NOWAIT);//發(fā)送消息的系統(tǒng)調(diào)用msgsnd函數(shù)。
這里涉及到進(jìn)程通信中的消息隊列內(nèi)容,如果不明白沒什么關(guān)系,可以看出來他和C的庫函數(shù)調(diào)用一模一樣,只不過實現(xiàn)方式,這需要你的知識積累到一定程度,有很大差別。對于一個程序員來說,我們看不出什么他們和庫函數(shù)有什么區(qū)別,這算是一種對我們的透明性。
補(bǔ)充:這個例子是我寫來學(xué)習(xí)進(jìn)程通信內(nèi)容的,由于采用了linux系統(tǒng)調(diào)用,所以只能在linux下面運(yùn)行,還有就是我沒有考慮權(quán)限問題,所以要編譯請用超級用戶root,由于消息隊列的特性,這個程序沒有釋放隊列(我把釋放代碼寫在了接受消息的程序中),第2次運(yùn)行就會報消息隊列不能創(chuàng)建的錯誤。