我以为我用bash测试了一些东西但遇到了这个问题:
unshare -p /bin/bashbash: fork: Cannot allocate memory
从那里运行ls给了一个核心转储.退出是唯一可能的事情.
它为什么这样做?
解决方法 该错误是由新的命名空间中的PID 1进程退出引起的.在bash开始运行之后,bash将分叉几个新的子进程来做事.如果在没有-f的情况下运行unshare,bash将具有与当前“unshare”进程相同的pID.当前的“unshare”进程调用unshare systemcall,创建一个新的pID命名空间,但当前的“unshare”进程不在新的pID命名空间中.这是linux内核的理想行为:进程A创建一个新的命名空间,进程A本身不会被放入新的命名空间,只有进程A的子进程将被放入新的命名空间.所以当你跑:
unshare -p /bin/bash
unhare进程将执行exec / bin / bash,而/ bin / bash会分叉几个子进程,bash的第一个子进程将成为新命名空间的PID 1,子进程将在完成其作业后退出.所以新命名空间的PID 1退出.
PID 1进程具有特殊功能:它应该成为所有孤立进程的父进程.如果根命名空间中的PID 1进程退出,则内核将发生混乱.如果子命名空间中的PID 1进程退出,则linux内核将调用disable_pID_allocation函数,该函数将清除该命名空间中的PIDNS_HASH_ADDING标志.当linux内核创建一个新进程时,内核将调用alloc_pID函数在命名空间中分配PID,如果未设置PIDNS_HASH_ADDING标志,则alloc_pID函数将返回-ENOMEM错误.这就是你得到“无法分配内存”错误的原因.
您可以使用’-f’选项解决此问题:
unshare -fp /bin/bash
如果使用’-f’选项运行unshare,unshare将在创建新的pID命名空间后派生一个新进程.并在新进程中运行/ bin / bash.新进程将是新pID命名空间的pID 1.然后bash还会分叉几个子进程来做一些工作.由于bash本身是新pID命名空间的pID 1,因此其子进程可以毫无问题地退出.
总结以上是内存溢出为你收集整理的linux – unshare –pid / bin / bash – fork无法分配内存全部内容,希望文章能够帮你解决linux – unshare –pid / bin / bash – fork无法分配内存所遇到的程序开发问题。
如果觉得内存溢出网站内容还不错,欢迎将内存溢出网站推荐给程序员好友。
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)