【发布时间】:2017-07-05 17:47:18
【问题描述】:
在 SO 的帮助下,我编写了一个在 Swift 中显示所有打开的 TCP/UDP 连接的应用程序。 下一步,我想获取打开连接的进程(和 lsof 差不多)。
由于 lsof 是开源的,我可以编写以下代码来获取进程的所有打开文件:
桥接头:
#include <mach/mach_types.h>
#include <mach/vm_param.h>
#include <mach/host_info.h>
#include <mach/task_info.h>
#include <mach/thread_info.h>
#include <mach/vm_region.h>
#include <libproc.h>
#include <sys/proc_info.h>
#include <sys/kdebug.h>
#include <sys/msgbuf.h>
(我认为不需要每个包含,但至少现在可以编译)。
for app in NSWorkspace.shared().runningApplications
{
let pid = app.processIdentifier
var tai = proc_taskallinfo()
let size = MemoryLayout<proc_bsdinfo>.size
var result = proc_pidinfo(pid, PROC_PIDTASKALLINFO, 0, &tai, Int32(size))
let fileCount: Int32 = Int32(tai.pbsd.pbi_nfiles)
if result <= 0
{
if errno == ENOMEM
{
Swift.print("Out of memory.")
}
Swift.print(errno)
continue
}
var fid = proc_fdinfo()
let fdInfoSize = MemoryLayout<proc_fdinfo>.size
result = proc_pidinfo(pid, PROC_PIDLISTFDS, 0, &fid, Int32(fdInfoSize) * fileCount)
if result <= 0
{
Swift.print("Error. No Files?")
}
else
{
Swift.print("Files found.")
}
}
代码从 C 移植到 Swift 3。原始 C 代码如下所示:
int nb;
struct proc_taskallinfo tai;
...
nb = proc_pidinfo(pid, PROC_PIDTASKALLINFO, 0, &tai, sizeof(tai));
当我运行我的代码时,我得到 errno 12(内存不足)。为什么?
附:我知道第二个 proc_pidinfo 也会失败,因为返回的是指向 proc_fdinfo 数组的指针,而不是指向单个结构的指针,而是一次一步。都是关于 errno 12 的。
【问题讨论】:
-
在代码中使用 C 函数不符合 C 标签的条件。
-
不应该是
let size = MemoryLayout<proc_taskallinfo>.size吗?proc_bsdinfo来自哪里? -
是的。是的,应该是……