您好, 欢迎来到 !    登录 | 注册 | | 设为首页 | 收藏本站

为什么subprocess.Popen参数长度限制小于操作系统报告的内容?

为什么subprocess.Popen参数长度限制小于操作系统报告的内容?

单个字符串参数的最大大小限制为131072。与python无关:

~$ /bin/echo "$(printf "%*s" 131071 "a")">/dev/null
~$ /bin/echo "$(printf "%*s" 131072 "a")">/dev/null
bash: /bin/echo: Argument list too long

实际上,MAX_ARG_STRLEN它决定了单个字符串的最大大小:

作为自2.6.23以来的附加限制,一个参数不得超过MAX_ARG_STRLEN(131072)。如果您生成一个调用,例如“ sh -c’使用长参数生成’”,这可能变得很重要。(由Xan Lopez和Ralf Wildenhues指出)

的讨论ARG_MAX,“参数数目和一个参数的最大长度”,并在这个问题unix.stackexchange

您可以在中看到它binfmts.h

/*
 * These are the maximum length and maximum number of strings passed to the
 * execve() system call.  MAX_ARG_STRLEN is essentially random but serves to
 * prevent the kernel from being unduly impacted by misaddressed pointers.
 * MAX_ARG_STRINGS is chosen to fit in a signed 32-bit integer.
 */
#define MAX_ARG_STRLEN (PAGE_SIZE * 32)
#define MAX_ARG_STRINGS 0x7FFFFFFF

~$ echo $(( $(getconf PAGE_SIZE)*32 )) 
131072

您可以传递多个length的字符串131071

subprocess.check_call(['echo', "a"*131071,"b"*131071], executable='/bin/bash',stdout=open("/dev/null","w"))

但是单个字符串arg不能超过131071字节。

其他 2022/1/1 18:17:03 有492人围观

撰写回答


你尚未登录,登录后可以

和开发者交流问题的细节

关注并接收问题和回答的更新提醒

参与内容的编辑和改进,让解决方法与时俱进

请先登录

推荐问题


联系我
置顶