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

Mik*_*ike 1 c xcode command-line popen

是否可以使用其他程序打开程序?例如:我想在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);
}
Run Code Online (Sandbox Code Playgroud)

但是,popen()要求我另一个char.我如何使用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);

}
Run Code Online (Sandbox Code Playgroud)

zne*_*eak 7

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".您需要引用程序名称或转义空格以使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可执行文件,可以使用大量的OS服务来找出这些细节.它允许以下列方式启动应用程序:

open -a Microsoft\ Word
Run Code Online (Sandbox Code Playgroud)

这应该启动Word.(注意你仍然需要如何逃避空间.)在纯C代码中,这将得到这样的东西:

system("open -a Microsoft\\ Word");
Run Code Online (Sandbox Code Playgroud)

但是,如果您选择使用Objective-C和Cocoa,则可以通过一种非常简单的方式打开应用程序:

NSString* appName = @"Microsoft Word"; // no escape!
[[NSWorkspace sharedWorkspace] launchApplication:appName];
Run Code Online (Sandbox Code Playgroud)

NSString 可以很容易地从C字符串创建对象:

NSString* appName = [[NSString alloc] initWithCString:programName encoding:NSUTF8StringEncoding];
[[NSWorkspace sharedWorkspace] launchApplication:appName];
[appName release];
Run Code Online (Sandbox Code Playgroud)