当前位置: 首页 > 面试题库 >

2个或更多fork系统调用如何工作?

訾安邦
2023-03-14
问题内容

这是我使用2 fork()系统一个接一个地调用的代码-它实际上如何工作?

 #include <unistd.h>
 #include <iostream.h>
 using namespace std;

 int main()
 {
    cout << "0. I am process " << getpid() << endl;
    (void) fork();
    cout << "1. I am process " << getpid() << endl;
    (void) fork();
    cout << "2. I am process " << getpid() << endl;
}

我得到的输出为:
0。我是进程27701
1. 我是进程25915 1.我是
进程27701
2.我是进程27781
2.我是进程26170
2.我是进程27701

这是我使用3个fork系统调用的下一个程序,如何获得这样的输出? 如果我要手动解决此代码,那么逻辑是什么?

#include <unistd.h>
#include <iostream>
using namespace std;

int main()
{
    cout << "0. I am process " << getpid() << endl;
    (void) fork();
    cout << "1. I am process " << getpid() << endl;
    (void) fork();
    cout << "2. I am process " << getpid() << endl;
    (void) fork();
    cout << "3. I am process " << getpid() << endl;
}

在这里,我得到的输出为:
0。我是进程27116
1.我是进程26147
2.我是进程27371
2.我是进程26147
3.我是进程24416
3.我是进程27371
3.我是进程27508
3 。我是进程26147
1.我是进程27116
2.我是进程21406
2.我是进程27116
3.我是进程27369
3.我是进程21406
3.我是进程26752
3.我是进程27116


问题答案:

您的程序完全错误。您 永远fork不应 忽略的结果

阅读Advanced
Linux编程
书和fork(2)手册页(请仔细阅读该页面几次)。

典型代码应为:

  pid_t pid1 = fork();
  if (pid1<0) { perror("fork1 failed"); exit(EXIT_FAILURE); }
  else if (pid1 == 0) {
     // you are in the child process
  }
  else // pid1>0 
  {  // you are in the parent process
  }

并且同样for pid_t pid2=fork();和then for pid_t pid3=fork();等等。因此,每个对的调用fork都应处理3种结果的情况fork(失败,即<0子进程==0,父进程>0

原则上您有3 3即27种可能性。但是您可以尽早处理失败案例,剩下2 3即8。

不要忘记处理的失败fork。你可能会降低你的进程限制(使用了setrlimit(2)使用RLIMIT_NPROC或等值的ulimit
bash的内置),以缓解测试fork失败。



 类似资料:
  • 问题内容: 我正在尝试使用此C代码连续运行两个可执行文件: 尽管有分叉,但在第一个execv()调用之后,程序将退出,它永远不会到达第二个execv()。我试过在第一次fork之后调用wait(),但是我不确定那是缺少的内容。 有什么想法为什么在孩子退出后控制权不返回给父母? 问题答案: 你有几个问题。首先,如果只想运行两个程序,则只需调用一次。然后在父进程中运行一个程序,在子进程中运行一个程序。

  • 问题内容: 我的javaswing应用程序中大约有3帧。如何处理这些框架的正确方法是什么?我的意思是某种模式或其他。现在,我总是有一个代表框架的类,一个代表面板的框架,这是该框架中的主要类。现在我已将帧定义为静态变量,当我想隐藏它们时,我称 这是正确的解决方案吗? 问题答案: 除了一个或多个实例的(出色)建议之外,还有一些其他策略可能会单独或组合使用,以将各种内容窗格折叠到一个框架中。 / (Tu

  • 问题内容: 我有一个运行Spring MVC的应用程序。 我需要它来访问我的应用程序中的2个不同的数据库(一个是PostgreSQL,另一个是MySQL数据库)。 如何仅使用批注或application.properties文件进行配置? 问题答案: 这是示例代码,希望对你有所帮助! application.properties DatabaseItemsConfig.java DatabaseU

  • 我想在使用application.properties的项目中使用2个或更多的jdbcTemplate。我尝试了,但遇到了运行时异常。 canNotGetJDBCConnectionException:未能获得JDBC连接;嵌套异常是java.sql.sqlException:无法为在org.springframework.JDBC.datasource.datasourceUtils.getCo

  • 我有一个运行Spring MVC的应用程序。 我需要它访问我的应用程序中的2个不同的数据库(一个是PostgreSQL和另一个是MySQL数据库)。 问候。

  • 问题内容: 是否有一种简短的方法可以在Python中连续两次或更多次调用函数?例如: 也许像: 问题答案: 我会: 的是其值为你不关心的变量约定。 您可能还会看到有人写: 但是,这样做会稍微贵一些,因为它会创建一个包含每次调用(即使是)的返回值的列表,然后将结果列表丢弃。我不建议使用,除非你 正在 使用的返回值的列表。