hi NeilBrown: 2014-07-10 8:47 GMT+08:00 NeilBrown <neilb@xxxxxxx>: > On Wed, 9 Jul 2014 22:13:28 +0800 loody <miloody@xxxxxxxxx> wrote: > >> hi NeilBrown: >> we use below c source but there is no read command firing from usb >> host to device. >> except O_DIRECT, is there any flag we need to use? >> appreciate all your kind help, >> >> #include <stdio.h> >> #include <stdlib.h> >> #include <sys/types.h> >> #include <sys/stat.h> >> #include <fcntl.h> >> >> char message[] = "/mnt/usb/4854344154343452/ >> test.txt"; >> int main() >> { >> int fd; >> char buffer[5]; >> int count = 0; >> char *buf="1234567890"; >> if((fd=open(message,O_CREAT|O_TRUNC|O_RDWR|O_DIRECT, 0777))<0) > > I said "Open the device with O_DIRECT". You are opening a file in the > filesystem which is mounted from the device. That is a different thing. sorry for misunderstanding your explanation. > >> { >> perror("open"); >> return -1; >> } >> printf("fd=%d\n", fd); >> write(fd, buf, strlen(buf)); >> while(1){ >> lseek(fd,0,SEEK_SET); >> sleep(3); >> count = read(fd, buffer, 3); > > Did you do any research to understand how O_DIRECT works? > I recommend the man page for "open(2)". > > You need to read thoroughly, but towards the end it says: > > Under Linux 2.4, transfer sizes, and the alignment of the user buffer and the > file offset must all be multiples of the logical block size of the file sys- > tem. Under Linux 2.6, alignment to 512-byte boundaries suffices. > > Neither your buffer nor your IO size is 512-byte aligned. I follow your suggestion and try to read /dev/sda or /dev/sda1 for 512Bytes like below. But the read back count is -1, that mean the read is not successful. I try to open both with "O_DIRECT" or "O_DIRECT|O_RDONLY" but all of them get read back count are -1. Does that mean block device node not support system read command? appreciate your help, #define _GNU_SOURCE #include <stdio.h> #include <stdlib.h> #include <sys/types.h> #include <sys/stat.h> #include <fcntl.h> char message[] = "/dev/sda1"; int main() { int fd; char buffer[1024]; int count; //if((fd=open(message,O_DIRECT))<0) if((fd=open(message,O_DIRECT|O_RDONLY))<0) { perror("open"); return -1; } printf("fd=%d\n", fd); while(1){ sleep(3); count = read(fd, buffer, 512); //read back fail printf("count=%d,%x,%x,%x\n", count,buffer[0],buffer[1],buffer[2]); } close(fd); } -- To unsubscribe from this list: send the line "unsubscribe linux-fsdevel" in the body of a message to majordomo@xxxxxxxxxxxxxxx More majordomo info at http://vger.kernel.org/majordomo-info.html