簡體   English   中英

使用popen()在命令行中打開程序?

[英]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];

為此目的最好使用system(3)

popen(3)函數建立一個可由調用者讀取或寫入的管道。 但是GUI應用程序不使用標准輸入和標准輸出,它們連接到圖形界面服務器,有時也稱為“窗口服務器”。 該服務器已經在運行,並且已經確定其鍵盤輸入將是什么,並且它始終將其輸出寫入視頻設備。

要啟動.app,您實際上應該運行open(1)程序,因此請嘗試執行以下操作:

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

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM