2012-04-09 45 views
5

Tôi đã tìm thấy đoạn mã này trong gói Haskell sendfile:'#type' có nghĩa là gì trong Giao diện chức năng nước ngoài của Haskell?

http://patch-tag.com/r/mae/sendfile/snapshot/current/content/pretty/src/Network/Socket/SendFile/Linux.hsc

-- sendfile64 gives LFS support 
foreign import ccall unsafe "sendfile64" c_sendfile 
    :: Fd -> Fd -> Ptr (#type off64_t) -> (#type size_t) -> IO (#type ssize_t) 

1) gì #type nghĩa và 2) tại sao tôi nhận được lỗi này,

[1 of 1] Compiling Linux.Splice  (splice.hs, splice.o) 

splice.hs:40:12: parse error on input `type' 

khi bản thân tôi cố gắng sử dụng nó như sau ?:

ghc --make splice.hs 

splice.hs:

{-# LANGUAGE ForeignFunctionInterface #-} 

module Linux.Splice where 

import Data.Word 
import System.Posix.Types 

-- SPLICE 

-- fcntl.h 
-- ssize_t splice(
-- int   fd_in, 
-- loff_t*  off_in, 
-- int   fd_out, 
-- loff_t*  off_out, 
-- size_t  len, 
-- unsigned int flags 
--); 

foreign import ccall unsafe "fnctl.h splice" c_splice 
    :: Fd 
    -> Ptr (#type {- < parse error -} loff_t) 
    -> Fd 
    -> Ptr (#type loff_t) 
    -> (#type size_t) 
    -> Word 
    -> IO (#type ssize_t) 

(sử dụng GHC 7.4.x)

+5

http://www.haskell.org/ghc/docs/latest/html/users_guide/hsc2hs.html – sdcvvc

+2

Tôi nên chỉ ra rằng nhập khẩu nước ngoài này không được ** đánh dấu là 'không an toàn'. Khi một hàm ngoài đánh dấu các khối 'không an toàn', nó có thể ngăn chặn các luồng khác chạy (trong một chương trình được biên dịch bằng GHC với '-readed'). –

+0

@JoeyAdams Oh cảm ơn rất nhiều vì đã chỉ ra điều đó! Tôi đang làm việc trên một thực hiện được đánh bóng của nối ống nối mạng cho máy chủ proxy của tôi. Mà tôi hy vọng sẽ sử dụng trên Linux thay vì đọc/ghi vòng tôi vẫn sẽ tiếp tục sử dụng trên hệ điều hành khác trong thời gian này. –

Trả lời

5

Như đã chỉ ra bởi scdvvc, này sử dụng các macro C tiền xử lý theo quy định của hsc2hs để tùy chỉnh mã đặc biệt để hệ thống nó được biên soạn trên. Bạn cần phải sử dụng hsc2hs để nhận các macro thích hợp được xác định cho mã của bạn.

+0

Xin cảm ơn vì câu trả lời nhanh :) –

+0

Btw, ai/'scdvvc' là gì? –

+2

Người nhận xét về câu hỏi ban đầu của bạn, người thực sự xứng đáng nhận được nhiều tín dụng hơn tôi. ;) –

Các vấn đề liên quan