Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/c/57.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/windows/14.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
在任务计划程序中运行C程序时出错_C_Windows_Permissions_Access Violation_Scheduled Tasks - Fatal编程技术网

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

在任务计划程序中运行C程序时出错,c,windows,permissions,access-violation,scheduled-tasks,C,Windows,Permissions,Access Violation,Scheduled Tasks,我制作了一个C程序,使图像离线,并使用fopen/fread/fwrite和libcurl将其保存在一个文件中。一切都编译得非常好,我可以通过双击程序来运行它。但是,当我尝试使用任务调度器在我的计算机上设置一个任务,使其每10分钟运行一次时,程序将打开,当它尝试保存文件时,我得到错误: 异常::句柄:异常:状态\u访问\u冲突 打开_stackdumpfile:将堆栈跟踪转储到garden.exe.stackdump 我正在运行Windows Vista,并尝试使用本机Windows计划任务功能

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

异常::句柄:异常:状态\u访问\u冲突 打开_stackdumpfile:将堆栈跟踪转储到garden.exe.stackdump


我正在运行Windows Vista,并尝试使用本机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
或其他权限被剥夺的帐户的身份运行您的脚本。如果是这种情况,您需要使用
fopen
chdir
中的完整路径来访问全局可写区域(例如
/tmp
)或具有打开权限的工作目录。例如:

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

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

该程序因访问冲突而出错。有关此错误的信息已转储到garden.exe.stackdump。有可能(甚至有可能)任务计划程序下的环境与在命令行上运行时不同。您可能有一些代码不检查某个系统调用的返回,但继续使用实际无效的引用(可能是空指针),这是您认为“总是成功”的函数的结果。没有garden.exe.stackdump,我只是使用fopen(“myfile”,“w”)。我选中了任务计划程序“使用最高权限设置运行”中的复选框。我想写入/Users/Joel/Desktop/garden/snaps,这在任务计划程序中是不可能的吗?@Nile-当然可以在那里写入。但是,如果您是通过
fopen/fwrite
编写,则需要提供该位置的完整路径。否则,它只会尝试从任务计划程序的当前目录中删除它。@Nile-它还可能帮助您指定正在使用的任务计划程序。我假设你在linux上运行。我在Windows Vista上运行。那么,如果我想将它保存到C:/Users/Joel/Desktop/garden/snaps,fopen会是什么样子?