Используя popen (), чтобы открыть программу в командной строке? - PullRequest
1 голос
/ 22 мая 2011

Можно ли открыть программу с помощью другой программы?Например: я хочу создать приложение командной строки на C, которое будет предлагать пользователю ввести имя программы (скажем, Microsoft Word.app), и эта программа запустится.Буду ли я делать что-то вроде этого:

#include <stdio.h>
#include <time.h>
int main (int argc, const char * argv[]) {
    char programName[1000];
    printf("Type in the name of the program you would like to open: ");
    scanf("%s", programName);
    popen(programName);
}

Однако popen () запрашивает у меня другой символ.Как мне использовать popen () для открытия программы?

EDIT: работает следующий код!

#include <stdio.h>
#include <time.h>

int main (int argc, const char * argv[]) {
    char programName[1000];
    char app[100] = ".app";
    char openApp[100] = "open /Applications/";
    printf("Type in the name of the program you would like to open: ");
    scanf("%s", programName);
    strcat(openApp, programName);
    strcat(openApp, app);
    system(openApp);

}

Ответы [ 2 ]

7 голосов
/ 22 мая 2011

popen позволяет запустить программу и получить дескриптор файла для ввода или вывода, так же, как fopen работает для файлов.Например, если вы хотите прочитать вывод вашей программы, вы должны использовать popen("program", "r").С другой стороны, если вы хотите записать на его вход, вы должны использовать popen("program", "w").Mac OS X также допускает r+, что позволяет читать выходные данные и записывать их на вход, но эта возможность не является стандартной и не должна использоваться для кросс-платформенного кода.

Если вы простоЕсли вы хотите запустить программу, вы также можете использовать функцию system, которая делает это и ожидает выхода из программы, после чего она возвращает код состояния.system фактически вызывает оболочку для работы, поэтому аргументы будут расширяться (переменные окружения, ~ и т. Д.).

РЕДАКТИРОВАТЬ После вашего комментария, что system("Microsoft Word.app") не работает как выЯ ожидаю: на самом деле есть несколько причин.Начиная с сообщения, которое вы получаете: это потому, что то, что вы написали, эквивалентно открытию окна терминала и вводу Microsoft Word.app.Другими словами, он пытается найти программу под названием «Microsoft», а затем передать ей аргумент «Word.app».Вам нужно было бы либо заключить в кавычки имя программы или пробелы, чтобы оболочка поняла, что это целое имя программы, а не имя программы, а затем аргумент: system("Microsoft\ Word.app")

Теперь следует жаловаться, что оболочка можетне находит программу «Microsoft Word.app», которая уже является шагом вперед.

Это потому, что в Mac OS app файлы не являются исполняемыми файлами: это папки, которые отображает Finderкак один файл.Вы можете убедиться в этом, нажав Ctrl + щелкнув (или щелкнув правой кнопкой мыши) приложение и выбрав «Показать содержимое пакета» (откроется папка приложения).Фактический исполняемый файл для Microsoft Word.app должен быть где-то по пути Microsoft Word.app/Contents/MacOS/Microsoft Word.

Как видите, это становится довольно сложным.К счастью, Apple предоставляет исполняемый файл open, который может использовать кучу сервисов ОС для выяснения этих деталей.Это позволяет запускать приложения следующим образом:

open -a Microsoft\ Word

Это должно запустить Word.(Обратите внимание, что вам по-прежнему нужно избегать пробелов.) В чистом коде C это даст вам что-то вроде этого:

system("open -a Microsoft\\ Word");

Если вы решите использовать Objective-C и Cocoaоднако есть очень простой способ открывать приложения:

NSString* appName = @"Microsoft Word"; // no escape!
[[NSWorkspace sharedWorkspace] launchApplication:appName];

NSString объекты могут быть созданы из строки C достаточно легко:

NSString* appName = [[NSString alloc] initWithCString:programName encoding:NSUTF8StringEncoding];
[[NSWorkspace sharedWorkspace] launchApplication:appName];
[appName release];
2 голосов
/ 22 мая 2011

Для этой цели было бы лучше использовать system(3).

Функция popen(3) устанавливает конвейер, который может быть прочитан или записан вызывающей стороной.Но приложения с графическим интерфейсом не используют стандартный ввод и стандартный вывод, они подключаются к серверу графического интерфейса, который иногда называется «оконным сервером». Этот сервер уже запущен и уже определил, чтоего клавиатурный ввод будет и он всегда записывает свои выходные данные на видеоустройство.

Чтобы запустить .app , вы должны запустить open (1) программа, поэтому попробуйте что-то вроде:

system("open /Applications/MacVim.app");
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...