我正在尝试用 Go 包装 FUSE。然而,我一直在思考如何处理 struct fuse_operations。我似乎无法通过声明 type Operations C.struct_fuse_operations 来公开操作结构,因为成员是小写的,而且我的纯 Go 源无论如何都必须使用 C-hackery 来设置成员。在这种情况下,我的第一个错误是“无法设置 getattr”,它看起来相当于 Go 中的默认复制构造函数。我的下一个尝试是公开一个需要 GetAttr、ReadLink 等的接口(interface),然后生成 C.struct_fuse_operations 并将函数指针绑定(bind)到闭包调用给定的接口(interface)。
这就是我得到的(代码后继续解释):
package fuse
// #include <fuse.h>
// #include <stdlib.h>
import "C"
import (
//"fmt"
"os"
"unsafe"
)
type Operations interface {
GetAttr(string, *os.FileInfo) int
}
func Main(args []string, ops Operations) int {
argv := make([]*C.char, len(args) + 1)
for i, s := range args {
p := C.CString(s)
defer C.free(unsafe.Pointer(p))
argv[i] = p
}
cop := new(C.struct_fuse_operations)
cop.getattr = func(*C.char, *C.struct_stat) int {}
argc := C.int(len(args))
return int(C.fuse_main_real(argc, &argv[0], cop, C.size_t(unsafe.Sizeof(cop)), nil))
}
package main
import (
"fmt"
"fuse"
"os"
)
type CpfsOps struct {
a int
}
func (me *CpfsOps) GetAttr(string, *os.FileInfo) int {
return -1;
}
func main() {
fmt.Println(os.Args)
ops := &CpfsOps{}
fmt.Println("fuse main returned", fuse.Main(os.Args, ops))
}
这会产生以下错误:
fuse.go:21[fuse.cgo1.go:23]: cannot use func literal (type func(*_Ctype_char, *_Ctype_struct_stat) int) as type *[0]uint8 in assignment
我不确定要将什么传递给 C.struct_fuse_operations 的这些成员,而且我在一些地方看到提到不可能从 C 调用回 Go 代码。
如果可以,我应该怎么做?我如何为接口(interface)函数提供“默认”值,就像相应的 C.struct_fuse_operations 成员设置为 NULL 一样?
最佳答案
http://cheesesun.blogspot.com/2010/04/callbacks-in-cgo.html描述了一种通用的 - 如果有些复杂 - 技术。 http://groups.google.com/group/golang-nuts/browse_thread/thread/abd0e30dafdbf297?tvc=2&pli=1描述问题。
我怀疑如果您想将函数指针作为除 uintptrs 以外的任何东西来处理,您将不得不破解 cgo。
关于c - 从 Go 包装 FUSE,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4301964/
只是想确保我理解了事情。据我目前收集到的信息,Cucumber只是一个“包装器”,或者是一种通过将事物分类为功能和步骤来组织测试的好方法,其中实际的单元测试处于步骤阶段。它允许您根据事物的工作方式组织您的测试。对吗? 最佳答案 有点。它是一种组织测试的方式,但不仅如此。它的行为就像最初的Rails集成测试一样,但更易于使用。这里最大的好处是您的session在整个Scenario中保持透明。关于Cucumber的另一件事是您(应该)从使用您的代码的浏览器或客户端的角度进行测试。如果您愿意,您可以使用步骤来构建对象和设置状态,但通常您
在Railcasts上,我注意到一个非常有趣的功能“转到符号”窗口。它像Command-T一样工作,但显示当前文件中可用的类和方法。如何在vim中获取它? 最佳答案 尝试:helptags有各种程序和脚本可以生成标记文件。此外,标记文件格式非常简单,因此很容易将sed(1)或类似的脚本组合在一起,无论您使用何种语言,它们都可以生成标记文件。轻松获取标记文件(除了下载生成器之外)的关键在于格式化样式而不是实际解析语法。 关于ruby-on-rails-Textmate'Gotosymbol
当验证未通过时,如何停止Rails更改我的代码。每次rails用包裹我的字段...我可以编辑fields_with_error类.fields_with_error{display:inline}这行得通,但它是hacky 最佳答案 没关系。使用CSS而不是这样做。ActionView::Base.field_error_proc=Proc.newdo|html_tag,instance_tag|"#{html_tag}"end我觉得这更hacky:) 关于ruby-on-rails-R
我正在寻找一个rubygem(或rails插件),它以与ActiveRecord抽象SQL细节相同的方式抽象出memcached的细节。我不是正在寻找有助于在memcached中缓存ActiveRecord模型的东西。我确信大约有4215个gem可以帮助解决这个问题。理想情况下,我希望能够执行以下操作:classApple然后能够做类似的事情:my_apple=Apple.find('somememcachedkey')这将在memcached中查找此类的JSON表示并将其反序列化。我也许还能做类似的事情:my_apple.color="red"#persistchangesbac
自97年以来我一直在使用vi/vim进行各种快速编辑和管理任务,但最近才考虑使用它来替换Netbeans作为我选择的ruby编辑器。我发现一件事在Netbeans和Eclipse中非常有用的是Ctrl+Click“转到定义”功能,您可以在其中按住Ctrl键并单击一个类或方法,然后它将带您了解定义。现在,我玩过丰富的ctags和rails.vim,而且很接近,但没有雪茄。这就是我想要的:默认情况下在Netbeans和Eclipse中,您可以在本地rails中按住ctrl并单击本地方法或类项目,但你也可以ctrl+click定义在gems或用Ruby编写的系统库。以Netbeans为例
我想在我的某些类(class)中发生某些事情时收到通知。我想以这样一种方式进行设置,即我的方法在这些类中的实现不会改变。我在想我会有类似以下模块的东西:moduleNotificationsextendActiveSupport::ConcernmoduleClassMethodsdefnotify_when(method)puts"the#{method}methodwascalled!"#additionalsuitablenotificationcode#now,runthemethodindicatedbythe`method`argumentendendend然后我可以像这样
我想在Rails3助手中用HTML包装一些内容,这样在我看来我可以这样做:我有一个如下所示的辅助方法:defrounded_box(&block)str="str"rawstrend我现在使用它的方式返回正确包装在HTML字符串中的内容,但不会在呈现rounded_boxblock中的任何erb之前返回(例如,在这种情况下,target.text呈现两次,一次包装,一次不包装)。有更好的方法吗?为简单起见,我想避免使用content_tag,但如果这是我能做到的唯一/最佳方式。 最佳答案 在block上调用capture而不是yie
是否可以设置一个Rails应用程序,以便所有Controller操作都自动包装在一个事务中,并在出现未挽救的异常时自动回滚?我正在开发一个Rails3应用程序,目前正在执行一项相当棘手的操作,该操作会进行大量数据库更改。而且我一直弄错了很多次!一段时间后,我意识到我的代码无法正常工作,因为我最终在数据库中得到了不一致的数据。我可以很容易地用一个事务来包装它(这是一个明显需要的实例!)。然而,这让我想到,至少在开发过程中,将这个想法应用于每个Controller操作会很有用。假设这是可能的,这有什么缺点吗? 最佳答案 有关信息,我在我
我最近写了ParseResource,它是Parse.com's的RubyAPI包装器REST接口(interface)。下面是一些基本用法:classPost"Helloworld",:author=>"Alan",:body=>"ipsolorem")这个项目还很年轻,我真正想要实现的一个功能是关联。像这样:classAuthor"Alan",:email=>"alan@example.com")p=Post.create(:title=>"Associated!",:body=>"ipsolorem",:author=>a)p.author.class#=>Authorp.aut
我最近一直在研究ruby,我决定开始一个简单的项目来编写一个ruby脚本,将线路输入声音记录到.wav文件中。我发现ruby不能很好地访问硬件设备(它可能不应该),但是PortAudio可以,而且我发现了一个很棒的PA包装器here(它不是gem,我认为是因为它使用ruby的ffi附加到PortAudio,而且PA库可能在很多地方)。我一直在摸索PortAudio的文档和示例以了解PA的工作原理。我已经很多年没有写过或读过C了。我在创建过程中应该将哪些参数传递给流以及在创建过程中传递给缓冲区时遇到了困难。例如,frame到底是什么,它与channel和samplerat