fork 程序的 C++ shell 问题

标签 c++ bash shell fork

我正在开发一个从父进程和子进程输出大量文本的程序。但是,当我运行该程序时,它似乎正在结束并在中途重新启动,因为 shell 提示符出现在输出的中间,并且程序在输出完成后挂起(所以我按 ctrl+c 终止它)。我不确定这是我的代码、shell (bash) 还是我正在使用的程序 (putty) 的问题。这是我的代码的一个非常简化的版本:

#include <iostream>
#include <sstream>
#include <unistd.h>
using namespace std;
int main()
{
ostringstream oss;
pid_t pid = fork();
if (pid > 0)
{
    for (int i = 1; i <= 15; i++)
    {
        oss << "Parent message " << i << "\n";
    }
}
if (pid == 0)
{
    for (int i = 1; i <= 15; i++)
    {
        oss << "Child message " << i << "\n";
    }
}
if (pid < 0)
{
    cerr << "Fork failed\n";
}
cout << oss.str();
return 0;
}

这是我得到的输出:

Parent message 1
Parent message 2
Parent message 3
Parent message 4
Parent message 5
Parent message 6
Parent message 7
Parent message 8
Parent message 9
Parent message 10
Parent message 11
Parent message 12
Parent message 13
Parent message 14
Parent message 15
Child message 1
Child message 2
Child message 3
Child message 4
Child message 5
Child message 6
Child message 7
Child message 8
Child message 9
********@***.edu:~/test$ Child message 10
Child message 11
Child message 12
Child message 13
Child message 14
Child message 15

这只发生在我使用 fork() 的程序中,所以它一定与它有关。有人知道怎么回事吗?

最佳答案

这是因为子进程一旦 fork ,并没有真正连接到父进程。所以当父进程执行到程序结束时,就会退出,让子进程继续在后台运行。

你可以通过waiting禁止它以便子进程退出。这也将阻止子进程成为孤立的。

关于fork 程序的 C++ shell 问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29331424/

相关文章:

c++ - C++ 中 float 的 Setprecision()?

c++ - 英特尔 PIN 例程地址检索 : Linux vs. Windows

c++ - 使用 QItemDelegate 在 QTableView 中显示其他数据

bash - 根据文件夹名称检索早于日期的文件夹

php - 如果 https 连接,cURL 清空请求数据

c++ - 可以在同一个应用程序中加载不同版本的 DLL 吗?

android - 将参数从 Linux 脚本传递到 Android

linux - 文本文件列的算术运算

sql - 一次将多条记录存储到数据库表中,然后检查是否有记录丢失

bash - Shell 重定向 i/o 顺序