📄 实例13-6.c
字号:
#include <unistd.h>
#include <stdlib.h>
#include <fcntl.h>
#include <sys/ioctl.h>
#include <linux/cdrom.h>
/* CD驱动器对应的设备文件 */
#define DEVICE "/dev/cdrom"
int main()
{
int fd;
int status;
int track;
struct cdrom_tochdr header; /* TOC头部 */
struct cdrom_tocentry entry; /* TOC条目 */
/* 打开设备 */
fd = open(DEVICE, O_RDONLY);
if (fd < 0) {
perror("unable to open " DEVICE);
exit(1);
}
/* 计算音轨数目 */
status = ioctl(fd, CDROMREADTOCHDR, &header);
if (status != 0) {
perror("CDROMREADTOCHDR ioctl failed");
exit(1);
}
/* 输出CD中各条音轨的信息 */
for (track = 1; track <= header.cdth_trk1; track ++) {
entry.cdte_track = track;
entry.cdte_format = CDROM_MSF; /* 采用MSF格式地址 */
status = ioctl(fd, CDROMREADTOCENTRY, &entry);
if (status != 0) {
perror("CDROMREADTOCENTRY ioctl failed");
exit(1);
}
printf("Track%02d: %5d %02d:%02d.%03d %c \n",
track, entry.cdte_track,
entry.cdte_addr.msf.minute,
entry.cdte_addr.msf.second,
entry.cdte_addr.msf.frame,
(entry.cdte_ctrl & CDROM_DATA_TRACK) ? 'D' : 'A');
}
/* 输出起始(leadout)音轨的信息 */
entry.cdte_track = CDROM_LEADOUT;
status = ioctl(fd, CDROMREADTOCENTRY, &entry);
if (status != 0) {
perror("CDROMREADTOCENTRY ioctl failed");
exit(1);
}
printf("Track leadout: %02d:%02d.%03d \n",
entry.cdte_addr.msf.minute,
entry.cdte_addr.msf.second,
entry.cdte_addr.msf.frame);
/* 关闭设备 */
status = close(fd);
if (status != 0) {
perror("unable to close " DEVICE);
exit(1);
}
return 0;
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -