2013-10-22 89 views
2

我還有兩個問題。 1.如何將消息隊列名稱作爲命令行參數傳遞?比如我寫:MessageQueue名稱和消息隊列大小

char src[50] , dest[50]; 
strcpy(src , "/"); 
strcpy(dest , argv[1]); // argv[1] is the name of message queue 
strcat(dest , src); 
char *msgqueue; 
strcpy(msgqueue , dest); 

然而,它給分段錯誤,當我更改爲char msgqueue [50],而不是有效的錯誤出現。

  1. 如何才能達到消息隊列中元素的數量?我試過m_attr.mq_msgsize,但我發現它沒有給出答案。

我需要你的幫助,請他們是完成作業的最後一步!

謝謝大家!

回答

1
char *msgqueue; //allocate memory and then copy 
strcpy(msgqueue , dest); 

msgqueue=strdup(dest);  

正如約阿希姆Pileborg建議

如果不需要更多的修飾,只是msgqueue = dest;

而且要argv[1]複製到消息隊列然後在最後加上「/」。

char *msgqueue=malloc(strlen(argv[1])+3); //one for null byte and another one for/for safe use one extra byte 

strcpy(msgqueue,argv[1]); 
strcat(msgqueue,"/"); 
+2

或者,如果不需要更多的修飾,只是'msgqueue = DEST;' –

+0

@JoachimPileborg是...將此添加到我的answer.thanks – Gangadhar

+1

謝謝你們現在的工作都:) – Begumm

0

您應該爲msgqueu分配內存。例如,

msgqueue = malloc(255);

和somwhere您應該釋放該內存 查看關於memory allocation in C

0

我怎樣才能達到一個消息隊列中元素的個數?我試過m_attr.mq_msgsize,但我發現它沒有給出答案。

我假設你指的是隊列中當前有多少條消息。您爲此使用mq_getattr。您已在服務器中使用mq_getattr,但您正在查看不同的字段。你想要mq_curmsgs

我假設你想看看這個,因爲你想知道你的服務器上有多少mq_receives要做,以便你不會阻止接收一個msg,永遠不會到達。這是做這件事的一種方式,但它不是萬無一失的,因爲當你的服務器檢查有多少消息和你的客戶端停止寫消息時,總會有一種競爭狀態。還有其他選擇(例如輪詢,定時接收和mq_notify的非阻塞隊列),但對於您的情況最簡單的方法是僅使用客戶端發送的單獨消息,通知服務器「我已完成」。

+0

是的,你提到了一個好點,我的問題正是你所說的。謝謝! – Begumm

+1

@Begumm - 不客氣。我認爲你現在有足夠的聲望來獎勵積分,所以你應該考慮回顧你的問題,並提出你認爲有用的答案。 – Duck

+0

抱歉,我沒有正確理解我應該做什麼。我怎樣才能投票回答? – Begumm