gpt4 book ai didi

c - 在 C 中使用 ioctl() 设置不可变标志

转载 作者:行者123 更新时间:2023-12-04 00:48:09 25 4
gpt4 key购买 nike

我试图制作一个脚本来创建一个文件,然后将其设置为不可变的,类似于 linux 的 chattr +i 命令。 脚本编译(使用 gcc),运行 并且文件被创建。然而,文件本身不是不可变的,可以通过简单的rm -f 删除。我试图在调用 chattr 的地方进行堆栈跟踪,我发现了一个名为 ioctl 的函数。然后,我使用了我能收集到的少量信息,并得出了下面的结论。我从 ext2_fs.h 缩小了它的范围,但它似乎不起作用。我显然忽略了一些东西。

对先前条目的更新:编译但在 ioctl() 函数上返回 -1。使用 perror() 显示的错误地址

#include <stdio.h>
#include <stdlib.h>
#include <sys/stat.h>
#include <sys/ioctl.h>
#include <linux/fs.h>

int main()
{
FILE *fp;
char shovel[16] = "I have a shovel!";
fp = fopen("/shovel.txt", "w+");
fwrite(shovel, sizeof(shovel[0]), sizeof(shovel)/sizeof(shovel[0]), fp);
ioctl(fileno(fp), FS_IOC_SETFLAGS, 0x00000010);
fclose(fp);
}

感谢任何帮助。

最佳答案

您使用了正确的 ioctl 命令,但向其传递了错误的参数。

ioctl_list(2) 的联机帮助页表明FS_IOC_SETFLAGS期望收到指向 int 的指针(一个 int * ),但您向它传递了一个整型文字(因此出现了Bad Address 错误)。

您不进行任何错误检查这一事实也无济于事。

传递给 FS_IOC_SETFLAGS 的正确标志是一个包含值 EXT2_IMMUTABLE_FL 的指针,在 ext2fs/ext2_fs.h 中定义(一些较旧的/不同的 Linux 发行版似乎在 linux/ext2_fs.h 下),所以你需要 #include <ext2fs/etx2_fs.h> .确保安装 e2fslibs-dev (可能你也需要 linux-headers)。

此代码有效:

#include <stdio.h>
#include <stdlib.h>
#include <sys/stat.h>
#include <sys/ioctl.h>
#include <linux/fs.h>
#include <ext2fs/ext2_fs.h>

int main()
{
FILE *fp;
char shovel[16] = "I have a shovel!";

if ((fp = fopen("shovel.txt", "w+")) == NULL) {
perror("fopen(3) error");
exit(EXIT_FAILURE);
}

fwrite(shovel, sizeof(shovel[0]), sizeof(shovel)/sizeof(shovel[0]), fp);

int val = EXT2_IMMUTABLE_FL;
if (ioctl(fileno(fp), FS_IOC_SETFLAGS, &val) < 0)
perror("ioctl(2) error");

fclose(fp);

return 0;
}

记得以 root 身份运行它。

更新:

作为Giuseppe Guerrini建议 his answer , 你可能想使用 FS_IMMUTABLE_FL相反,您不需要包含 ext2_fs.h :

#include <stdio.h>
#include <stdlib.h>
#include <sys/stat.h>
#include <sys/ioctl.h>
#include <linux/fs.h>

int main()
{
FILE *fp;
char shovel[16] = "I have a shovel!";

if ((fp = fopen("shovel.txt", "w+")) == NULL) {
perror("fopen(3) error");
exit(EXIT_FAILURE);
}

fwrite(shovel, sizeof(shovel[0]), sizeof(shovel)/sizeof(shovel[0]), fp);

int val = FS_IMMUTABLE_FL;
if (ioctl(fileno(fp), FS_IOC_SETFLAGS, &val) < 0)
perror("ioctl(2) error");

fclose(fp);

return 0;
}

关于c - 在 C 中使用 ioctl() 设置不可变标志,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32465756/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com