2015-06-08 3 views
0

У меня есть приложение, которое можно запускать несколько раз с разными параметрами, и мне нужно, чтобы один экземпляр приложения мог видеть, что другие имеют параметры (в основном для обеспечения того, чтобы два экземпляра не запускайте с теми же параметрами AND, чтобы сосредоточиться на аналогичном экземпляре). В настоящее время я использую файлы pid, но задаюсь вопросом, есть ли способ отметить исполняемый экземпляр каким-то образом видимым из других экземпляров. Я изменяю CFBundleName для каждого экземпляра, но он кажется не видимым (только оригинальное имя, а не измененное). Есть ли лучший способ, чем файлы pid?Как определить/отметить экземпляр приложения OS X

Некоторых деталей: основное приложение представляет собой контейнер, который запускает другое внутреннее приложение, которое имеет доступ к контейнеру (т.е. для изменения CFBundleName и т.д.)

ответ

1

Я предполагаю, что на «параметры» вы имеете в виду аргументов командной строки? Вы можете запустить ps, используя popen, а затем захватить и проанализировать вывод необходимой информации. Если вы уже знаете pids для других процессов, вы можете найти это, и 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); 
+0

Спасибо! Я попробую. Все еще надеюсь общаться с приложением, используя Cocoa, хотя :) – Andrei

Смежные вопросы