Re: dummy file read periodically for external USB Hard Disk

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

 



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




[Index of Archives]     [Linux Ext4 Filesystem]     [Union Filesystem]     [Filesystem Testing]     [Ceph Users]     [Ecryptfs]     [AutoFS]     [Kernel Newbies]     [Share Photos]     [Security]     [Netfilter]     [Bugtraq]     [Yosemite News]     [MIPS Linux]     [ARM Linux]     [Linux Security]     [Linux Cachefs]     [Reiser Filesystem]     [Linux RAID]     [Samba]     [Device Mapper]     [CEPH Development]
  Powered by Linux