Tôi đang làm việc trên một daemon Haskell sử dụng POSIX fork/exec cùng với cơ chế khóa tệp. Thử nghiệm của tôi cho thấy khóa tệp không được kế thừa trong thời gian executeFile
với thời gian hoạt động -threaded
(xem thêm this thread), cho dù tôi có sử dụng +RTS -N
hay không. Vì vậy, tôi muốn thêm một kiểm tra để chắc chắn rằng daemon không được biên dịch với -threaded
. Có cách nào để phát hiện ra nó không?Làm thế nào để phát hiện xem một chương trình đã được biên dịch bằng cách sử dụng -readed?
13
A
Trả lời
13
Có một value trong Control.Concurrent
cho điều này, ví dụ:
module Main (main) where
import Control.Concurrent
main :: IO()
main = print rtsSupportsBoundThreads
Và kiểm tra:
$ ghc -fforce-recomp Test.hs; ./Test
[1 of 1] Compiling Main (Test.hs, Test.o)
Linking Test ...
False
$ ghc -fforce-recomp -threaded Test.hs; ./Test
[1 of 1] Compiling Main (Test.hs, Test.o)
Linking Test ...
True
Và đó là C-phần source code:
HsBool
rtsSupportsBoundThreads(void)
{
#if defined(THREADED_RTS)
return HS_BOOL_TRUE;
#else
return HS_BOOL_FALSE;
#endif
}
1
Đây là một bẩn hack và có thể không di động nhưng tôi có thể khẳng định nó hoạt động cho GHC-7.6.3 trên linux:
isThreaded :: IO (Maybe Bool)
isThreaded = do
tid <- forkIO $ threadDelay 1000000
yield
stat <- threadStatus tid
killThread tid
case stat of
ThreadBlocked BlockedOnMVar -> return (Just True)
ThreadBlocked BlockedOnOther -> return (Just False)
_ -> return Nothing
Xem BlockedOnOther docstring để biết chi tiết.
Các vấn đề liên quan
- 1. Làm thế nào để biên dịch một chương trình SDL ví dụ được viết bằng C?
- 2. Làm thế nào để biên dịch một chương trình clisp sử dụng cl-ppcre?
- 3. Làm cách nào để gỡ lỗi chương trình được biên dịch bằng 'make'?
- 4. Trán Python, làm thế nào để có được một trình biên dịch sẽ được sử dụng?
- 5. Làm thế nào để thực hiện chương trình một bộ thử nghiệm bằng cách sử dụng JUnit4 theo chương trình?
- 6. Làm thế nào để chạy chương trình được viết cho trình biên dịch cũ?
- 7. Làm thế nào để biên dịch python chương trình embeded đơn giản sử dụng distutils
- 8. Làm thế nào để xác định trình biên dịch nào đã được sử dụng để biên dịch một tệp thực thi?
- 9. Làm thế nào để thực hiện một dịch vụ Web REST bằng cách sử dụng Akka?
- 10. Biên dịch bất kỳ Chương trình C nào bằng cách sử dụng "make" (01 makefile)
- 11. Bạn có thể tìm ra trình biên dịch nào được sử dụng để biên dịch chương trình không?
- 12. Biên dịch một tệp Java ... bằng một chương trình Java
- 13. C# được biên dịch bằng đơn âm - Phát hiện OS
- 14. Làm thế nào để timeout một chương trình chạy dài bằng cách sử dụng rxpython?
- 15. Làm thế nào tôi có thể đảo ngược kỹ sư một chương trình Perl đã được biên dịch với perlcc?
- 16. Làm thế nào để khẳng định rằng C++ 11 nên được sử dụng để biên dịch chương trình của tôi?
- 17. Làm cách nào để phát hiện xem một MapView Android đã được quét hoặc thu nhỏ?
- 18. Làm thế nào để cài đặt CLang bằng cách sử dụng nhị phân biên dịch sẵn?
- 19. Làm thế nào để biên dịch chương trình đi trong 1.1.2 với các phụ thuộc được biên dịch trong 1.1.1?
- 20. Làm thế nào để bạn nhận được bao nhiêu bộ nhớ một chương trình sử dụng?
- 21. Phát hiện trình biên dịch với #ifdef
- 22. Có cách nào để phát hiện phiên bản trình biên dịch từ bên trong chương trình Rust không?
- 23. SFINAE: Phát hiện nếu hàm được gọi bằng giá trị đã biết thời gian biên dịch
- 24. Phát hiện xem ứng dụng đã được gỡ cài đặt
- 25. Làm thế nào để phát hiện xem một loại là một biểu thức lambda tại thời gian biên dịch?
- 26. Làm thế nào tôi có thể biên dịch một chương trình Rust để nó không sử dụng __cxa_thread_atexit_impl?
- 27. Lỗi Hiphop khi chạy chương trình đã biên dịch
- 28. Làm cách nào để sử dụng bitbake để biên dịch chương trình đơn giản này cho beagleboard?
- 29. Sử dụng OpenGL/GLUT làm cách nào để phát hiện xem hai khóa có được giữ cùng lúc không?
- 30. làm thế nào để biên dịch và chạy chương trình java trong một chương trình java khác?
'setNumCapabilities 2' và kiểm tra rằng 'getNumCapabilities' trả về 1? – Yuras