PVM hỗ trợ ba loại hàm nhận tin nhắn: blocking, nonblocking, và timeout. Khi gọi một hàm nhận blocking, tác vụ nhận phải đợi cho đến khi tin nhắn truyền tới bộ đệm nhận. Một hàm nhận nonblocking ngay lập tức trả về dữ liệu dự kiến hoặc một cờ mà các dữ không đến được. Hàm nhận Timeout cho phép lập trình viên xác định được khoảng thời gian mà hàm nhận phải đợi trước khi trả về. Nếu thời gian timeout quá dài , hàm này sẽ đóng vai trò như hàm nhận blocking. Mặt khác, nếu thời gian timeout được đặt là không,thì nó hoạt động giống như trường hợp nonblocking. Hình 8.5 minh họa ba kiểu hoạt động nhận.
Blocking: Nhận thông điệp có chờ
Nonblocking: Nhận thông điệp không chờ
Blocking Receive
Hàm này sẽ chờ cho đến khi một tin nhắn với thẻ label nhận được từ một tác vụ với TID= tid. Một giá trị bằng - 1 có thể được sử dụng như một kí tự đại diện để khớp với một trong các đối số: tid hoặc tag. Nhận thành công sẽ tạo ra một bộ đệm nhận và trả về bộ nhận dạng bộ đệm sử dụng trong việc giải nén tin nhắn.
Hình 8.5 Ba loại hoạt động nhận.
Nonblocking Receive
Bufid = pvm_nrecv(tid, tag)
Nếu tin nhắn đến thành công khi hàm này được gọi, nó sẽ trả về bộ nhận dạng bộ đệm tương tự như trường hợp nhận blocking. Tuy nhiên, nếu tin nhắn dự kiến đã không đến được thì ngay lập tức hàm sẽ trả về với bufid = 0.
Timeout Receive
Bufid = pvm_trecv(tid, tag, timeout)
Hàm này chặn việc thực hiện tác vụ gọi cho đến khi một tin nhắn với một tag label đã đến từ tid trong một khoảng thời gian chờ nhất định. Nếu không có tin nhắn thích hợp nào đến trong thời gian đợi xác định, hàm này sẽ trả về bufid = 0, cho biết không có tin nhắn nào được nhận. Đối số thời gian chờ (thời gian chờ đợi khi máy tính đang vận hành) là một cấu trúc với hai trường số nguyên tv_sec và tv_usec. Khi cả hai trường được đặt bằng không, hàm này sẽ đóng vai trò như một hàm nhận không chờ. Cho một con trỏ null đi qua như timeout làm cho hàm này đóng vai trò như hàm nhận chờ. Nếu hàm pvm_trecv () có hiệu lực, bufid sẽ có giá trị của bộ nhận dạng bộ đệm nhận hoạt động mới.
Tiếp nhận và giải nén trong Một Bước (Receive and Unpack in One Step) Tương
tự như hàm pvm_psend (), PVM cung cấp hàm pvm_precv (), hàm này kết hợp các hàm nhận chờ và giải nén trong một đoạn chương trình. Nó không trả về bộ nhận dạng bộ đệm, thay vào đó nó sẽ trả về các giá trị thực . Ví dụ, lời gọi hàm sau đây
Info = pvm_precv(tid, tag, my_array, len, datatype, &src,&atag, &alen) sẽ chặn cho
đến khi một tin nhắn phù hợp được nhận. Các nội dung của tin nhắn sẽ được lưu trong mảng my_array lên đến chiều dài len. Ngoài các info mã trạng thái, TID thực sự của đối tượng gửi, tag tin nhắn thực, và độ dài tin nhắn thực lần lượt được trả về trong src, ATAG, và alen tương ứng. Một lần nữa, giá trị - 1 có thể được sử dụng như một kí tự đại diện cho các đối số: tag or tid.