Questions tagged «fork»

7
为什么我们需要创建新流程?
在Unix中,每当我们要创建一个新进程时,便会分叉当前进程,并创建一个与父进程完全相同的新子进程。然后执行exec系统调用,用新流程替换父流程中的所有数据。 为什么我们首先创建父流程的副本,而不直接创建新流程?

3
为什么我不能用叉子炸弹使系统崩溃?
最近,我一直在挖掘有关GNU / Linux中进程的信息,并且遇到了臭名昭著的fork炸弹: :(){ : | :& }; : 从理论上讲,它应该无限地自我复制,直到系统用尽资源为止。 但是,我尝试在CLI Debian和GUI Mint发行版上进行测试,并且似乎对系统影响不大。是的,这里创建了无数的进程,过了一会儿我读到控制台消息,例如: bash:fork:资源暂时不可用 bash:fork:重试:没有子进程 但是一段时间后,所有进程都被杀死,一切恢复正常。我读过ulimit设置了每个用户的最大进程数,但是我似乎无法真正提高它。 对叉弹有哪些系统保护措施?它为什么不复制自身,直到一切冻结或至少滞后很多?有没有办法用叉子炸弹使系统真正崩溃?
54 linux  process  fork  ulimit 

4
为什么带有fork()的程序有时会多次输出其输出?
在程序1中Hello world仅被打印一次,但是当我删除 \n并运行它(程序2)时,输出被打印8次。有人可以给我解释一下\n这里的意义以及它如何影响fork()吗? 程序1 #include <sys/types.h> #include <unistd.h> #include <stdio.h> #include <stdlib.h> int main() { printf("hello world...\n"); fork(); fork(); fork(); } 输出1: hello world... 程序2 #include <sys/types.h> #include <unistd.h> #include <stdio.h> #include <stdlib.h> int main() { printf("hello world..."); fork(); fork(); fork(); } 输出2: hello world... hello world...hello world...hello world...hello world...hello …
50 c  fork 

2
为什么默认流程创建机制为fork?
用于进程创建的UNIX系统调用fork()通过复制父进程来创建子进程。我的理解是,几乎总是在此之后调用exec()来替换子进程的内存空间(包括文本段)。在fork()中复制父级的内存空间似乎一直对我很浪费(尽管我意识到可以通过使内存段在写入时进行复制来最小化浪费,从而仅复制指针)。无论如何,有人知道为什么流程创建需要这种重复方法吗?


4
子进程是否与其父进程一起死亡,是否有任何UNIX变体?
我已经研究Linux内核行为已经有一段时间了,对我来说很清楚: 当一个进程死亡时,所有的子进程都将返回该init进程(PID 1),直到最终死亡。 但是,最近,一个比我更了解内核的人告诉我: 当进程退出时,它的所有子进程也会死亡(除非您使用NOHUP这种情况,否则它们会返回init)。 现在,即使我不相信这一点,我仍然编写了一个简单的程序来确保这一点。我知道我不应该依赖时间(sleep)进行测试,因为这完全取决于流程调度,但是对于这种简单情况,我认为这已经足够了。 int main(void){ printf("Father process spawned (%d).\n", getpid()); sleep(5); if(fork() == 0){ printf("Child process spawned (%d => %d).\n", getppid(), getpid()); sleep(15); printf("Child process exiting (%d => %d).\n", getppid(), getpid()); exit(0); } sleep(5); printf(stdout, "Father process exiting (%d).\n", getpid()); return EXIT_SUCCESS; } 这是程序的输出,ps每次printf通话时都有相关的结果: $ ./test & …
41 process  init  exit  fork 

3
使用4.3内核创建线程失败,并显示“资源暂时不可用”
我在带有多个容器的Arch Linux(内核4.3.3-2)上运行docker服务器。自从我上次重启以来,Docker服务器和容器中的随机程序都崩溃,并显示一条消息,提示无法创建线程或(较不频繁)进行分叉。根据程序的不同,特定的错误消息也有所不同,但是大多数错误消息似乎都提到了特定的错误Resource temporarily unavailable。有关某些示例错误消息,请参见本文末尾。 现在有很多人收到此错误消息,并对它们有很多响应。真正令人沮丧的是,每个人似乎都在猜测如何解决该问题,但是似乎没有人指出如何确定问题的许多可能原因中的哪一个。 我已经收集了以下5种可能的错误原因以及如何验证它们在我的系统上不存在的原因: 在/proc/sys/kernel/threads-max(source)中配置的线程数存在系统范围的限制。就我而言,该设置为60613。 每个线程都在堆栈中占用一些空间。堆栈大小限制是使用ulimit -s(source)配置的。我的壳的极限曾经是8192,但我已经通过将增加其* soft stack 32768成/etc/security/limits.conf,因此它ulimit -s现在的回报32768。我还通过将(source)添加LimitSTACK=33554432到docker进程中,并通过查看docker容器并在其中运行来验证该限制是否适用。/etc/systemd/system/docker.service/proc/<pid of docker>/limitsulimit -s 每个线程都会占用一些内存。使用来配置虚拟内存限制ulimit -v。在我的系统上,它设置为unlimited,并且我3 GB的内存中有80%可用。 使用的进程数有限制ulimit -u。在这种情况下,线程被视为进程(source)。在我的系统上,限制设置为30306,对于docker守护程序和docker容器内部,限制为1048576。可以通过运行ls -1d /proc/*/task/* | wc -l或通过运行ps -elfT | wc -l(source)找出当前正在运行的线程数。在我的系统上,它们介于700和之间800。 打开文件的数量有限制,根据某些来源的资料,在创建线程时这也很重要。限制是使用配置的ulimit -n。在我的系统和docker内部,限制设置为1048576。可以使用lsof | wc -l(source)找出打开的文件数,在我的系统上大约是30000。 上次重启之前,我正在运行内核4.2.5-1,现在我正在运行4.3.3-2。降级到4.2.5-1可以解决所有问题。其他提到问题的帖子是this和this。我已经打开了Arch Linux的错误报告。 内核中发生了什么变化可能导致这种情况? 以下是一些示例错误消息: Crash dump was written to: erl_crash.dump Failed to create aux thread …
39 linux  docker  limit  fork  thread 

3
2.6内核Linux上的Fork vs Clone
我对分叉和克隆有些困惑。我看到了: fork用于进程,克隆用于线程 fork只调用clone,clone用于所有进程和线程 这些准确吗?这两个使用2.6 Linux内核的系统调用之间有什么区别?
37 linux  fork 

3
fork:重试:资源暂时不可用
当我连接到服务器时, -bash: fork: retry: Resource temporarily unavailable -bash: fork: retry: Resource temporarily unavailable -bash: fork: retry: Resource temporarily unavailable -bash: fork: retry: Resource temporarily unavailable -bash: fork: Resource temporarily unavailable 而且我也尝试遵循以下命令,因此结果是相同的。 -bash-4.1$ df -h -bash: fork: retry: Resource temporarily unavailable -bash: fork: retry: Resource temporarily unavailable -bash: fork: retry: Resource …
31 linux  fork 

3
是否fork()立即在Linux中复制整个进程堆?
一个fork()系统调用克隆会从正在运行的进程子进程。除了PID以外,这两个过程是相同的。 自然地,如果进程只是从其堆中读取而不是对其进行写入,则复制堆将浪费大量内存。 是否复制了整个进程堆?是否以仅写入触发堆复制的方式进行了优化?
30 linux  fork 

3
如果您已经使用'&'分叉了,什么时候需要'nohup'?
首先,这个问题是相关的,但绝对不同于这个非常好的问题: nohup,disown和&之间的区别 我想了解一些东西:当我做“&”时,我在分叉吗? 做“ nohup ...&”曾经有用还是简单而足够? 有人可以说明您将使用“&”并且仍想使用“ nohup”的情况吗?
26 shell  nohup  fork 

3
bash是否支持类似于C的fork()的分支?
我有一个脚本,我想一次分叉,以便同一脚本的两个副本正在运行。 例如,我希望存在以下bash脚本: echo $$ do_fork() echo $$ 如果此bash脚本确实存在,则预期输出为: <ProcessA PID> <ProcessB PID> <ProcessA PID> 要么 <ProcessA PID> <ProcessA PID> <ProcessB PID> 我可以代替“ do_fork()”来获得这种输出,还是使bash脚本执行类似于C的fork?
25 shell  fork 

3
fork()中的写时复制如何处理多个fork?
根据维基百科(可能是错误的) 发出fork()系统调用时,将创建与父进程对应的所有页面的副本,并由OS加载到子进程的单独内存位置。但这在某些情况下是不需要的。请考虑以下情况:孩子执行exec系统调用(用于从C程序中执行任何可执行文件)或在以后很快退出fork()。当仅需要子进程来执行父进程的命令时,就不需要复制父进程的页面,因为exec用要执行的命令替换了调用它的进程的地址空间。 在这种情况下,将使用一种称为写时复制(COW)的技术。使用此技术时,发生派生时,不会为子进程复制父进程的页面。而是在子进程和父进程之间共享页面。每当进程(父级或子级)修改页面时,都会为执行修改的那个进程(父级或子级)单独制作该页面的单独副本。然后,此过程将使用新复制的页面,而不是将来所有引用中的共享页面。另一个过程(未修改共享页面的过程)继续使用页面的原始副本(现在不再共享)。此技术称为写时复制,因为在某些进程向页面写入内容时会对其进行复制。 似乎当任何一个进程试图将其写入页面时,都会分配该页面的新副本并将其分配给产生页面错误的进程。之后原始页面将被标记为可写。 我的问题是:如果fork()在任何进程尝试写入共享页面之前多次调用gets ,会发生什么?
23 linux  c  fork 

1
叉子炸弹如何工作?
警告请勿尝试在生产机器上运行 在阅读有关该主题的Wikipedia页面时,通常会使用以下代码来了解发生的情况: :(){ :|:& };: 描述摘录 接下来的叉子炸弹在2002年被作为艺术品展出;56 其确切来源尚不清楚,但在2002年之前在Usenet上存在。通过将以下13个字符粘贴到UNIX shell(例如bash或zsh)中来执行炸弹 。它通过定义一个称为“:”的函数进行操作,该函数两次调用自身,一次在前台,一次在后台。 但是最后一点对我来说还不是很清楚。我看到了函数定义: :(){ ... } 但是还发生了什么?还做其他壳,例如ksh,csh和tcsh也遭受了能够构造类似的东西同样的命运?
22 bash  shell-script  zsh  fork 

4
在fork()之后,孩子将从哪里开始执行?
我正在尝试学习UNIX编程,并且遇到了有关fork()的问题。我知道fork()创建的进程与当前正在运行的进程相同,但是它从哪里开始?例如,如果我有代码 int main (int argc, char **argv) { int retval; printf ("This is most definitely the parent process\n"); fflush (stdout); retval = fork (); printf ("Which process printed this?\n"); return (EXIT_SUCCESS); } 输出为: 这绝对是父进程, 哪个进程打印了此文件? 哪个过程印出了这个? 我以为会fork()创建一个相同的过程,所以我最初认为在该程序中,该fork()调用将被永久递归调用。我猜是从通话fork()后开始创建的新流程fork()? 如果我添加以下代码,以区分父进程和子进程, if (child_pid = fork ()) printf ("This is the parent, child pid …
22 process  c  fork  api 

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.