문제

System v 메시지 큐가있는 더 큰 응용 프로그램에있는 문제를 복제하는 다음 응용 프로그램이 있습니다. 기본적으로 기본 함수는 키를 생성 한 다음 msgget ()로 메시지 큐를 만듭니다. 그런 다음 각각 다른 ID로 3 개의 포크가 생성됩니다. 그들 각각은 다른 속성 숫자로 msgrcv를 실행합니다 (따라서 다른 메시지를 기다리고 있습니다).

메인은 몇 초 동안 잠을 자고 A id = 3으로 메시지를 보냅니다. 그렇지 않습니다 깨어나지 만 대신 다른 실. 이 코드는 완전히 격리되어 직접 시도해 볼 수 있습니다. 이 코드에 무슨 문제가 있습니까?

#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
#include <sys/types.h>
#include <sys/ipc.h>
#include <sys/msg.h>
#include <sys/wait.h>

struct dummy_struct {
    long mtype;
    char message[255];
};

int msg_queue_id;
void recv_thread(int id);

int main(int argc, char **argv)
{
    int i;
    key_t key;
    struct dummy_struct dummy = { 3, "hello" };

    //create a unique key
    if (key = ftok("/mnt/mydocuments/code/sys_v_fork_test/main.c", 'a') == -1)
    {
        printf("ftok didn't work\n");
        exit(1);
    }

    //create the unix sys 5 message queue
    if ((msg_queue_id = msgget(key, 0644 | IPC_CREAT)) == -1)
    {
        printf("msgget failed\n");
        exit(1);
    }
    else
        printf("my message queue id: %i\n", msg_queue_id);

    //fork off multiple recievers
    for (i = 1; i < 4; i++) // <- NOTE: 1 -> 4
    {
        if (fork() == 0)
            recv_thread(i);
    }

    printf("sleeping\n");
    sleep(5);

    //wait a little then send a message

    printf("sending message\n");
    if (msgsnd(msg_queue_id, &dummy, sizeof(struct dummy_struct), 0) == -1)
    {
        printf("msgsnd failed\n");
    }
    printf("main thread exiting");
    _exit(0);
}

void recv_thread(int id)
{
    struct dummy_struct dummy;

    printf("recv_thread with id: %i\n", id);

    if (msgrcv(msg_queue_id, &dummy, sizeof(struct dummy_struct), id, 0) == -1)
        printf("error in msgrcv\n");
    else
        printf("thread %i got %s back\n", id, dummy.message);
}

내가 2를 기다리면 구조물이 mtype 세트를 포함하는 메시지를 의미합니다. 바로 그거죠 2. 3은 3입니다. 내 참조 요점은이 안내서였습니다. http://www.ecst.csuchico.edu/~beej/guide/ipc/mq.html. 누구든지 제발 도와 줄 수 있습니까? (자신의 컴퓨터의 유효한 파일을 가리려면 FTOK 코드 줄을 수정해야 할 수도 있습니다). 나는 Eeepc 1000h에서 Fedora 10을 실행하고 있습니다

도움이 되었습니까?

해결책

아, 내가 고쳐 졌다고 생각합니다. "mtype"구조에 첫 번째 멤버를 설정하기 위해 int를 사용하고 있었기 때문입니다. {1l, "hello"}를 대신 통과하고 i의 정의를 long으로 변경하면 고정 된 것 같습니다.

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top