Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/c/65.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C 使用popen()在命令行中打开程序?_C_Xcode_Command Line_Popen - Fatal编程技术网

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

C 使用popen()在命令行中打开程序?,c,xcode,command-line,popen,C,Xcode,Command Line,Popen,是否可以使用另一个程序打开一个程序?例如: 我想用C语言制作一个命令行应用程序,它会提示用户输入一个程序的名称(比如说MicrosoftWord.app),然后该程序就会启动。我会这样做吗: #include <stdio.h> #include <time.h> int main (int argc, const char * argv[]) { char programName[1000]; printf("Type in the name of th

是否可以使用另一个程序打开一个程序?例如: 我想用C语言制作一个命令行应用程序,它会提示用户输入一个程序的名称(比如说MicrosoftWord.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);
}
system("open -a Microsoft\\ Word");
#包括
#包括
int main(int argc,const char*argv[]{
字符程序名[1000];
printf(“输入要打开的程序的名称:”;
scanf(“%s”,程序名);
popen(程序名);
}
但是,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);

}
#包括
#包括
int main(int argc,const char*argv[]{
字符程序名[1000];
字符应用程序[100]=“.app”;
char openApp[100]=“open/Applications/”;
printf(“输入要打开的程序的名称:”;
scanf(“%s”,程序名);
strcat(openApp,程序名);
strcat(openApp,app);
系统(openApp);
}

popen
允许您启动一个程序,并在其输入或输出中获取一个文件描述符,就像
fopen
用于文件一样。例如,如果您想读取程序的输出,可以使用
popen(“program”,“r”)
。另一方面,如果您想写入它的输入,可以使用
popen(“program”,“w”)
。Mac OS X还允许
r+/code>,这允许您读取输出并写入输入,但此功能不是标准功能,跨平台代码不应依赖此功能

如果您只想启动一个程序,那么不妨使用
system
函数,该函数执行此操作并等待程序退出,然后返回状态代码<代码>系统
实际上调用shell来工作,因此参数将进行扩展(环境变量,~,等等)

根据您的评论编辑
系统(“Microsoft Word.app”)
不能像您预期的那样工作:实际上,这有几个原因。从您收到的消息开始:这是因为您编写的内容相当于打开一个终端窗口并键入
MicrosoftWord.app
。换句话说,它试图找到一个名为“Microsoft”的程序,然后将参数“Word.app”传递给它。您需要引用程序名或转义空格,以便shell理解它是一个完整的程序名而不是程序名,然后是一个参数:
system(“Microsoft\Word.app”)

现在,这应该会抱怨说shell找不到程序“microsoftword.app”,这已经是一个进步

这是因为在Mac OS上,
app
文件不是可执行文件:它们是Finder显示为单个文件的文件夹。您可以通过按住ctrl键并单击(或右键单击)应用程序并选择“显示软件包内容”(这将打开应用程序文件夹)来验证。Microsoft Word.app的实际可执行文件必须位于
Microsoft Word.app/Contents/MacOS/Microsoft Word
路径的某个位置

正如你所看到的,这越来越复杂了。幸运的是,苹果提供了
open
可执行文件,可以使用一系列操作系统服务来了解这些细节。它允许以以下方式启动应用程序:

open -a Microsoft\ Word
这将启动Word。(注意,您仍然需要逃出空格。)在纯C代码中,这将得到如下结果:

#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);
}
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];

popen
允许您启动程序并在其输入或输出中获取文件描述符,就像
fopen
用于文件一样。例如,如果您想读取程序的输出,可以使用
popen(“program”,“r”)
。另一方面,如果您想写入它的输入,可以使用
popen(“program”,“w”)
。Mac OS X还允许
r+/code>,这允许您读取输出并写入输入,但此功能不是标准功能,跨平台代码不应依赖此功能

如果您只想启动一个程序,那么不妨使用
system
函数,该函数执行此操作并等待程序退出,然后返回状态代码<代码>系统
实际上调用shell来工作,因此参数将进行扩展(环境变量,~,等等)

根据您的评论编辑
系统(“Microsoft Word.app”)
不能像您预期的那样工作:实际上,这有几个原因。从您收到的消息开始:这是因为您编写的内容相当于打开一个终端窗口并键入
MicrosoftWord.app
。换句话说,它试图找到一个名为“Microsoft”的程序,然后将参数“Word.app”传递给它。您需要引用程序名或转义空格,以便shell理解它是一个完整的程序名而不是程序名,然后是一个参数:
system(“Microsoft\Word.app”)

现在,这应该会抱怨说shell找不到程序“microsoftword.app”,这已经是一个进步

这是因为在Mac OS上,
app
文件不是可执行文件:它们是Finder显示为单个文件的文件夹。您可以通过按住ctrl键并单击(或右键单击)应用程序并选择“显示软件包内容”(这将打开应用程序文件夹)来验证。Microsoft Word.app的实际可执行文件必须位于
Microsoft Word.app/Contents/MacOS/Microsoft Word
路径的某个位置

正如你所看到的,这越来越复杂了。幸运的是,苹果提供了
open
可执行文件,可以使用一系列操作系统服务来了解这些细节。它允许以以下方式启动应用程序: