【问题标题】:Using fork to create a child print a-z & parent process A-Z in c++使用 fork 在 C++ 中创建子打印 a-z 和父进程 A-Z
【发布时间】:2016-01-11 16:19:47
【问题描述】:

我正在尝试使用 fork() 创建一个子进程,该子进程将以小写字母打印从 a 到 z 的字母,而父进程将打印大写字母的字母表。

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

int main()
{
cout << "Program Begins" << endl;

char letter;
pid_t pid = fork();

if (pid == 0)
{
    // child process
    for (letter = 'a'; letter <= 'z'; letter++)
    {
        cout<< "child process: " << letter << endl;
    }
}

else if (pid > 0)
{
    // parent process
    for (letter = 'A'; letter <= 'Z'; letter++)
    {
        cout << "parent process: " << letter << endl;
    }
}
else
{
    // fork failed
    cout << "fork failed" << endl;
    return 1;
}

cout << "End of Program\n" << endl;

return 0;
}

此代码打印出字母,问题是它先是子元素,然后是父元素。我认为它会同时创建两个彼此并行运行的进程,因此它将打印出一些混合结果,其中一些用于进程,而另一些用于父进程,依此类推。我的问题是我认为程序一旦查看进程类型并进入该进程的循环并且在打印出所有内容之前不会退出

【问题讨论】:

  • 您无法保证操作系统将如何安排您的线程或进程。尝试在每次循环迭代中休眠一小段时间。
  • 你有什么问题?
  • 有可能一个在它被操作系统抢占之前完成了这个短循环,以便启动另一个。如果您使用更长的循环或在循环迭代之间添加延迟,您最终会看到两者并行运行。
  • std::thread 让您可以更好地控制并行处理

标签: c++ process parallel-processing operating-system fork


【解决方案1】:

多线程/多进程程序本质上是不确定的。操作系统决定每个任务何时活动太久以及何时安排新任务,因此,特别是因为您的程序非常短,孩子很有可能在父母获得之前完成执行有机会再次被激活,反之亦然。

如果您希望程序交错两个进程,您可以在循环中添加一个 sleep 语句来减慢它并强制 CPU 更频繁地翻转。

如果您确实希望程序在两者之间精确而均匀地交替,那么您需要使用互斥锁或移除多线程。

【讨论】:

    【解决方案2】:

    使用fork() 创建子进程和父进程,子进程应该打印no。从 10 到 1,父进程应该打印一个没有的阶乘。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2014-11-05
      • 1970-01-01
      • 2011-08-26
      • 1970-01-01
      • 2020-11-09
      • 1970-01-01
      • 2021-08-27
      • 2011-03-12
      相关资源
      最近更新 更多