c語言msgsnd函數(shù) c語言mid函數(shù)使用方法

linux c語言進程間通信疑問,上述程序只是想父進程創(chuàng)建一個消息隊列,發(fā)給子進程消息,但是為什么沒有成功

創(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è)形象加強企業(yè)競爭力??沙浞譂M足這一群體相比中小企業(yè)更為豐富、高端、多元的互聯(lián)網(wǎng)需求。同時我們時刻保持專業(yè)、時尚、前沿,時刻以成就客戶成長自我,堅持不斷學習、思考、沉淀、凈化自己,讓我們?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)生的是兩個進程,他們的資源是相互獨立的。

fork()之后創(chuàng)建的消息隊列,另一個進程不能識別。

關(guān)于c語言中消息隊列發(fā)送的結(jié)構(gòu)體?

消息隊列正常定義的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操作系統(tǒng)中 使用系統(tǒng)調(diào)用的一般方式是怎樣的?

給個例子給你看看吧,這里是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,當然你也可以手動指定,當你運氣很好沒有和已經(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表示如果隊列中消息滿了當前進程不等待直接返回錯誤,反之很容易理解吧

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,當然你也可以手動指定,當你運氣很好沒有和已經(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ù)。

這里涉及到進程通信中的消息隊列內(nèi)容,如果不明白沒什么關(guān)系,可以看出來他和C的庫函數(shù)調(diào)用一模一樣,只不過實現(xiàn)方式,這需要你的知識積累到一定程度,有很大差別。對于一個程序員來說,我們看不出什么他們和庫函數(shù)有什么區(qū)別,這算是一種對我們的透明性。

補充:這個例子是我寫來學習進程通信內(nèi)容的,由于采用了linux系統(tǒng)調(diào)用,所以只能在linux下面運行,還有就是我沒有考慮權(quán)限問題,所以要編譯請用超級用戶root,由于消息隊列的特性,這個程序沒有釋放隊列(我把釋放代碼寫在了接受消息的程序中),第2次運行就會報消息隊列不能創(chuàng)建的錯誤。

當前名稱:c語言msgsnd函數(shù) c語言mid函數(shù)使用方法
URL分享:http://bm7419.com/article0/dohjcio.html

成都網(wǎng)站建設(shè)公司_創(chuàng)新互聯(lián),為您提供電子商務(wù)、建站公司、網(wǎng)站設(shè)計公司、移動網(wǎng)站建設(shè)、網(wǎng)站制作、小程序開發(fā)

廣告

聲明:本網(wǎng)站發(fā)布的內(nèi)容(圖片、視頻和文字)以用戶投稿、用戶轉(zhuǎn)載內(nèi)容為主,如果涉及侵權(quán)請盡快告知,我們將會在第一時間刪除。文章觀點不代表本網(wǎng)站立場,如需處理請聯(lián)系客服。電話:028-86922220;郵箱:631063699@qq.com。內(nèi)容未經(jīng)允許不得轉(zhuǎn)載,或轉(zhuǎn)載時需注明來源: 創(chuàng)新互聯(lián)

網(wǎng)站托管運營