在SO的帮助下,我编写了一个应用程序,显示Swift中所有打开的TCP / UDP连接。 在下一步中,我想获得打开连接的过程(就像lsof那样)。
由于lsof是开源的,我可以编写以下代码来获取进程的所有打开文件:
桥接报头:
$ echo $?
0
(我不认为每个包含都是必需的,但至少它现在可以编译)。
#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>
代码从C移植到Swift 3.原始C代码如下所示:
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.")
}
}
当我运行我的代码时,我得到了errno 12(内存不足)。为什么呢?
P.S。我知道第二个proc_pidinfo也会失败,因为返回了指向proc_fdinfo数组的指针,而不是指向单个结构的指针,而是一次一个步骤。这都是关于errno 12的。
答案 0 :(得分:2)
有两个错误。首先,它应该是
let size = MemoryLayout<proc_taskallinfo>.size
其次,proc_pidinfo(pid, PROC_PIDLISTFDS, ...)
需要一个缓冲区
有fileCount
proc_fdinfo
类型结构的空间,而不仅仅是var fid = Array(repeating: proc_fdinfo(), count: Int(fileCount))
let fdInfoSize = MemoryLayout<proc_fdinfo>.stride
result = proc_pidinfo(pid, PROC_PIDLISTFDS, 0, &fid, Int32(fdInfoSize) * fileCount)
一个人:
int main(int argc, char *argv[])
答案 1 :(得分:1)
这是获取TCP套接字的最终代码。很遗憾,无法在沙盒应用中使用该代码:
View(data[data$LAME_roll == "NA",]