是否可以使用其他程序打开程序?例如: 我想在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);
}
答案 0 :(得分: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
这应该启动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];
答案 1 :(得分:2)
最好将system(3)
用于此目的。
popen(3)
函数建立一个可由调用者读取或写入的管道。但是GUI应用程序不使用标准输入和标准输出,它们连接到图形界面服务器,有时称为 "window server". 这个服务器已经运行并且已经确定它的键盘输入将是什么,它始终将其输出写入视频设备。
要启动 .app ,您应该实际运行 open(1) 计划,请尝试以下操作:
system("open /Applications/MacVim.app");