我尝试使用fork和execv在OSX上启动预览。当我在预览中使用fork和execv时,停靠栏中会弹出图标,但屏幕上不会显示任何内容。控制台还会在下面显示两条错误消息。
4/20/16 12:18:23.276 PM iconservicesagent[319]: -[ISGenerateImageOp generateImageWithCompletion:] Failed to composit image for descriptor <ISBindingImageDescriptor: 0x7f85aa50b890>.
4/20/16 12:18:23.276 PM quicklookd[1959]: Error returned from iconservicesagent: (null)
下面是一些重现问题的代码,请注意您必须更换
args
数组中的硬编码文件路径为系统的有效pdf文件路径。
#include <stdio.h>
#include <unistd.h>
#include <string.h>
#include <stdlib.h>
#include <errno.h>
#include <stdint.h>
int main(int argc, char *argv[])
{
pid_t pid = 0;
int32_t rtrn = 0;
pid = fork();
if(pid == 0)
{
char * const args[] = {"/users/nah/desktop/file.pdf", NULL};
rtrn = execv("/Applications/Preview.app/Contents/MacOS/Preview", args);
if(rtrn < 0)
{
printf("Can't execute target program: %s\n", strerror(errno));
_exit(-1);
}
_exit(0);
}
else if(pid > 0)
{
int32_t status = 0;
while(waitpid(-1, &status, 0) > 0)
{
}
}
else
{
printf("Can't create child proc: %s\n", strerror(errno));
return (-1);
}
return (0);
}
但是,如果我替换所有fork和execv代码并使用system(3)
,如下例所示,预览打开并显示正常,并且控制台中没有错误消息。那么如何使用fork和execv使用system(3)
或必须使用Objective-C来启动预览?
#include <stdio.h>
#include <string.h>
#include <stdlib.h>
#include <errno.h>
#include <stdint.h>
int main(int argc, char *argv[])
{
pid_t pid = 0;
int32_t rtrn = 0;
rtrn = system("/Applications/Preview.app/Contents/MacOS/Preview /users/nah/desktop/file.pdf");
if(rtrn < 0)
{
printf("System: %s\n", strerror(errno));
return (-1);
}
return (0);
}
答案 0 :(得分:0)
您还需要设置Mac OS X应用程序系统提供给main()
的其他参数,但您不应该执行以下任何操作:
预览可能是也可能不是它运行的系统的默认PDF查看器,如果不是,恭喜你,你现在有一个困惑的,可能是愤怒的用户。
如果您没有使用Objective-C,那么您需要做的是system("open /path/to/file.pdf");
。这将解决所有棘手的事情,找出要使用的应用程序,在哪里以及如何启动它。