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

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

#include  #include  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  #include  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); } 

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

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

EDIT После вашего комментария, что system("Microsoft Word.app") работает не так, как вы ожидали: на самом деле есть несколько причин. Начиная с сообщения, которое вы получаете: это потому, что то, что вы написали, эквивалентно открытию windows терминала и набору Microsoft Word.app . Другими словами, он пытается найти программу под названием «Microsoft», а затем передать ей аргумент «Word.app». Вам нужно будет либо указать имя программы, либо пробелы, чтобы shell поняла, что это полное имя программы, а не имя программы, а затем аргумент: system("Microsoft\ Word.app")

Теперь это должно жаловаться на то, что shell не может найти программу «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]; 

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

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

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

 system("open /Applications/MacVim.app");