#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
. Если вы хотите знать, как это делается, используйте исходный код, Люк , но не ожидайте найти тривиальную программу.