标签: fork

fork()和输出

我有一个简单的程序:

int main()
{
    std::cout << " Hello World";
    fork();
}
Run Code Online (Sandbox Code Playgroud)

程序执行后我的输出是:Hello World Hello World.为什么会发生这种情况而不是单一Hello world?我猜测子进程是在幕后重新运行的,输出缓冲区是在进程之间共享的,还是那些沿着这些进程共享的东西,但就是这种情况还是其他事情发生了?

c++ unix linux fork

56
推荐指数
6
解决办法
4235
查看次数

如何在进程fork()之间共享内存?

在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)

c fork

56
推荐指数
2
解决办法
7万
查看次数

是否可以在Github中"叉叉"?

我目前正在开发一个项目,它是我一直在研究的框架的衍生产品(fork).

这个项目非常通用,但现在我需要再次为我的客户端分配代码库.

此时,我已经为我的客户创建了一个自定义分支,但我宁愿为此建立一个独立的存储库.

  • 有可能'叉叉'吗?
  • 如果没有,我有什么替代品?

情况概要:

  • 框架库(原始)
    • 通用应用程序库(fork)
      • (尚未)客户端存储库(应用程序分支)

注意:在Github中尝试"fork fork"时,您将收到一条已经分叉项目的通知:

显示分叉项目的图像无法再次分叉

git version-control fork github

55
推荐指数
3
解决办法
1万
查看次数

Java - C-Like Fork?

是否可以使用新的独立jvm进程在java中执行"C like"fork?

怎么样?

c java fork

52
推荐指数
2
解决办法
3万
查看次数

Zombie进程vs Orphan进程

当父进程在子进程死后读取其退出状态时不使用等待系统调用时,会创建一个Zombie,并且当原始父进程在子进程终止时,孤立是由init回收的子进程.

在内存管理和进程表方面,这些进程的处理方式有何不同,特别是在UNIX中?

当僵尸或孤儿的创建可能对更大的应用程序或系统有害时,有什么例子或极端情况?

c unix fork zombie-process

52
推荐指数
5
解决办法
5万
查看次数

为什么C-forkbombs不像bash那样工作?

如果我运行经典的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)

c c++ linux bash fork

51
推荐指数
1
解决办法
6767
查看次数

在传统的Linux fork-exec中使用_exit()和exit()有什么区别?

我一直试图弄清楚如何在Linux内部使用fork-exec机制.根据计划,一切都在继续,直到一些网页开始让我困惑.

据说,一个子进程应该严格使用_exit()而不是简单exit()或正常的返回main().

据我所知,Linux shell fork-execs每个外部命令; 假设我上面说的是真的,结论是这些外部命令和Linux shell中发生的任何其他执行都不能正常返回!

维基百科和其他一些网页声称,我们必须使用_exit()它来防止子进程导致删除父进程的临时文件,同时可能会发生stdio缓冲区的双重刷新.虽然我理解前者,但我没有任何线索如何双重刷新缓冲区可能对Linux系统有害.

我花了一整天的时间......感谢任何澄清.

c linux fork return exit

50
推荐指数
3
解决办法
3万
查看次数

fork()如何知道何时返回0?

请看以下示例:

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()的工作原理是正确的吗?

c unix fork process internals

49
推荐指数
4
解决办法
4907
查看次数

分叉/多线程过程| 巴什

我想让我的代码的一部分更有效率.我正在考虑将它分成多个进程并让它们一次执行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)

或者我是否以错误的方式思考这个问题?

谢谢!

bash shell fork

47
推荐指数
5
解决办法
11万
查看次数

Bitbucket:更新一个fork来合并主仓库的变化?

我正在使用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的信息

git fork dvcs bitbucket

46
推荐指数
3
解决办法
2万
查看次数

标签 统计

fork ×10

c ×6

linux ×3

unix ×3

bash ×2

c++ ×2

git ×2

bitbucket ×1

dvcs ×1

exit ×1

github ×1

internals ×1

java ×1

process ×1

return ×1

shell ×1

version-control ×1

zombie-process ×1