2011-07-06 40 views
2

イメージをオフラインにしてfopen/fread/fwriteとlibcurlを使用してファイルに保存するCプログラムを作成しました。すべてが完璧にコンパイルされ、プログラムをダブルクリックすると完全に正常に実行できます。しかし、私は試してみて、それを10分ごとに実行するタスクスケジューラを使用して、自分のコンピュータ上でタスクを設定すると、プログラムが開き、それがファイルを保存しようとしたとき、私はエラーを取得:タスクスケジューラでCプログラムを実行するとエラーが発生する

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

私はWindows Vistaを実行していますがネイティブのWindows Scheduled Tasks機能を使用しようとしています。タスクのプロパティで「最高の特権で実行」と書かれたボックスをチェックしました。

+5

プログラムアクセス違反が発生しています。このエラーに関する情報はgarden.exe.stackdumpにダンプされています。 –

+1

タスクスケジューラの環境は、コマンドラインで実行したときとは異なる可能性があります(場合によっては可能性もあります)。あなたはおそらく、あるシステムコールからの戻り値をチェックしないが、実際には無効な参照(おそらくヌルポインタ)を使うようなコードをいくつか持っているでしょう。 –

+0

garden.exe.stackdumpはありません – jeremy

答えて

5

私の推測では、あなたのプログラムを実行しているものは、あなたが書き込み許可を持っていないディレクトリから実行していると思います。 「garden.exe.stackdump」ファイルがないという事実は、それを手がかりとして与えます。

ファイルに保存するときは、fopen("myfile","w")として保存するのか、完全修飾名を使用していますか?また、あなたのプログラムので

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); 

:たとえば、あなたが何かを持っていると思います、あなたが保存したいファイルが「foobar.png」と呼ばれていることを言わせて、あなたは下の名前のディレクトリに保存したいですまた、ファイルにエラーをダンプするようだが、プログラムの開始時にchdir("/home/myname")にうまくやって、 ".stackdump"ファイルがアクセスできる場所に置かれるようにすることができます。

他にも、タスクスケジューラがスクリプトをnobodyまたはその他の権限を必要としないアカウントとして実行している可能性があります。その場合は、fopenchdirの完全パスをグローバル書き込み可能領域(/tmpなど)または公開アクセス権を持つ作業ディレクトリに使用することをお勧めします。たとえば、次のように

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

(権限のないプログラムは、それはそれで何かを読み取ることができないにもかかわらず、そのサブディレクトリへのアクセスを得ることができるようにあなたのホームディレクトリに実行ビットを設定してください。)

+0

私は単にfopen( "myfile"、 "w")を使用しています。タスクスケジューラのチェックボックスを「最高の権限設定で実行する」を選択しました。私は/ Users/Joel/Desktop/garden/snapsに書きたいと思っていますが、これはタスクスケジューラでは不可能ですか? – jeremy

+0

@Nile - もちろん書くことができます。しかし、 'fopen/fwrite'を使って書いているのであれば、その場所への完全なパスを与える必要があります。それ以外の場合は、タスクスケジューラの現在のディレクトリから削除しようとしているだけです。 – unpythonic

+0

@Nile - あなたが使用しているタスクスケジューラを指定するのに役立つかもしれません。私はあなたがLinux上で動作していると仮定しています。 – unpythonic

関連する問題