Ошибка при запуске программы на C в планировщике задач - PullRequest
2 голосов
/ 06 июля 2011

Я создал программу на C, чтобы отключить изображение и сохранить его в файл, используя fopen / fread / fwrite и libcurl. Все прекрасно компилируется, и я могу запустить его отлично, дважды щелкнув по программе. Но когда я пытаюсь установить задачу на своем компьютере, используя планировщик задач, чтобы запускать ее каждые 10 минут, программа открывается, и когда она пытается сохранить файл, я получаю сообщение об ошибке:

исключение :: дескриптор: исключение: STATUS_ACCESS_VIOLATION open_stackdumpfile: дамп трассировки стека в garden.exe.stackdump

Я использую Windows Vista и пытаюсь использовать встроенную функцию запланированных задач Windows. Я установил флажок «Запускать с наивысшими привилегиями» в свойствах задачи.

1 Ответ

5 голосов
/ 06 июля 2011

Я предполагаю, что все, что запускает ваша программа, делает это из каталога, в который у вас нет прав на запись. Тот факт, что нет файла "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

(Вы устанавливаете бит выполнения в своем домашнем каталоге так, чтобы программа без прав доступа могла получить доступ к своему подкаталогу, даже если она ничего не может прочитать в нем.)

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...