изменение размера блочного устройства в c linux

#c #linux #file #block #device

#c #linux #файл #блок #устройство

Вопрос:

Я написал функцию, которая должна изменять размер любого блочного устройства, команда lsblk выдает этот результат

 NAME   MAJ:MIN RM   SIZE RO TYPE MOUNTPOINT
sda      8:0    0 465.8G  0 disk 
├─sda1   8:1    0 457.9G  0 part /
├─sda2   8:2    0     1K  0 part 
└─sda5   8:5    0   7.9G  0 part [SWAP]
  

моя функция ->

 int _some_func(
            int path,
                int size)
{
        struct  stat stat_buf;

        /*check if file is valid*/ 
        if(!((fcntl(path, F_GETFL) != -1) || (errno != EBADF)))
        {
                perror("invalid file descriptorn");
                return -1;
        }

        /*get file properties in stat_buf*/
        if( -1 == fstat(path, amp;stat_buf))
        {
                perror("error in statn");
                return -1;
        }

        /*return error -1 if file is not block device*/
        if((stat_buf.st_mode amp; S_IFMT) != S_IFBLK)
        {
                perror("not a block devicen");
                return -1;
        }

        return(ftruncate(path,size) );

}

int main()
{
        long int curr_size = 0;
        struct  stat stat_buf;
        int fd = open("/dev/sda1",O_RDWR,0777);
        if(fd < 0)  perror("errorn");

        /*get file properties in stat_buf*/
        if( -1 == fstat(fd, amp;stat_buf))
        {
                perror("error in statn");
                return -1;
        }

        curr_size = stat_buf.st_size;
        printf("current size =%ldn",curr_size);
        if(_ss_size(fd,curr_size 50) == 0)
        {
                /*get file properties in stat_buf*/
                if( -1 == fstat(fd, amp;stat_buf))
                {
                        perror("error in statn");
                        return -1;
                }

                curr_size = stat_buf.st_size;
                printf("changed size =%ldn",curr_size);

        }
        else
        {
                perror("error in _ss_sizen");
        }



}
  

вывод ->
текущий размер = 0
ошибка в _ss_size

: Недопустимый аргумент

1> почему текущий размер «/dev/ sda1» отображается как 0, но в lsblk размер равен = 457,9G 2> почему возникает ошибка в _ss_size: недопустимый аргумент (это возвращаемое значение) команды ftruncate .

если ftruncate не работает, то какой системный вызов будет работать?

Комментарии:

1. Не существует единого системного вызова, который позволял бы вам уменьшить объем (т.Е. Блочное устройство), по крайней мере, неразрушающим способом.

2. что такое неразрушающий способ и каковы его последствия?

3. Лучший и наиболее неразрушающий способ включает в себя не программирование, а использование gparted . Если вы хотите знать, как это делается, используйте исходный код, Люк , но не ожидайте найти тривиальную программу.