Я работаю над программой, которая выводит много текста как из родительского, так и из дочернего процесса. Однако, когда я запускаю программу, она, кажется, заканчивается и перезапускается на полпути, поскольку приглашение оболочки появляется в середине вывода, и программа зависает после завершения вывода (поэтому я нажимаю ctrl + c, чтобы завершить ее). Я не уверен, что это проблема с моим кодом, оболочкой (bash) или программой, которую я использую (putty). Вот очень упрощенный вариант моего кода:Проблема с оболочкой C++ с программой fork
#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
Это происходит только с программами, которые я использую вилку() в так оно должно иметь что-то делать с этим. Кто-нибудь знает, что случилось?
Спасибо, но где я могу разместить ожидание так, чтобы родительский закончен первым? Или это невозможно? Все, что я делаю, заставляет ребенка выводить весь текст в первую очередь. – user1804208
@ user1804208 В родительском процессе, конечно. :) После того, как цикл в родительском процессе может быть хорошим местом. –
Вот что я сделал, я разместил wait (NULL) в этом месте, и дочерний процесс всегда выводит первым. – user1804208