gpt4 book ai didi

c - 如何使用 fork 和 execv 以编程方式启动预览?

转载 作者:太空宇宙 更新时间:2023-11-04 04:30:33 25 4
gpt4 key购买 nike

我正在尝试使用 fork 和 execv 在 OSX 上启动预览版。当我在 Preview 上使用 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),如下例所示,Preview 打开并显示正常,并且控制台中没有错误消息。那么,如何使用 fork 和 execv 启动 Preview 而不是使用 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);
}

最佳答案

您还需要设置 Mac OS X 应用程序系统提供给 main() 的附加参数,但您不应该执行以下任何操作:

Preview 可能是也可能不是其运行系统的默认 PDF 查看器,如果不是,恭喜您,您现在有一个困惑甚至可能生气的用户。

如果您坚决不使用 Objective-C,您需要做的是 system("open/path/to/file.pdf");。这将解决所有棘手的问题,即确定要使用的什么应用程序、它在哪里以及如何启动它。

关于c - 如何使用 fork 和 execv 以编程方式启动预览?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36751396/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com