gpt4 book ai didi

objective-c - 如何识别/标记 OS X 应用程序实例

转载 作者:行者123 更新时间:2023-11-30 10:14:56 26 4
gpt4 key购买 nike

我有一个可以使用不同参数多次启动的应用程序,我需要一种方法让一个应用程序实例查看其他应用程序实例的参数(主要是为了确保两个实例不使用相同的参数运行)关注类似的实例)。我目前正在使用 pid 文件,但想知道是否有一种方法可以以某种方式从其他实例可见来标记正在运行的实例。我为每个实例更改 CFBundleName,但它似乎不可见(只是原始名称,而不是更改后的名称)。还有比 pid 文件更好的方法吗?

一些细节:主应用程序是一个容器,它运行另一个可以访问该容器的内部应用程序(即更改 CFBundleName 等)

最佳答案

我假设“参数”是指命令行参数?您可以使用 popen 运行 ps,然后捕获并解析输出以获取所需的信息。如果您已经知道其他进程的 pid,则可以查找它,然后 grep 查找应用程序的名称,以减少需要查看的输出。

这是一个例子。您可以看到参数。

$ /bin/ps -Axo pid,args|grep TextWrangler|grep -v grep

643 /Applications/TextWrangler.app/Contents/MacOS/TextWrangler
645 /Applications/TextWrangler.app/Contents/Helpers/Crash Reporter.app/Contents/Helpers/crash-catcher -targetPID 643 -targetBundlePath /Applications/TextWrangler.app -showEmailAddressField 1

以下是如何使用 popen,并将输出通过管道传输到 grep 来查找命令名称、pid 和参数:

std::string cmdline("/bin/ps -Axo pid,args|grep '");
cmdline += appName;
cmdline += "'|grep -v grep";
// The output will look like: "S 428 APPNAME ARGS" with one space between entries.
// popen creates a pipe so we can read the output of the program we are invoking.
FILE *instream = popen(cmdline.c_str(), "r");
if(instream) {
// read the output, one line at a time.
const int MAX_BUFFER = 1024;
char buffer[MAX_BUFFER];
while (!feof(instream)){
if (fgets(buffer, MAX_BUFFER, instream) != NULL) {
std::string temp(buffer);
temp.trim(); // Get rid of leading and trailing whitespace. (Exercise for the reader.)
if(!temp.empty()) {
// First col is the state.
std::string::size_type i = temp.find(" ");
std::string state = temp.substr(0, i);
// Skip zombies.
if("Z" != state) {
// Second col is the pid.
// Advance i to the next char after the space.
++i;
std::string::size_type j = temp.find(" ", i);
std::string pidStr = temp.substr(i, j - i);

// Here we know the pid for APPNAME. You can further parse for the command line arguments here.

}
}
}
}
// close the pipe.
pclose(instream);

关于objective-c - 如何识别/标记 OS X 应用程序实例,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30703813/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com