2012-10-09 28 views
10

tôi muốn biết liệu tin nhắn xếp hàng có trống hay không. tôi đã sử dụng msg_ctl() như sau nó không hoạt động:Linux: Kiểm tra xem hàng đợi tin nhắn có trống không

struct msqid_ds buf; 
int num_messages; 

rc = msgctl(msqid, IPC_STAT, &buf); 

và tôi đã sử dụng chức năng này ú:

int peek_message(int qid, long type) 
{ 
    int result, length; 
    if((result = msgrcv(qid, NULL, 0, type, IPC_NOWAIT)) == -1) { 
     if(errno==E2BIG) 
      return(1); 
    } 

    return(0); 
} 

trong cả hai trường hợp tôi nhận được kết quả tương tự trước và sau khi gửi một tin nhắn đến hàng đợi.

thư được gửi đến hàng đợi thành công, tôi đã thử nghiệm với việc đọc những gì tôi đã gửi.

+0

"nó không hoạt động"? - nó làm gì? Bạn có nhận được một thông báo lỗi? Liệu nó có trả về một giá trị không mong muốn? Giá trị nào? – sehe

+0

ý tôi là, tôi nhận được 0 tin nhắn –

+1

Và trong trường hợp đầu tiên bạn đang kiểm tra buf.msg_qnum? Điều đó không rõ ràng vì bạn cũng có "int num_messages" không giải thích được. – Duck

Trả lời

1

tôi đã viết đoạn code mẫu mà dường như để làm việc đúng cách:

#include <sys/types.h> 
#include <sys/ipc.h> 
#include <sys/msg.h> 
#include <stdio.h> 
#include <errno.h> 

struct msgbuf { 
    long mtype;  /* message type, must be > 0 */ 
    char mtext[1]; /* message data */ 
}; 

int main(void) { 
    int msqid; 
    //msqid = msgget(IPC_PRIVATE, (IPC_CREAT | IPC_EXCL | 0600)); 
    msqid = msgget((key_t)1235, 0600 | IPC_CREAT); 

    printf("Using message queue %d\n", msqid); 
    struct msqid_ds buf; 

    int rc = msgctl(msqid, IPC_STAT, &buf); 

    uint msg = (uint)(buf.msg_qnum); 
    printf("# messages before post: %u\n", msg); 

    printf("Posting message to queue...\n"); 
    struct msgbuf qmsg; 
    qmsg.mtype = 100; 
    qmsg.mtext[0] = 'T'; 

    int res = msgsnd(msqid, &qmsg, 1, MSG_NOERROR); 

    rc = msgctl(msqid, IPC_STAT, &buf); 

    msg = (uint)(buf.msg_qnum); 
    printf("# messages after post: %u\n", msg); 

    return 0; 
} 

Có lẽ đó sẽ rất hữu ích đối với bạn? Số lượng thư trên hàng đợi dường như tăng lên một cách chính xác khi sử dụng mã này.

Các vấn đề liên quan