gpt4 book ai didi

linux - 仅针对父创建的文件的子文件大小限制?

转载 作者:塔克拉玛干 更新时间:2023-11-03 01:27:14 25 4
gpt4 key购买 nike

如何限制父创建的文件大小,但不限制子生成的文件?

我有一个用例,其中父进程将 STDOUT 重定向到文件,子进程写入 STDOUT(这将被重定向到父进程创建的文件)。

我已将父进程的文件大小限制设置为 50 MB,而子进程没有限制。

当重定向 STDOUT 的文件的文件大小超过 50 MB 时,如何确保父进程获得 SIGXFSZ。

最佳答案

文件大小受到限制,当使用 setrlimit(2) 设置 RLIMIT_FSIZE 限制时,会生成 SIGXFSZ .

子进程从父进程继承资源限制:

A child process created via fork(2) inherits its parent's resource limits. Resource limits are preserved across execve(2).

资源限制是每个进程 的属性,不是全局的也不是每个文件的。具体来说,对于 RLIMIT_FSIZE:

RLIMIT_FSIZE

The maximum size of files that the process may create. Attempts to extend a file beyond this limit result in delivery of a SIGXFSZ signal. [...]

此限制适用于进程更改文件大小时。如果文件大小变得大于当前进程的RLIMIT_FSIZE值,则会生成SIGXFSZEFBIG


您可以在内核源代码中查看这一点。参见 mm/filemap.c :

inline ssize_t generic_write_checks(struct kiocb *iocb, struct iov_iter *from)
{
...

unsigned long limit = rlimit(RLIMIT_FSIZE);

...

if (limit != RLIM_INFINITY) {
if (iocb->ki_pos >= limit) {
send_sig(SIGXFSZ, current, 0);
return -EFBIG;
}

...

include/linux/sched.h :

static inline unsigned long rlimit(unsigned int limit)
{
return task_rlimit(current, limit);
}

请注意 current这是指向当前进程的指针。


总结:

  • 如果父级设置了RLIMIT_FSIZE,则当父级写入任何文件时应用此限制;
  • 如果 child 覆盖RLIMIT_FSIZE,则当 child 写入任何文件时应用新的限制。

Parent process has some limit and if any file created by parent exceed limit it should get SIGXFSZ. Now child is merely writting data to file created by parent so shouldn't size of file be considered in parents limit?

不,不应该。当 child 写入文件时,内核检查 child 的 RLIMIT_FSIZE 值。内核不会理会哪个进程创建或打开了文件。

关于linux - 仅针对父创建的文件的子文件大小限制?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32905480/

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