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

标签 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);
}

但是,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”传递给它。您需要引用程序名称或转义空格,让 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];

关于c - 使用 popen() 在命令行中打开程序?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6088913/

相关文章:

curl - 使用curl下载时如何跳过已经存在的文件?

windows - 在一个 windows cmd 行中运行两个命令,一个命令是 SET 命令

c - C 中的加密不起作用

c++ - execl 不运行编程

ios - 没有事件和启用的视频连接

swift - 线程 9 : EXC_BAD_INSTRUCTION (code=EXC_I386_INVOP, 子代码=0x0) firebase

linux - ll、ls 和 block 大小 M 或 G 之间哪个文件大小最准确?

c++ - 从 unsigned char 数组转换为 double

c - 使用幂进行计算

xcode - 如何在 Xcode 版本 9.X 中将 .ipa 文件安装到 iPhone 模拟器