LoveUnix » 编程开发 & Rational » 如何设置消息队列的超时?
让LU留住您的每

一天 让LU博客留住您的每一天
2006-7-15 18:33 chb_412
如何设置消息队列的超时?

--------------------------------------------------------------------------------

想用select  但运行不起  大家帮我看看好麻?
void *function1( void *ptr );
void *function2( void *ptr );
int readable_time (long fd, int sec);

struct msg_send
{
        long mtype; /* 消息类型 */  
        int fd;//相关套接口
        char mtext[350]; /* 消息的文本 */
}msend, mrecv;
key_t sendkey = 0x1212;

main( )
{
        long msgid;
        msgid = msgget(sendkey, IPC_CREAT | 0666);
        if (msgid < 0)
                perror ("msgget_send:");
        printf ("MSGID_SEND is %ld\n", msgid);

    pthread_t thread1;
    pthread_create( &thread1, NULL, function1, NULL);
        while (true)
        {
                sleep (1);
                msend.mtype = 2;
                msend.fd = 1;
        printf ("11111111111111111\n");
                memcpy(msend.mtext, "12345423", sizeof ("12345423"));
                if (!msgsnd (msgid, &msend, sizeof (msend.mtext), IPC_NOWAIT) == 0){
                        perror ("msgsnd:\n");
                }
                sleep (10);

        }
    exit( 0 ) ;
}
   
void *function1( void *ptr )
{
        int sec = 20, a;
        long msgid;
        msgid = msgget(sendkey, IPC_CREAT | 0666);
        long fd = msgid;
        while (1)
        {
                a = readable_time (fd, sec);
                switch (a)
                {
                        case 0:
                                printf ("select overtime! \n");
                                break;
                        case -1:
                                printf ("select return an error\n");
                                break;
                        default:
                                printf ("there an msg come!\n");
                                if (msgrcv(msgid, &mrecv,sizeof (mrecv.mtext), 0, MSG_NOERROR) == -1){
                                        perror ("msgrcv\n");
                                }
                                struct msg_send msg;
                                msg.mtype = mrecv.mtype;
                                msg.fd = mrecv.fd;
                                memcpy (msg.mtext, mrecv.mtext, sizeof(mrecv.mtext));
                                printf ("type = %d, fd = %d, mtext = %s\n", msg.mtype, msg.fd, msg.mtext);
                }// endof swhitch
        }//endof while(1)
}
   
int readable_time (long fd, int sec)
{
        fd_set fdrset;
        struct timeval tv;
        FD_ZERO (&fdrset);
        FD_SET (fd, &fdrset);
        tv.tv_sec = sec;
        tv.tv_usec = 0;
        return (select(fd + 1, &fdrset, NULL, NULL, &tv));
}
执行到        FD_SET (fd, &fdrset);时候出现段错误  是否select不能用来设置消息队列超时? 如果这样 怎么达到这个目的呢?

2006-7-18 14:29 jxppp
我机器上的运行结果,一切正常。除非你的是64位机器:lu2:
[code]
MSGID_SEND is 0
11111111111111111
11111111111111111
select overtime!
11111111111111111
11111111111111111
select overtime!
11111111111111111
11111111111111111
select overtime!
11111111111111111
11111111111111111
select overtime!
11111111111111111
select overtime!
11111111111111111
11111111111111111
select overtime!
11111111111111111
11111111111111111
select overtime!
11111111111111111
11111111111111111
select overtime!
11111111111111111
11111111111111111
select overtime!
11111111111111111
11111111111111111
select overtime!
11111111111111111
[/code]

2006-7-18 20:41 chb_412
回复 #2 jxppp 的帖子

我的机器是sp 2500+ 确实64位的  怎么办呢???  怎么才能设置消息队列超时呢?

2006-7-18 21:33 jxppp
[code]
long msgid;   ---> int msgid

int readable_time (long fd, int sec)  ---> int readable_time (int fd, int sec)

int msgget(key_t key, int msgflg);
void FD_SET(int fd, fd_set *fdset);
[/code]
注意32bit和64位机的long int的不同 :lol

2006-7-18 22:09 chb_412
回复 #4 jxppp 的帖子

怎么解决呢??  long改成int?

2006-7-18 22:27 jxppp
对的。你试试看。

2006-7-19 09:41 chb_412
回复 #6 jxppp 的帖子

经验证  改位int是不行的   你的msgid恰好为0   当你删掉改消息队列 重建的时候  为其它值便无法运行
好像select是不能监听消息队列的吧   如果是这样  就死心了:)

2006-7-19 10:55 jxppp
是的。
select是不能监听消息队列的。
以前看了篇文章依稀记得好像可以,又搜了一下看了看不行:$
http://linuxgazette.net/issue92/hawk.html

但是问题是为啥你的会出错呢?
[code]
[xxx@localhost 1]$ ./a.out
MSGID_SEND is 32768
11111111111111111
11111111111111111
select overtime!
11111111111111111
[/code]

2006-7-19 11:18 chb_412
[quote]原帖由 [i]jxppp[/i] 于 2006-7-19 10:55 发表
是的。
select是不能监听消息队列的。
以前看了篇文章依稀记得好像可以,又搜了一下看了看不行:$
[url]http://linuxgazette.net/issue92/hawk.html[/url]

但是问题是为啥你的会出错呢?
[code]
[xxx@localhost 1]$ . ... [/quote]


^_^ 谢谢了哈  但你哪个虽然不报错  也没有成功传递消息啊  老是select=0
你把select时间延长点 高过主线程sleet(10)试试能收到不

2006-7-19 11:21 jxppp
不能收到的。
都不支持收不倒的。。。。:$
纯粹变成延时的了。。

页: [1]


Powered by Discuz! Archiver 5.5.0  © 2001-2006 Comsenz Inc.