[英]Using popen() to open a program in command line?
是否可以使用其他程序打開一個程序? 例如:我想用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()打開程序?
編輯:以下代碼有效!
#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);
}
popen
使您可以啟動程序,並在其輸入或輸出中獲取文件描述符,就像fopen
可以處理文件一樣。 例如,如果您想讀取程序的輸出,則可以使用popen("program", "r")
。 另一方面,如果要寫入其輸入,則可以使用popen("program", "w")
。 Mac OS X還允許使用r+
,它允許您讀取輸出並寫入輸入,但是此功能不是標准功能,因此不應作為跨平台代碼的依據。
如果您只想啟動程序,則最好使用system
功能,該功能將執行該操作並等待程序退出,此時程序將返回狀態代碼。 system
實際上會調用Shell進行工作,因此參數將進行擴展(環境變量,〜等)。
編輯在您發表評論后, 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
路徑的某個Microsoft Word.app/Contents/MacOS/Microsoft Word
。
如您所見,這變得越來越復雜。 幸運的是,Apple提供了open
可執行文件,可以使用大量的OS服務來找出這些細節。 它允許以以下方式啟動應用程序:
open -a Microsoft\ Word
這應該啟動Word。 (注意您仍然需要轉義空格。)在純C代碼中,這將為您提供以下信息:
system("open -a Microsoft\\ Word");
但是,如果選擇使用Objective-C和Cocoa,則有一種非常簡單的方法來打開應用程序:
NSString* appName = @"Microsoft Word"; // no escape!
[[NSWorkspace sharedWorkspace] launchApplication:appName];
可以很容易地從C字符串創建NSString
對象:
NSString* appName = [[NSString alloc] initWithCString:programName encoding:NSUTF8StringEncoding];
[[NSWorkspace sharedWorkspace] launchApplication:appName];
[appName release];
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.