2016-12-24 1 views
0

私のコードに問題があります。メッセージキューを作成してメッセージを送信する必要があります。他のプログラムがそのメッセージを受信して​​応答するまでにしばらくお待ちください。問題は、私がそれを実行すると、msgsndとmsgrcvの両方で無効な引数が得られることです。メッセージキューが無効な引数を与えています

#include <stdlib.h> 
#include <unistd.h> 
#include <stdio.h> 
#include <string.h> 
#include <errno.h> 
#include <sys/types.h> 
#include <sys/msg.h> 

typedef struct my_msg{ 
    long type; 
    char text[100]; 
    char sqdr; 
}message; 

static void score(int messagge_id, char* A_B){ 
    message send; 
    send.type=1; 
    strcpy(send.text, "Try to score"); 
    send.sqdr = *A_B; 
    if((msgsnd(messagge_id, &send, sizeof(send), 0))<0)perror("Error msgsnd\n"); 
    sleep(3); 
    if((msgrcv(messagge_id, &send, sizeof(send), 4, 0))==-1)perror("Error msgrcv 1\n"); 
    int test=atoi(send.text); 
    printf("%d\n", test); 
} 


int main(){ 
    int caso, key; 
    char team= 'A'; 
    key=1234; 
    int msg_id=msgget(key, S_IRUSR|S_IWUSR); 
    printf("Try function score\n"); 
    score(msg_id, &team); 
    printf("After score\n"); 
return 0; 
} 
+2

'msgget()'呼び出しをエラーチェックしてみませんか?それは成功するか?別のプロセスがメッセージキューを作成しましたか? –

+0

私はmsggetをチェックしようとしますが、私はまだ2番目のプログラムを書いていないので、問題はメッセージキューの作成ではないと思います。使用される鍵の問題かもしれませんか? – Leo

+1

私はあなたがキー 'IPC_PRIVATE'を使用しなかったか、(' S_IRUSR | S_IWUSR'と一緒に)フラグとして 'IPC_CREAT'を指定したので、既存のメッセージに添付しなかったそれを作成していませんでした。 ['msgget()'](http://pubs.opengroup.org/onlinepubs/9699919799/functions/msgget.html)( ['msgctl()'](http://pubs.opengroup.org/)を参照してください。完了後にメッセージキューを削除するには、オンラインパブ/ 9699919799/functions/msgctl.htmlを参照してください)。キューはいったん作成されると、削除されるまで存在し続けることに注意してください。 –

答えて

0

。キー​​3210を使用するか、IPC_CREATをフラグに追加します。また、メッセージを正しく読むようにする必要があります。 'タイプ1'メッセージを送信し、 'タイプ4'メッセージを読み取ろうとしたため、読み取りがハングします。

このコードでは、メッセージキューも削除されます。プライベートキューの場合は重要ではありません(このようなキューはプログラム終了時に削除されます)。ただし、IPC_CREATとユーザー定義キーを使用するキューでは重要です。また、メッセージテキストを変更して、atoi()が何か面白くて納得のいくものを返すようにしました。コードでは、送信バッファと受信バッファが別々になっているため、コードは不正行為ではなく、バッファ内のデータを再利用していません。

#include <stdlib.h> 
#include <unistd.h> 
#include <stdio.h> 
#include <string.h> 
#include <sys/msg.h> 
#include <fcntl.h> 

typedef struct my_msg 
{ 
    long type; 
    char text[100]; 
    char sqdr; 
} message; 

static void score(int messagge_id) 
{ 
    message send; 
    message recv; 
    send.type = 1; 
    strcpy(send.text, "47 tries to score"); 
    send.sqdr = 'A'; 
    if ((msgsnd(messagge_id, &send, sizeof(send), 0)) < 0) 
     perror("Error msgsnd"); 
    printf("Dozing...\n"); 
    sleep(3); 
    printf("Unslumbering...\n"); 
    if ((msgrcv(messagge_id, &recv, sizeof(recv), -4, 0)) == -1) 
     perror("Error msgrcv"); 
    int test = atoi(recv.text); 
    printf("%d\n", test); 
} 

int main(void) 
{ 
    int key = 1234; 
    int flags = S_IRUSR|S_IWUSR|IPC_CREAT; 
    // int key = IPC_PRIVATE; 
    // int flags = S_IRUSR|S_IWUSR; 
    int msg_id = msgget(key, flags); 
    if (msg_id < 0) 
     perror("Error msgget"); 
    else 
    { 
     printf("Try function score\n"); 
     score(msg_id); 
     printf("After score\n"); 
     if (msgctl(msg_id, IPC_RMID, 0) < 0) 
      perror("Error msgctl"); 
    } 
    return 0; 
} 

出力例:

Try function score 
Dozing... 
Unslumbering... 
47 
After score 

'居眠り' と 'Unslumbering' の間の3秒間のポーズはもちろん、あります。

+0

ありがとうございます! – Leo

-1

このような使用: - あなたがメッセージキューが作成されていることを確認する必要があり

if((msgsnd(messagge_id, (void *)&send, sizeof(send), 0))<0)perror("Error msgsnd\n"); 

if((msgrcv(messagge_id, (void *)&send, sizeof(send), 4, 0))==-1)perror("Error msgrcv 1\n"); 
+0

重要な変更とは何ですか? 'void * 'へのキャストは重要ではありません。それは何も変わらない。 –

+0

完全なエラーレポートを共有してください...ありがとう – Codesingh

+0

出力は "機能スコアを試してください"エラーmsgsnd:無効な引数エラーmsgrcv:無効な引数。 – Leo

関連する問題