Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/swift/20.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Swift 获取进程的所有打开文件会导致errno 12=内存不足_Swift_Errno_Lsof - Fatal编程技术网

Swift 获取进程的所有打开文件会导致errno 12=内存不足

Swift 获取进程的所有打开文件会导致errno 12=内存不足,swift,errno,lsof,Swift,Errno,Lsof,在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&

在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>
当我运行代码时,我会得到errno 12(内存不足)。为什么?


另外,我知道第二个proc_pidinfo也会失败,因为返回的是指向proc_fdinfo数组的指针,而不是指向单个结构的指针,而是一次一步。这都是关于错误12的。

有两个错误。首先,它应该是

let size = MemoryLayout<proc_taskallinfo>.size

下面是获取TCP套接字的最终代码。不幸的是,无法在沙盒应用程序中使用代码:

for app in NSWorkspace.shared().runningApplications {
    let pid = app.processIdentifier

    var tai = proc_taskallinfo()
    let size = MemoryLayout<proc_taskallinfo>.size
    var result = proc_pidinfo(pid, PROC_PIDTASKALLINFO, 0, &tai, Int32(size))
    let fileCount: Int32 = Int32(tai.pbsd.pbi_nfiles)

    if result <= 0 {
        continue
    }

    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)

    if result <= 0 {
        Swift.print("Error PROC_PIDLISTFDS.")
    }
    else {
        for i in 0.. < Int(result) / fdInfoSize {
            let fdp = fid[i]

            if fdp.proc_fdtype == UInt32(PROX_FDTYPE_SOCKET) {
                var si = socket_fdinfo()
                let sizeSi = MemoryLayout<socket_fdinfo>.size
                result = proc_pidfdinfo(pid, fdp.proc_fd, PROC_PIDFDSOCKETINFO, &si, Int32(sizeSi))

                if result <= 0 {
                    Swift.print("Error PROC_PIDFDSOCKETINFO: " + errno.description)
                }
                else {
                    if si.psi.soi_kind == Int32(SOCKINFO_TCP) {
                        Swift.print("TCP Socket")
                    }
                }
            }
        }
    }
}
NSWorkspace.shared()中应用程序的
。运行应用程序{
设pid=app.processIdentifier
var tai=proc_taskallinfo()
let size=MemoryLayout.size
var result=proc_pidinfo(pid、proc_PIDTASKALLINFO、0和tai、Int32(大小))
let fileCount:Int32=Int32(tai.pbsd.pbi\u文件)

如果代码中使用C函数的结果不符合C标记的条件。它不应该是
let size=MemoryLayout.size
proc\u bsdinfo
来自哪里?是的。应该是……我假设
对于0中的I..
应该是
对于0中的I..
let size = MemoryLayout<proc_taskallinfo>.size
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)
for app in NSWorkspace.shared().runningApplications {
    let pid = app.processIdentifier

    var tai = proc_taskallinfo()
    let size = MemoryLayout<proc_taskallinfo>.size
    var result = proc_pidinfo(pid, PROC_PIDTASKALLINFO, 0, &tai, Int32(size))
    let fileCount: Int32 = Int32(tai.pbsd.pbi_nfiles)

    if result <= 0 {
        continue
    }

    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)

    if result <= 0 {
        Swift.print("Error PROC_PIDLISTFDS.")
    }
    else {
        for i in 0.. < Int(result) / fdInfoSize {
            let fdp = fid[i]

            if fdp.proc_fdtype == UInt32(PROX_FDTYPE_SOCKET) {
                var si = socket_fdinfo()
                let sizeSi = MemoryLayout<socket_fdinfo>.size
                result = proc_pidfdinfo(pid, fdp.proc_fd, PROC_PIDFDSOCKETINFO, &si, Int32(sizeSi))

                if result <= 0 {
                    Swift.print("Error PROC_PIDFDSOCKETINFO: " + errno.description)
                }
                else {
                    if si.psi.soi_kind == Int32(SOCKINFO_TCP) {
                        Swift.print("TCP Socket")
                    }
                }
            }
        }
    }
}