我有一个简单的程序:
int main()
{
std::cout << " Hello World";
fork();
}
Run Code Online (Sandbox Code Playgroud)
程序执行后我的输出是:Hello World Hello World.为什么会发生这种情况而不是单一Hello world?我猜测子进程是在幕后重新运行的,输出缓冲区是在进程之间共享的,还是那些沿着这些进程共享的东西,但就是这种情况还是其他事情发生了?
在fork子中,如果我们修改一个全局变量,它将不会在主程序中被更改.
有没有办法在子fork中更改全局变量?
#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
int glob_var;
main (int ac, char **av)
{
int pid;
glob_var = 1;
if ((pid = fork()) == 0) {
/* child */
glob_var = 5;
}
else {
/* Error */
perror ("fork");
exit (1);
}
int status;
while (wait(&status) != pid) {
}
printf("%d\n",glob_var); // this will display 1 and not 5.
}
Run Code Online (Sandbox Code Playgroud) 我目前正在开发一个项目,它是我一直在研究的框架的衍生产品(fork).
这个项目非常通用,但现在我需要再次为我的客户端分配代码库.
此时,我已经为我的客户创建了一个自定义分支,但我宁愿为此建立一个独立的存储库.
情况概要:
注意:在Github中尝试"fork fork"时,您将收到一条已经分叉项目的通知:

当父进程在子进程死后读取其退出状态时不使用等待系统调用时,会创建一个Zombie,并且当原始父进程在子进程终止时,孤立是由init回收的子进程.
在内存管理和进程表方面,这些进程的处理方式有何不同,特别是在UNIX中?
当僵尸或孤儿的创建可能对更大的应用程序或系统有害时,有什么例子或极端情况?
如果我运行经典的bash forkbomb:
:(){ :&:&};:
Run Code Online (Sandbox Code Playgroud)
我的系统在几秒钟后挂起.
我试着用C编写一个forkbomb,这里是代码:
#include <unistd.h>
int main( )
{
while(1) {
fork();
}
return 0;
}
Run Code Online (Sandbox Code Playgroud)
当我运行它时,系统的响应速度会降低,但我可以在按下时杀死该过程(即使在几分钟后)^C.
上面的代码与我发布的原始bash forkbomb不同:它更像是:
:( )
{
while true
do
:
done
}
Run Code Online (Sandbox Code Playgroud)
(我没有测试它;不知道它是否挂起系统).
所以我也尝试实现原始版本; 这里的代码:
#include <unistd.h>
inline void colon( const char *path )
{
pid_t pid = fork( );
if( pid == 0 ) {
execl( path, path, 0 );
}
}
int main( int argc, char **argv )
{
colon( argv[0] );
colon( …Run Code Online (Sandbox Code Playgroud) 我一直试图弄清楚如何在Linux内部使用fork-exec机制.根据计划,一切都在继续,直到一些网页开始让我困惑.
据说,一个子进程应该严格使用_exit()而不是简单exit()或正常的返回main().
据我所知,Linux shell fork-execs每个外部命令; 假设我上面说的是真的,结论是这些外部命令和Linux shell中发生的任何其他执行都不能正常返回!
维基百科和其他一些网页声称,我们必须使用_exit()它来防止子进程导致删除父进程的临时文件,同时可能会发生stdio缓冲区的双重刷新.虽然我理解前者,但我没有任何线索如何双重刷新缓冲区可能对Linux系统有害.
我花了一整天的时间......感谢任何澄清.
请看以下示例:
int main(void)
{
pid_t pid;
pid = fork();
if (pid == 0)
ChildProcess();
else
ParentProcess();
}
Run Code Online (Sandbox Code Playgroud)
所以纠正我,如果我错了,一旦fork()执行子进程被创建.现在通过这个答案 fork()返回两次.这对于父进程来说是一次,对于子进程则是一次.
这意味着在fork调用期间存在两个独立的进程,而不是在结束之后.
现在我不明白它如何理解如何为子进程返回0以及为父进程返回正确的PID.
这让它变得非常混乱.这个回答指出fork()通过复制进程的上下文信息并手动将返回值设置为0来工作.
首先,我说对任何函数的返回都放在一个寄存器中吗?因为在单个处理器环境中,进程只能调用一个只返回一个值的子例程(如果我错了,请纠正我).
假设我在例程中调用函数foo()并且该函数返回一个值,该值将存储在一个名为BAR的寄存器中.每次函数想要返回一个值时,它将使用特定的处理器寄存器.因此,如果我能够手动更改过程块中的返回值,我可以更改返回到函数的值吗?
所以我认为fork()的工作原理是正确的吗?
我想让我的代码的一部分更有效率.我正在考虑将它分成多个进程并让它们一次执行50/100次而不是一次.
例如(伪):
for line in file;
do
foo;
foo2;
foo3;
done
Run Code Online (Sandbox Code Playgroud)
我想这个for循环运行多次.我知道这可以通过分叉来完成.它看起来像这样吗?
while(x <= 50)
parent(child pid)
{
fork child()
}
child
{
do
foo; foo2; foo3;
done
return child_pid()
}
Run Code Online (Sandbox Code Playgroud)
或者我是否以错误的方式思考这个问题?
谢谢!
我正在使用bitbucket git repo我有只读访问权限,所以我创建了一个fork来处理我的功能.
问题:如何更新我的fork以包含对所有者所做的原始仓库所做的更改?
在github上,似乎必须执行以下操作,因此我怀疑它与此类似:
$ git remote add upstream git://github.com/octocat/Spoon-Knife.git
$ git fetch upstream
$ git merge upstream/master
Run Code Online (Sandbox Code Playgroud)
我在Bitbucket文档中找不到任何关于forking的信息