在任务计划程序中运行C程序时出错

时间:2011-07-06 18:12:43

标签: c windows permissions access-violation scheduled-tasks

我制作了一个C程序来使图像脱机并使用fopen / fread / fwrite和libcurl将其保存在文件中。一切都编译得很好,我可以通过双击程序完美地运行它。但是,当我尝试使用任务计划程序在我的计算机上设置任务每10分钟运行一次时,程序会打开,当它尝试保存文件时我会收到错误:

  

exception :: handle:异常:STATUS_ACCESS_VIOLATION   open_stackdumpfile:将堆栈跟踪转储到garden.exe.stackdump

我正在运行Windows Vista,并尝试使用本机Windows计划任务功能。我已在任务属性中选中了标记为“以最高权限运行”的框。

1 个答案:

答案 0 :(得分:5)

我的猜测是,运行程序的任何内容都是从您没有写入权限的目录中执行的。没有“garden.exe.stackdump”文件这一事实就是一个线索。

将其保存到文件时,是将其保存为fopen("myfile","w")还是使用完全限定名称?例如,假设您要保存的文件名为“foobar.png”,并且您希望将其保存到下面命名的目录中,您可以使用以下内容:

    char fname[256] = "foobar.png";
    char directory[256] = "C:/Users/Joel/Desktop/garden/snaps";
    char path[256];

    memset(path, 0, sizeof(path));
    strcpy(path, directory);
    strcat(path, "/");
    strcat(path, fname);

    if ((fp = fopen(path, "w")) == NULL) {
        fprintf(stderr, "Failed to open %s: %s\n", path, strerror(errno));
        exit(1);
    }

    fwrite(yourdata, yourdata_size, 1, fp);

由于您的程序似乎也将错误转储到文件中,因此您可以在程序开始时chdir("/home/myname")处理好,以便将任何“.stackdump”文件放在您可以访问的位置。

您可能需要考虑的另一件事是您的任务计划程序可能正在以nobody或其他一些权限被剥夺的帐户运行您的脚本。如果是这种情况,您将需要在fopenchdir中使用完整路径到全局可写区域(例如/tmp)或具有开放权限的工作目录。例如:

mkdir /home/myname/scratch
chmod a+rwx /home/myname/scratch
chmod a+x   /home/myname

(您可以在主目录中设置执行位,以便无权限程序可以访问其子目录,即使它无法读取其中的任何内容。)