我正在开发一个相对简单,独立的“进程启动器”,我希望能够在Windows(XP,Vista,7),Linux(Ubuntu 10.10)上工作,特别是 Mac OS X (10.6)。 Linux和Windows基本上都可以工作,但我在使用Mac版时遇到了一些麻烦。
我希望fork()
和exec()
函数在Mac OS下可以像在Linux中一样工作。所以我的第一个问题是:
我当前的代码(在Linux下运行良好)来调试它看起来像这样:
pid_t processId = 0;
if (processId = fork()) == 0)
{
const char * tmpApplication = "/Path/to/TestApplication";
int argc = 1;
char * argv[argc + 1];
argv[0] = tmpApplication;
argv[1] = NULL;
execv(tmpApplication, argv);
}else
{
//[...]
}
任何想法是否可以在Mac OS X下运行,因为我的子进程根本没有启动,而且没有错误会出现。
谢谢!
答案 0 :(得分:12)
以下程序改编自您的代码,在OS X下对我来说效果很好:
#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
#include <sys/types.h>
int main (void) {
pid_t processId;
if ((processId = fork()) == 0) {
char app[] = "/bin/echo";
char * const argv[] = { app, "success", NULL };
if (execv(app, argv) < 0) {
perror("execv error");
}
} else if (processId < 0) {
perror("fork error");
} else {
return EXIT_SUCCESS;
}
return EXIT_FAILURE;
}
我建议你从这个简单的片段开始,如果有效,请继续添加内容,直到找到使其中断的内容。
答案 1 :(得分:5)
TestApplication
是实际可执行文件还是应用程序包(.app)?您只能使用execv()
等函数启动实际的可执行文件。通常,可以在ApplicationName.app/Contents/MacOS/ApplicationName
找到应用程序包中的可执行文件。