2016-07-27 2 views
0

그래서 드라이브를 지우는 프로그램을 만들려고합니다. 몇 가지 조사를 한 후에 모든 장치가 우분투의/dev/폴더 아래에 저장된다는 것을 알게되었습니다. 나는 다음과 같은 ...디스크에 직접 쓰는 방법

#include <stdio.h> 
#include <stdlib.h> 

int main(int argc, char *argv[]){ 
    FILE *fp = fopen("/dev/sdb1", "w"); 
    fwrite("\0", 1, 1, fp); 
    fclose(fp); 
    return 0; 
} 

을 시도하지만

Segmentation fault (core dumped) 

이 왜 반환 발견? 디스크에 쓸 수 없어야합니까?

+3

나는 현재의 이해 수준에서하지 않을 것입니다. –

답변

2

/dev/sdb1을 열 수있는 권한이없는 것 같습니다. 당신이 그것을 사용하기 전에 fopen (fp)의 결과를 확인합니다

#include <stdio.h> 
#include <stdlib.h> 
#include <errno.h> 
#include <string.h> 

int main(int argc, char *argv[]){ 
    FILE *fp = fopen("/dev/sdb1", "w"); 
    if(fp == NULL){ 
     fprintf(stderr, "Error opening /dev/sdb1: %s\n", 
       strerror(errno)); 
     return EXIT_FAILURE; 
    } 
    /* Now you can use fp */ 
    fwrite(0, 1, 1, fp); 
    fclose(fp); 

    return 0; 
} 

fopen 반환 NULL 실패 열고, 글로벌 * 변수 errno에 이유를 넣습니다. strerror은 해당 오류 코드에 대한 설명 문자열을 반환합니다.

블록 장치에 액세스하려면 루트로 프로그램을 실행해야합니다. 말할 필요도없이 아주 잘 디버깅하거나 시스템을 망칠 수도 있습니다 (특히 디스크에 직접 액세스하는 경우).

관련 문제