小编Chr*_*nak的帖子

GCD Dispatch Sources和select()有什么区别?

我一直在编写一些替代现有的代码:

while(runEventLoop){
  if(select(openSockets, readFDS, writeFDS, errFDS, timeout) > 0){
    // check file descriptors for activity and dispatch events based on same 
  }
} 
Run Code Online (Sandbox Code Playgroud)

套接字读码.我想将其更改为使用GCD队列,以便我可以使用dispatch_async将事件弹出到队列,而不是维护"必须在下一次迭代时调用"数组.我也已经在使用GCD队列来/包含/这个特定的动作,因此希望将它转移到更自然的GCD调度表格中.(不是while()循环独占串行队列)

但是,当我尝试将其重构为依赖于从套接字描述符上的DISPATCH_SOURCE_TYPE_READ和DISPATCH_SOURCE_TYPE_WRITE绑定的事件处理程序触发的调度源的形式时,依赖于此调度的库代码停止工作.我的第一个假设是我误解了DISPATCH_SOURCE_TYPE_READ和DISPATCH_SOURCE_TYPE_WRITE的使用 - 我假设它们会产生与使用这些套接字描述符调用select()大致相同的行为.

我是否误解了GCD调度来源?或者,关于重构,我是否在不适合的情况下使用它?

sockets iphone multithreading grand-central-dispatch ios

13
推荐指数
1
解决办法
2007
查看次数

如何在没有DTrace的Mac OS X上获得每个进程的网络和磁盘IO计数器?

我一直在编写一个小工具来获取Mac OS X上的每个进程统计信息.它启动了它检查的流程.

我真正想要包括的一个功能是瞬间网络和磁盘IO; 不幸的是,我发现真正了解这些信息的唯一方法是使应用程序充当特定PID的DTrace使用者.我不幸地说,因为当DTrace变为活动状态时,系统变得非常慢,并且包含DTrace需要我的实用程序以root身份运行(这似乎过多,因为我的进程只需要检查它创建的所有进程).

事实上,DTrace似乎非常重视信息,我相信它必须存在于内核的其他地方.有一个名为iStatMenus的Mac OS实用程序,它以一种让我觉得有一些方法可以完成我想要的方式来提供这些信息(而且没有相应的系统性能命中).我试图与他们联系,看看他们是否会介意分享,但到目前为止还没有收到回应.

那么,是否有一种影响较小,权限最少的方法来获取Mac OS X中给定PID的Net和Disk性能计数器?(也就是说,不调用DTrace)

c macos kernel dtrace

5
推荐指数
0
解决办法
350
查看次数