DVD/CD 등의 장치 핸들링 및 써진 용량 체크(for linux)
Unix/Linux 2007/03/19 20:20
growisofs 등으로 DVD/CD 를 쓸때 적정선에서 DVD 매체 마지막 부분을 끊어 줘야 하는데 그부분을 찾기가 힘들다.
꼭writing 할때 뿐만 아니라 DVD.CD 플레이어를 핸들링 할경우 매체의 끝을 찾는 것은 종종 쓰인다.
CD/DVD 픞레이어를 통제할때 아래와 같이 ioctl 을 통해서 장치나 CD/DVD 상태를 알아 온뒤
알맞게 처리 한다.
DVD +R 미디어를 통해서 테스트 했음을 찾고 바란다.
status = ioctl(fd, CDROM_DRIVE_STATUS, CDSL_CURRENT) //Driver 상태를 알아냄.
switch
{
case CD_DISK_NEW: // CD 가 신삥...
....
break;
case CDS_DISC_OK: // 쓸 CD 가 들어 있음
status = ioctl(fd, CDROMREADTOCHDR, &th);
if(status != 0)
{
}
status = ioctl(fd, CDROM_DISC_STATUS, CDSL_CURRENT); //CD 상태를 알아냄
switch(status)
{
case CDS_AUDIO: //오디오 시디인가
....
break;
case CDS_DATA_1: //데이타 시디인가
case CDS_DATA_2:
.....
break;
case CDS_MIXED: //짬뽕인가?
break;
}
....
break;
case CDS_NO_INFO: // Driver 정보 알수 없음.
....
break;
case NO_DISK: // 안에 비어 있음
....
break;
}
ioctl 에서 두번째 인자를 통해서 다른 정보를 알아 낼수도 있는데.
http://www.linuxhq.com/kernel/v2.6/10-rc2-bk17/Documentation/ioctl/cdrom.txt 요런 문서를 보고 참고하기 바람다.
이중 언급할것은 CDROM_NEXT_WRITABLE ,CDROM_LAST_WRITTEN 으로써 화일이 얼마나 써졌는가를 알아 볼수 있다.
--------------------------------------------------------------------
ex)
#include <sys/ioctl.h>
#include <linux/cdrom.h>
#include <fstab.h>
#include <syslog.h>
#include <netdb.h>
#include <stdio.h>
#include <signal.h>
#include <stdlib.h>
#include <stdarg.h>
#include <string.h>
#include <errno.h>
#include <fcntl.h>
int main()
{
int fd;
int re;
long next;
char devName[20] = "/dev/hda"; //장치명
fd = open(devName, O_RDONLY | O_NONBLOCK); //장치 열고
if(fd < 0)
{
printf("ERROR %s\n",devName);
}
re = ioctl(fd,CDROM_NEXT_WRITABLE,&next); //다음쓸수 있는 block 주소 알아냄
printf("STATUS:%d ... nextblock:%d\n",re,next);
re = ioctl(fd,CDROM_LAST_WRITTEN,&next); // 마지막으로 썻던 block 주소 알아냄(다음쓸수 있는 block 과는 7정도 차이)
printf("STATUS:%d ... lastblock:%d\n",re,next);
return 1;
}
---------------------------------------------------------------
결과 값은 block 으로 나타난다.
+ CDROM_NEXT_WRITABLE get next writable block
+ CDROM_LAST_WRITTEN get last block written on disc
# gcc -o ioctl_test ioctl_test.c
# ./ioctl_test
STATUS:0 ... nextblock:1175
STATUS:0 ... lastblock:1168
한블락이 어느정도의 용량 byte 인지 알수는 없으나.
빈씨디를 넣고 다음쓸 블럭과 마지막 쓴 블럭을 알아 볼경우
STATUS:-1 ... nextblock:8421364
STATUS:-1 ... lastblock:8421364
이런식으로 나오는 것으로 보아 4.7GB DVD 의 경우 8421364 개 정도의 block 을 가지고 있다라고 유추된다.
(매체가 몇개의 block 을 가졌는지 알수 있는 인자는 없는거 같지만)
이미 사용된 블락수 : 전체 블락수 (8421364) = X : 4.7G 라는 초딩때 배운 방정식으로 알아 낼수 있을듯 하다.
--------------------------------------------------
실례로 쓰다만 DVD 에 대해서 위의 코드를 실행시켜 본 결과
STATUS:0 ... nextblock:36887
STATUS:0 ... nextblock:36880
이런 결과가 나왔고 대충 한번쓰고 다시 쓸때 7block 정도의 over head 를 가지는 것을 알수 있다.
끝으로 ioctl 을 사용 하든 뭐를 사용하든 DVD 의 사용된 용량을 알아 낼수 있는 방법이 있으시면
리플달아 주시기 바란다...
Trackback Address :: http://www.microstrong.pe.kr/tt/trackback/7




