我最近写了一个简单的shell。我实现管道时出现了这个问题。
我知道Ubuntu中命令行参数的最大长度是2097152.(this}
#define MAX_CMD_LEN 2097152
但我想知道管道命令的最大数量是多少? 例如:( n的数量)
ps -aux | grep "a.out" | awk '{print $5}' | top | ... | cat
1 | 2 | 3 | 4 | ... | n
答案 0 :(得分:5)
不,没有这样的限制。对于单个进程表条目,ARG_MAX
适用(对于组合环境和argv长度)。但是,管道跨越单独的进程表条目,并且每个部分仅连接到它之前的进程(通过stdin)和之后的进程(通过stdout)。没有一个地方需要将整个管道作为一个单元存储或跟踪在操作系统内部(与构造外壳相对)。
答案 1 :(得分:1)
对管道的长度没有严格的限制(即组成它的命令的数量)。但是,可以使用setrlimit(2) RLIMIT_NPROC
限制最大进程数,并且每个系统都有一些绝对限制。同样,文件描述符的数量可以用RLIMIT_NOFILE
此外,您的shell将调用pipe(2),并且该系统调用可能会失败(这实际上是限制性的)。
顺便说一句,最大命令行最好不要是硬连线限制(可以某种方式改变)。限制是execve(2)失败时。您可以使用sysconf(_SC_ARG_MAX)
-see sysconf(3)来查询相关内容。
最后proc(5)可用于查询某些相关的阈值,例如使用/proc/sys/fs/pipe-max-size
,/proc/sys/kernel/core_pipe_limit
等
最重要的是,您不应在shell中构建任何接线限制。您应该只管理资源并处理失败(syscalls(2)
以及malloc(3)等标准函数。避免像你的MAX_CMD_LEN
那样定义任意的内置限制(顺便说一下,我运行内核3.17的Debian / Sid / x86-64上的确切数字不一样,我自己编译)。