Swift 获取进程的所有打开文件会导致errno 12=内存不足
在SO的帮助下,我编写了一个应用程序,可以在Swift中显示所有打开的TCP/UDP连接。 在下一步中,我希望获得打开连接的进程(与lsof的操作非常相似) 由于lsof是开源的,我可以编写以下代码来获取进程的所有打开文件: 桥接头: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&
#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")
}
}
}
}
}
}