1

IPCプログラミングを学んでいます。その一環として、メッセージ キューについて知るために、以下の 2 つのコードを試しました。

メッセージ キュー作成者またはメッセージ送信者

struct my_msgbuf {
    long mtype;
    char mtext[200];
};

int main(void)
{
    struct my_msgbuf buf;
    int msqid;
    key_t key;
if ((key = ftok("kirk.c", 'B')) == -1) {
    perror("ftok");
    exit(1);
}

if ((msqid = msgget(key, 0644 | IPC_CREAT)) == -1) {
    perror("msgget");
    exit(1);
}

printf("Enter lines of text, ^D to quit:\n");

buf.mtype = 1; /* we don't really care in this case */

while(fgets(buf.mtext, sizeof buf.mtext, stdin) != NULL) {
    int len = strlen(buf.mtext);

    /* ditch newline at end, if it exists */
    if (buf.mtext[len-1] == '\n') buf.mtext[len-1] = '\0';

    if (msgsnd(msqid, &buf, len+1, 0) == -1) /* +1 for '\0' */
        perror("msgsnd");
}

if (msgctl(msqid, IPC_RMID, NULL) == -1) {
    perror("msgctl");
    exit(1);
}

return 0;
}

メッセージ受信者

    struct my_msgbuf {
    long mtype;
    char mtext[200];
};

int main(void)
{
    struct my_msgbuf buf;
    int msqid;
    key_t key;

    if ((key = ftok("kirk.c", 'B')) == -1) {  /* same key as kirk.c */
        perror("ftok");
        exit(1);
    }

    if ((msqid = msgget(key, 0644)) == -1) { /* connect to the queue */
        perror("msgget");
        exit(1);
    }

    printf("spock: ready to receive messages, captain.\n");

    for(;;) { /* Spock never quits! */
        if (msgrcv(msqid, &buf, sizeof(buf.mtext), 0, 0) == -1) {
            perror("msgrcv");
            exit(1);
        }
        printf("spock: \"%s\"\n", buf.mtext);
    }

    return 0;
}

上記のコードはbeej's guide for message queue にあります

"spock" msgget() を実行しようとすると、エラーがスローされます: No such file or directory. ftok() に何か問題がありますか。file のパーミッションを msgget() 関数に渡すパーミッションに変更しました。しかし、同じエラー。前もって感謝します。前もって感謝します。

4

2 に答える 2

4

ftokinode情報を使用してキーを構築するため、ファイルが存在する必要があります。それらを別々のディレクトリに構築している場合kirk.c、相対パスを使用して指定すると正しく機能するはずです。たとえばspock/spock.c、spock コードがkirk/kirk.c含まれている場合、kirk コードが含まれているspock/spock.c場合は、../kirk/kirk.c

于 2013-01-02T11:50:27.117 に答える