我是linux设备驱动程序的新手。我想写一个C/C++代码来执行文件从raspberry pi到usb闪存的传输。我有困难的起点,所以我尝试了libusb从signal11的HID设备样本代码,该代码可以很好地检测我的光学鼠标及其设备ID,然后我试图获得usb驱动器供应商的id,不知怎么它给我非常有线的号码。最后,我提出了一个非常愚蠢的尝试,为cp编写一个bash脚本,将一个文件发送到usb闪存驱动器,并在C++中激活该脚本,但我觉得这样做并不合适。然后,我从SCSI协议开始,我很难理解它是如何得到works.Any指导方针的。
int scsi_get_serial(int fd, void *buf, size_t buf_len) {
// we shall retrieve page 0x80 as per http://en.wikipedia.org/wiki/SCSI_Inquiry_Command
unsigned char inq_cmd[] = {INQUIRY, 1, 0x80, 0, buf_len, 0};
unsigned char sense[32];
struct sg_io_hdr io_hdr;
int result;
memset(&io_hdr, 0, sizeof (io_hdr));
io_hdr.interface_id = 'S';
io_hdr.cmdp = inq_cmd;
io_hdr.cmd_len = sizeof (inq_cmd);
io_hdr.dxferp = buf;
io_hdr.dxfer_len = buf_len;
io_hdr.dxfer_direction = SG_DXFER_FROM_DEV;
io_hdr.sbp = sense;
io_hdr.mx_sb_len = sizeof (sense);
io_hdr.timeout = 5000;
result = ioctl(fd, SG_IO, &io_hdr);
if (result < 0)
return result;
if ((io_hdr.info & SG_INFO_OK_MASK) != SG_INFO_OK)
return 1;
return 0;
}
int main(int argc, char** argv) {
//char *dev = "/dev/sda";
char *dev = "/dev/sg2";
char scsi_serial[255];
int rc;
int fd;
fd = open(dev, O_RDONLY | O_NONBLOCK);
if (fd < 0) {
perror(dev);
}
memset(scsi_serial, 0, sizeof (scsi_serial));
rc = scsi_get_serial(fd, scsi_serial, 255);
// scsi_serial[3] is the length of the serial number
// scsi_serial[4] is serial number (raw, NOT null terminated)
if (rc < 0) {
printf("FAIL, rc=%d, errno=%d\n", rc, errno);
} else
if (rc == 1) {
printf("FAIL, rc=%d, drive doesn't report serial number\n", rc);
} else {
if (!scsi_serial[3]) {
printf("Failed to retrieve serial for %s\n", dev);
return -1;
}
printf("Serial Number: %.*s\n", (size_t) scsi_serial[3], (char *) & scsi_serial[4]);
}
close(fd);
return (EXIT_SUCCESS);
}我得到这个序列号: 00/1F
然后我试着用test.sh写这个
cp /home/Desktop/stl4.pdf /media/mini_flash并在C++中运行system("./test.sh")
发布于 2013-08-12 09:16:18
这个问题似乎自相矛盾,一开始你说你想要使用内核驱动程序复制一个文件,至少这看起来很奇怪。然后说您使用libusb,它是一个用户空间库。然后,您会说您试图使用cp执行一个shell脚本。也许您想要的只是一个简单的代码片段,它可以从用户空间 C/C++程序中复制文件吗?试试one of these snippets。
详细地说,如果您只想做一个与C++等价的cp /home/Desktop/stl4.pdf /media/mini_flash,那么这就足够了:
ifstream in("/home/Desktop/stl4.pdf",ios::binary);
ofstream out("/media/mini_flash/stl4.pdf",ios::binary);
out<<in.rdbuf();
in.close();
out.close();https://stackoverflow.com/questions/18183122
复制相似问题