2011-07-06 3 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 예약 된 작업 기능을 사용하려고합니다. 작업 속성에서 "최고 권한으로 실행"이라고 표시된 상자를 선택했습니다.

+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 - 사용중인 작업 스케줄러를 지정하는 데 도움이 될 수도 있습니다. 나는 당신이 리눅스에서 운영되고 있다고 가정하고있다. – unpythonic

관련 문제