草庐IT

iphone - 从 pid 获取优先级和正常运行时间? ( iOS )

coder 2024-01-27 原文

这是针对应用商店的应用。

使用代码 from here ,我可以获得正在运行的进程及其 pids 的列表。但是,我在应用商店 (like this one) 中发现了几个应用程序,它们还检索了每个进程的优先级开始时间。

(注意:我不关心它是正常运行时间、进程事件了多长时间,还是进程开始的挂钟日期/时间)。

有没有记录在案的方法来做到这一点?

最佳答案

这是获取您想要的所有流程相关信息的代码,例如名称、优先级、开始日期、父 ID、状态。 Here是获取带有演示的完整资源的链接。

// List of process information including PID's, Names, PPID's, and Status'
+ (NSMutableArray *)processesInformation {
    // Get the list of processes and all information about them
    @try {
        // Make a new integer array holding all the kernel processes
        int mib[4] = {CTL_KERN, KERN_PROC, KERN_PROC_ALL, 0};

        // Make a new size of 4
        size_t miblen = 4;

        size_t size = 0;
        int st = sysctl(mib, miblen, NULL, &size, NULL, 0);

        // Set up the processes and new process struct
        struct kinfo_proc *process = NULL;
        struct kinfo_proc *newprocess = NULL;

        // do, while loop rnning through all the processes
        do {
            size += size / 10;
            newprocess = realloc(process, size);

            if (!newprocess) {
                if (process) free(process);
                // Error
                return nil;
            }

            process = newprocess;
            st = sysctl(mib, miblen, process, &size, NULL, 0);

        } while (st == -1 && errno == ENOMEM);

        if (st == 0) {
            if (size % sizeof(struct kinfo_proc) == 0) {
                int nprocess = size / sizeof(struct kinfo_proc);

                if (nprocess) {
                    NSMutableArray *array = [[NSMutableArray alloc] init];

                    for (int i = nprocess - 1; i >= 0; i--) {

                        NSString *processID = [[NSString alloc] initWithFormat:@"%d", process[i].kp_proc.p_pid];
                        NSString *processName = [[NSString alloc] initWithFormat:@"%s", process[i].kp_proc.p_comm];
                        NSString *processPriority = [[NSString alloc] initWithFormat:@"%d", process[i].kp_proc.p_priority];
                        NSDate   *processStartDate = [NSDate dateWithTimeIntervalSince1970:process[i].kp_proc.p_un.__p_starttime.tv_sec];
                        NSString       *processParentID = [[NSString alloc] initWithFormat:@"%d", [self parentPIDForProcess:(int)process[i].kp_proc.p_pid]];
                        NSString       *processStatus = [[NSString alloc] initWithFormat:@"%d", (int)process[i].kp_proc.p_stat];
                        NSString       *processFlags = [[NSString alloc] initWithFormat:@"%d", (int)process[i].kp_proc.p_flag];

                        // Check to make sure all values are valid (if not, make them)
                        if (processID == nil || processID.length <= 0) {
                            // Invalid value
                            processID = @"Unkown";
                        }
                        if (processName == nil || processName.length <= 0) {
                            // Invalid value
                            processName = @"Unkown";
                        }
                        if (processPriority == nil || processPriority.length <= 0) {
                            // Invalid value
                            processPriority = @"Unkown";
                        }
                        if (processStartDate == nil) {
                            // Invalid value
                            processStartDate = [NSDate date];
                        }
                        if (processParentID == nil || processParentID.length <= 0) {
                            // Invalid value
                            processParentID = @"Unkown";
                        }
                        if (processStatus == nil || processStatus.length <= 0) {
                            // Invalid value
                            processStatus = @"Unkown";
                        }
                        if (processFlags == nil || processFlags.length <= 0) {
                            // Invalid value
                            processFlags = @"Unkown";
                        }

                        // Create an array of the objects
                        NSArray *ItemArray = [NSArray arrayWithObjects:processID, processName, processPriority, processStartDate, processParentID, processStatus, processFlags, nil];

                        // Create an array of keys
                        NSArray *KeyArray = [NSArray arrayWithObjects:@"PID", @"Name", @"Priority", @"StartDate", @"ParentID", @"Status", @"Flags", nil];

                        // Create the dictionary
                        NSDictionary *dict = [[NSDictionary alloc] initWithObjects:ItemArray forKeys:KeyArray];

                        // Add the objects to the array
                        [array addObject:dict];
                    }

                    // Make sure the array is usable
                    if (array.count <= 0) {
                        // Error, nothing in array
                        return nil;
                    }

                    // Free the process
                    free(process);

                    // Successful
                    return array;
                }
            }
        }

        // Something failed
        return nil;
    }
    @catch (NSException * ex) {
        // Error
        return nil;
    }
}

// Parent ID for a certain PID
+ (int)parentPIDForProcess:(int)pid {
    // Get the parent ID for a certain process
    @try {
        // Set up the variables
        struct kinfo_proc info;
        size_t length = sizeof(struct kinfo_proc);
        int mib[4] = { CTL_KERN, KERN_PROC, KERN_PROC_PID, pid };

        if (sysctl(mib, 4, &info, &length, NULL, 0) < 0)
            // Unknown value
            return -1;

        if (length == 0)
            // Unknown value
            return -1;

        // Make an int for the PPID
        int PPID = info.kp_eproc.e_ppid;

        // Check to make sure it's valid
        if (PPID <= 0) {
            // No PPID found
            return -1;
        }

        // Successful
        return PPID;
    }
    @catch (NSException *exception) {
        // Error
        return -1;
    }
}

关于iphone - 从 pid 获取优先级和正常运行时间? ( iOS ),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11438717/

有关iphone - 从 pid 获取优先级和正常运行时间? ( iOS )的更多相关文章

  1. ruby-on-rails - Ruby 检查日期时间是否为 iso8601 并保存 - 2

    我需要检查DateTime是否采用有效的ISO8601格式。喜欢:#iso8601?我检查了ruby​​是否有特定方法,但没有找到。目前我正在使用date.iso8601==date来检查这个。有什么好的方法吗?编辑解释我的环境,并改变问题的范围。因此,我的项目将使用jsapiFullCalendar,这就是我需要iso8601字符串格式的原因。我想知道更好或正确的方法是什么,以正确的格式将日期保存在数据库中,或者让ActiveRecord完成它们的工作并在我需要时间信息时对其进行操作。 最佳答案 我不太明白你的问题。我假设您想检查

  2. ruby - 简单获取法拉第超时 - 2

    有没有办法在这个简单的get方法中添加超时选项?我正在使用法拉第3.3。Faraday.get(url)四处寻找,我只能先发起连接后应用超时选项,然后应用超时选项。或者有什么简单的方法?这就是我现在正在做的:conn=Faraday.newresponse=conn.getdo|req|req.urlurlreq.options.timeout=2#2secondsend 最佳答案 试试这个:conn=Faraday.newdo|conn|conn.options.timeout=20endresponse=conn.get(url

  3. ruby - 如何验证 IO.copy_stream 是否成功 - 2

    这里有一个很好的答案解释了如何在Ruby中下载文件而不将其加载到内存中:https://stackoverflow.com/a/29743394/4852737require'open-uri'download=open('http://example.com/image.png')IO.copy_stream(download,'~/image.png')我如何验证下载文件的IO.copy_stream调用是否真的成功——这意味着下载的文件与我打算下载的文件完全相同,而不是下载一半的损坏文件?documentation说IO.copy_stream返回它复制的字节数,但是当我还没有下

  4. ruby - 从 Ruby 中的主机名获取 IP 地址 - 2

    我有一个存储主机名的Ruby数组server_names。如果我打印出来,它看起来像这样:["hostname.abc.com","hostname2.abc.com","hostname3.abc.com"]相当标准。我想要做的是获取这些服务器的IP(可能将它们存储在另一个变量中)。看起来IPSocket类可以做到这一点,但我不确定如何使用IPSocket类遍历它。如果它只是尝试像这样打印出IP:server_names.eachdo|name|IPSocket::getaddress(name)pnameend它提示我没有提供服务器名称。这是语法问题还是我没有正确使用类?输出:ge

  5. ruby - 获取模块中定义的所有常量的值 - 2

    我想获取模块中定义的所有常量的值:moduleLettersA='apple'.freezeB='boy'.freezeendconstants给了我常量的名字:Letters.constants(false)#=>[:A,:B]如何获取它们的值的数组,即["apple","boy"]? 最佳答案 为了做到这一点,请使用mapLetters.constants(false).map&Letters.method(:const_get)这将返回["a","b"]第二种方式:Letters.constants(false).map{|c

  6. ruby-on-rails - 将 Ruby 中的日期/时间格式化为 YYYY-MM-DD HH :MM:SS - 2

    这个问题在这里已经有了答案:Railsformattingdate(4个答案)关闭4年前。我想格式化Time.Now函数以显示YYYY-MM-DDHH:MM:SS而不是:“2018-03-0909:47:19+0000”该函数需要放在时间中.现在功能。require‘roo’require‘roo-xls’require‘byebug’file_name=ARGV.first||“Template.xlsx”excel_file=Roo::Spreadsheet.open(“./#{file_name}“,extension::xlsx)xml=Nokogiri::XML::Build

  7. ruby - 查找字符串中的内容类型(数字、日期、时间、字符串等) - 2

    我正在尝试解析一个CSV文件并使用SQL命令自动为其创建一个表。CSV中的第一行给出了列标题。但我需要推断每个列的类型。Ruby中是否有任何函数可以找到每个字段中内容的类型。例如,CSV行:"12012","Test","1233.22","12:21:22","10/10/2009"应该产生像这样的类型['integer','string','float','time','date']谢谢! 最佳答案 require'time'defto_something(str)if(num=Integer(str)rescueFloat(s

  8. ruby-on-rails - 获取 inf-ruby 以使用 ruby​​ 版本管理器 (rvm) - 2

    我安装了ruby​​版本管理器,并将RVM安装的ruby​​实现设置为默认值,这样'哪个ruby'显示'~/.rvm/ruby-1.8.6-p383/bin/ruby'但是当我在emacs中打开inf-ruby缓冲区时,它使用安装在/usr/bin中的ruby​​。有没有办法让emacs像shell一样尊重ruby​​的路径?谢谢! 最佳答案 我创建了一个emacs扩展来将rvm集成到emacs中。如果您有兴趣,可以在这里获取:http://github.com/senny/rvm.el

  9. Ruby 文件 IO 定界符? - 2

    我正在尝试解析一个文本文件,该文件每行包含可变数量的单词和数字,如下所示:foo4.500bar3.001.33foobar如何读取由空格而不是换行符分隔的文件?有什么方法可以设置File("file.txt").foreach方法以使用空格而不是换行符作为分隔符? 最佳答案 接受的答案将slurp文件,这可能是大文本文件的问题。更好的解决方案是IO.foreach.它是惯用的,将按字符流式传输文件:File.foreach(filename,""){|string|putsstring}包含“thisisanexample”结果的

  10. Ruby 从大范围中获取第 n 个项目 - 2

    假设我有这个范围:("aaaaa".."zzzzz")如何在不事先/每次生成整个项目的情况下从范围中获取第N个项目? 最佳答案 一种快速简便的方法:("aaaaa".."zzzzz").first(42).last#==>"aaabp"如果出于某种原因你不得不一遍又一遍地这样做,或者如果你需要避免为前N个元素构建中间数组,你可以这样写:moduleEnumerabledefskip(n)returnto_enum:skip,nunlessblock_given?each_with_indexdo|item,index|yieldit

随机推荐