c - 在任务调度程序中运行C程序时出错

标签 c windows permissions access-violation scheduled-tasks

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

exception::handle: Exception: STATUS_ACCESS_VIOLATION open_stackdumpfile: Dumping stack trace to garden.exe.stackdump

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

最佳答案

我的猜测是,无论您的程序正在运行什么,都是从您没有写入权限的目录中执行的。没有“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

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

关于c - 在任务调度程序中运行C程序时出错,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6601017/

相关文章:

c - 如何重复 Scanf 并替换值?

c - 使用 OpenCV 读/写 AVI 时的最后一帧异常

c++ - strftime %F 在 Windows 上不起作用

java - 在Windows下的java中创建目录的硬链接(hard link)

c - Valgrind 错误结构

c - for (;;) 的用途是什么?

windows - 批处理文件对多个目录中的所有文件执行命令

python - 整个应用程序的 Django 组权限

ruby-on-rails - Rails 4 - Pundit with Rolify - 允许一组角色

python - 权限错误 : [Errno 13] Permission denied: 'emails2/Train'