当我遇到问题时,我正在阅读这个Advanced Linux Programming教程。我试图使用以下代码弹出CD-ROM驱动器:
int fd = open(path_to_cdrom, O_RDONLY);
// Eject the CD-ROM drive
ioctl(fd, CDROMEJECT);
close(fd);
然后我尝试编译此代码并获得以下输出:
In file included from /usr/include/linux/cdrom.h:14,
from new.c:2:
/usr/include/asm/byteorder.h: In function ‘___arch__swab32’:
/usr/include/asm/byteorder.h:19: error: expected ‘)’ before ‘:’ token
/usr/include/asm/byteorder.h: In function ‘___arch__swab64’:
/usr/include/asm/byteorder.h:43: error: expected ‘)’ before ‘:’ token
那么我做错了什么?
答案 0 :(得分:7)
您看到的错误消息在#include行中看起来有问题,而不是您发布的代码。我尝试编译http://www.advancedlinuxprogramming.com/listings/chapter-6/cdrom-eject.c并且编译得很好。
答案 1 :(得分:4)
答案 2 :(得分:3)
我想你错过了#include
。你有:
#include <fcntl.h>
#include <linux/cdrom.h>
#include <sys/ioctl.h>
#include <sys/stat.h>
#include <sys/types.h>
#include <unistd.h>
这些是示例中的那些......
答案 3 :(得分:0)
在前面的示例中,不需要以下内容。
#include <sys/stat.h>
#include <sys/types.h>
如前所述,您可能需要使用O_NONBLOCK打开
您可以在位于&#39; /usr/include/linux/cdrom.h'的头文件中找到更多与CDROM设备交互的选项;或者https://github.com/torvalds/linux/blob/master/include/uapi/linux/cdrom.h
此处还有另一个使用上述更改打开和关闭CD托盘的示例。
#include <stdio.h>
#include <stdlib.h>
#include <fcntl.h>
#include <linux/cdrom.h>
#include <sys/ioctl.h>
#include <unistd.h>
int main (int argc, char* argv[])
{
// Path to CD-ROM drive
char *dev = "/dev/dvd";
int fd = open(dev, O_RDONLY | O_NONBLOCK);
if(fd == -1){
printf("Failed to open '%s'\n", dev);
exit(1);
}
printf("fd :%d\n", fd);
// Eject the CD-ROM tray
ioctl (fd, CDROMEJECT);
sleep(2);
// Close the CD-ROM tray
ioctl (fd, CDROMCLOSETRAY);
close(fd);
return 0;
}
答案 4 :(得分:-1)
打开的系统调用具有一些不必要的行为,必须将其设置为“不阻止”(即O_NONBLOCK)来处理 还要检查是否包含头文件
#include <linux/cdrom.h>