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

时间:2016-04-20 17:46:31

标签: c macos

我尝试使用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);
}

1 个答案:

答案 0 :(得分:0)

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

预览可能是也可能不是它运行的系统的默认PDF查看器,如果不是,恭喜你,你现在有一个困惑的,可能是愤怒的用户。

如果您没有使用Objective-C,那么您需要做的是system("open /path/to/file.pdf");。这将解决所有棘手的事情,找出要使用的应用程序,在哪里以及如何启动它。