Function nc::mq_timedreceive

source ·
pub unsafe fn mq_timedreceive(
    mqdes: mqd_t,
    msg: &mut [u8],
    msg_len: usize,
    msg_prio: &mut u32,
    abs_timeout: &timespec_t
) -> Result<ssize_t, Errno>
Expand description

Receive a message from a message queue

§Example

let name = "nc-mq-timedreceive";
let ret = unsafe {
    nc::mq_open(
        name,
        nc::O_CREAT | nc::O_RDWR | nc::O_EXCL,
        (nc::S_IRUSR | nc::S_IWUSR) as nc::umode_t,
        None,
    )
};
assert!(ret.is_ok());
let mq_id = ret.unwrap();

let mut attr = nc::mq_attr_t::default();
let ret = unsafe { nc::mq_getsetattr(mq_id, None, Some(&mut attr)) };
assert!(ret.is_ok());
println!("attr: {:?}", attr);

let msg = "Hello, Rust";
let prio = 42;
let timeout = nc::timespec_t {
    tv_sec: 1,
    tv_nsec: 0,
};
let ret = unsafe { nc::mq_timedsend(mq_id, msg.as_bytes(), msg.len(), prio, &timeout) };
assert!(ret.is_ok());

let ret = unsafe { nc::mq_getsetattr(mq_id, None, Some(&mut attr)) };
assert!(ret.is_ok());
assert_eq!(attr.mq_curmsgs, 1);

let mut buf = vec![0_u8; attr.mq_msgsize as usize];
let buf_len = buf.len();
let mut recv_prio = 0;
let read_timeout = nc::timespec_t {
    tv_sec: 1,
    tv_nsec: 0,
};
let ret = unsafe { nc::mq_timedreceive(mq_id, &mut buf, buf_len, &mut recv_prio, &read_timeout) };
if let Err(errno) = ret {
    eprintln!("mq_timedreceive() error: {}", nc::strerror(errno));
}
assert!(ret.is_ok());
let n_read = ret.unwrap() as usize;
assert_eq!(n_read, msg.len());

let ret = unsafe { nc::close(mq_id) };
assert!(ret.is_ok());
let ret = unsafe { nc::mq_unlink(name) };
assert!(ret.is_ok());
Examples found in repository?
examples/mq.rs (line 44)
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
fn main() {
    let name = "nc-mq-notify";
    let ret = unsafe {
        nc::mq_open(
            name,
            nc::O_CREAT | nc::O_RDWR | nc::O_EXCL,
            (nc::S_IRUSR | nc::S_IWUSR) as nc::umode_t,
            None,
        )
    };
    assert!(ret.is_ok());
    let mq_id = ret.unwrap();

    let mut attr = nc::mq_attr_t::default();
    let ret = unsafe { nc::mq_getsetattr(mq_id, None, Some(&mut attr)) };
    assert!(ret.is_ok());
    println!("attr: {:?}", attr);

    let msg = "Hello, Rust";
    let prio = 42;
    let timeout = nc::timespec_t {
        tv_sec: 1,
        tv_nsec: 0,
    };
    let ret = unsafe { nc::mq_timedsend(mq_id, msg.as_bytes(), msg.len(), prio, &timeout) };
    assert!(ret.is_ok());

    let ret = unsafe { nc::mq_getsetattr(mq_id, None, Some(&mut attr)) };
    assert!(ret.is_ok());
    assert_eq!(attr.mq_curmsgs, 1);

    let mut buf = vec![0_u8; attr.mq_msgsize as usize];
    let buf_len = buf.len();
    let mut recv_prio = 0;
    let read_timeout = nc::timespec_t {
        tv_sec: 1,
        tv_nsec: 0,
    };
    let ret =
        unsafe { nc::mq_timedreceive(mq_id, &mut buf, buf_len, &mut recv_prio, &read_timeout) };
    if let Err(errno) = ret {
        eprintln!("mq_timedreceive() error: {}", nc::strerror(errno));
    }
    assert!(ret.is_ok());
    let n_read = ret.unwrap() as usize;
    assert_eq!(n_read, msg.len());

    let ret = unsafe { nc::close(mq_id) };
    assert!(ret.is_ok());
    let ret = unsafe { nc::mq_unlink(name) };
    assert!(ret.is_ok());
}