获取进程结果的所有打开文件的错误12 =内存不足

时间:2017-07-05 17:47:19

标签: swift errno lsof

在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的。

2 个答案:

答案 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",]