Tôi có một số mã gọi recv()
theo định kỳ (với cờ MSG_DONTWAIT
). Tôi tò mò vì profiling mã của tôi trong vtune, tôi thấy một cuộc gọi sigprocmask()
liên kết với các recv()
, và nó chiếm một phần lớn trong tổng thời gian để thực thi. Tôi tò mò tại sao recv()
đang gọi sigprocmask()
.Tại sao sigprocmask được gọi khi gọi đến hệ thống gọi lại?
6
A
Trả lời
0
Có lẽ do đó recv có thể cho biết các tín hiệu có liên quan được tạo ra nếu không sẽ không được nhìn thấy nếu các tín hiệu đã bị chặn. EAGAIN/EWOULDBLOCK đến tâm trí như là giá trị của errno đôi khi được tạo ra bằng cách sử dụng tín hiệu có thể có thể bị chặn. Bạn có nhìn vào số sigprocmask
man page không?
1
Khi làm việc với TCP socket dưới Linux, bạn sẽ nhận được SIGPIPE nếu mặt kia bị đóng bất ngờ.
Vì bạn có thể che dấu tín hiệu này (hầu hết thời gian, bạn sẽ tự động xử lý giá trị trả về là 0, bạn không quan tâm đến tín hiệu này), tôi đoán kiểm tra thư viện hệ thống cho trạng thái tín hiệu, và nếu được đeo mặt nạ, hãy sử dụng đường dẫn mã nhanh hơn.
Nếu không, nó không thể tối ưu hóa.
BTW, bạn biết về pselect() phải không?
Các vấn đề liên quan
- 1. Linux reboot() gọi hệ thống: tại sao nó gọi do_exit (0) sau kernel_halt()?
- 2. hệ thống awk gọi
- 3. Gọi hệ thống trong ARM
- 4. Query trên Chọn hệ thống Gọi
- 5. SpriteBatch: "Bắt đầu không thể được gọi lại cho đến khi End được gọi thành công."
- 6. Bỏ qua cuộc gọi hệ thống
- 7. Ruby: tại sao lại gọi to_ary?
- 8. Mutex truy cập và hệ thống gọi
- 9. Tại sao IO dựa trên điều tra viên gọi là sigprocmask thường xuyên như vậy?
- 10. Tại sao một lớp học được gọi là "được gọi" khi không được bắt đầu? - Python
- 11. Bàn điều khiển Supress khi gọi "hệ thống" trong C++
- 12. Tại sao cuộc gọi lại jQuery.get() của tôi không được gọi?
- 13. Tại sao gọi base.OnStop() khi Windows Service dừng lại?
- 14. gọi lại jquery được gọi nhiều lần
- 15. Cuộc gọi hệ thống trên Windows
- 16. open() gọi hệ thống đa hình
- 17. cờ cho st_mode gọi hệ thống stat
- 18. Tại sao bạn lại bắt được InterruptedException để gọi Thread.currentThread.interrupt()?
- 19. Android TTS onUtteranceMọi lại gọi lại không được gọi là
- 20. Tại sao __PRETTY_FUNCTION__ được gọi là __PRETTY_FUNCTION__?
- 21. Có phải Fragment.setUserVisibleHint() được gọi bởi Hệ thống Android không?
- 22. Tại sao malloc() và printf() được gọi là không reentrant?
- 23. Tại sao nó được gọi là BSON?
- 24. Tại sao navigationItem.titleView căn chỉnh trái khi presentmodalviewcontroller được gọi?
- 25. Tại sao hàm hủy python được gọi?
- 26. Tại sao onKey() được gọi hai lần?
- 27. Tại sao nó được gọi là onBlur?
- 28. Tại sao UncaughtExceptionHandler không được ExecutorService gọi?
- 29. tại sao textFieldDidEndEditing: không được gọi?
- 30. tại sao "onPause" không được gọi trong tình huống sau?
Chúng ta có thể thấy dấu vết có liên quan của mã nhỏ nhất có thể tái tạo hành vi này không? Chúng ta có thể thấy mã demo đó không? Nó sẽ được chiếu sáng để xem chính xác những gì đang được thực hiện cho mặt nạ tín hiệu. – pilcrow
Bạn có thể giải thích về ngữ cảnh của những lời gọi đó đến 'recv()' không? Bạn đang sử dụng loại ổ cắm nào? Bạn đang gọi 'recv()' trực tiếp? – alk