Improve company productivity with a Business Account.Sign Up

x
  • Status: Solved
  • Priority: Medium
  • Security: Public
  • Views: 263
  • Last Modified:

using lseek( )

how can i use a for loop to traverse bit_map[i] array and finds the next available free bitmap position using lseek( )?
Note: i use man lseek page but the concept is still not very clear to me can an expert help out?
0
achille67
Asked:
achille67
1 Solution
 
jlevieCommented:
lseek() is only used to position the read/write pointer to a file at a speciffied offset. It doesn't operate on arrays.
0
 
achille67Author Commented:
Oh ok, so how do i use position a read/write pointer?
0
 
Karl Heinz KremerCommented:
You first need to open a file, then you call lseek to position the read/write pointer (which one it is depends on wether you've opened the file in read or write mode):


    int fd;

    fd = open("/path/to/file", O_RDONLY);
    lseek(fd, 1000, SEEK_SET);

This sets the read pointer to the position 1000 in the file. You can find out more about these calls in th eman pages:

man 2 lseek
man 2 open


... but, this has very likely nothing to do with your problem ... What exactly are you trying to accomplish? Do you already have code for your bit_map array? If so, please show it to illustrate your problem.

0
 
achille67Author Commented:
Thanks khkremer,

The following code is simply importing linux_file from my linux file system to
to u_file residing in my own file system i just create by running the command:
./userfs -reformat 800000 file.system
At some point of the implementation of of u_import, i want to find
next free available free bitmap in bit_map[i] array  and position lseek to that place with  lseek(virtual_disk,BLOCK_SIZE_BYTES,SEEK_SET);
NOTE: u_import is a function of an entire file system homework(you may take a look at it at:  http://www.clarkson.edu/~jnm/os/homework/userfs/fs.htm)

int u_import(char* linux_file, char* u_file)
{
        int free_space;
        int num_block;
        struct stat st;
        int file_size=0;
        int remainder=0;
        int i;
        int j;

        free_space = u_quota();

        handle = open(linux_file,O_RDONLY);
        if ( -1 == handle ) {
                printf("error, reading file %s\n",linux_file);
                return 0;
        }

        fstat(handle,&st);
        file_size=(int)st.st_size;
        num_block=(int)file_size/BLOCK_SIZE_BYTES;
        if((num_block*BLOCK_SIZE_BYTES)!=file_size)
          {
            num_block++;
            remainder=file_size-(num_block*BLOCK_SIZE_BYTES);
          }
     for(i=0;i<num_block;i++)
          {
            lseek(handle,BLOCK_SIZE_BYTES*i,SEEK_SET);
             read(handle,&buffer,BLOCK_SIZE_BYTES);


             //      crash_write(virtual_disk, bit_map, sizeof(BIT)*BIT_MAP_SIZE );

             // bit_map[i] array and finds the next available free bitmap
             //position lseek to that place with
                     for (j=0; j< BIT_MAP_SIZE; j++){
             assert( free_space >= 1);
               allocate_block(i);

                 lseek(virtual_disk,BLOCK_SIZE_BYTES,SEEK_SET);

                     }
                     .
                     .
                     .
                      return 1;
}
0
 
stefan73Commented:
Hi achille67,
I see that you use int for calculating offsets. That will very likely cause problems, as offsets should be 64 bits. Define an unsigned type which you use for FS block/seek oprations, like

typedef uint32_t fs_block_t; /* For storing block numbers */
typedef uint64_t fs_seek_t;  /* For seeking in files      */

The system offers the off_t type for seeks which you can also use.

Cheers,
Stefan
0
Question has a verified solution.

Are you are experiencing a similar issue? Get a personalized answer when you ask a related question.

Have a better answer? Share it in a comment.

Join & Write a Comment

Featured Post

The 14th Annual Expert Award Winners

The results are in! Meet the top members of our 2017 Expert Awards. Congratulations to all who qualified!

Tackle projects and never again get stuck behind a technical roadblock.
Join Now