2015-03-29 2 views
0

Я работаю над программой, которая выводит много текста как из родительского, так и из дочернего процесса. Однако, когда я запускаю программу, она, кажется, заканчивается и перезапускается на полпути, поскольку приглашение оболочки появляется в середине вывода, и программа зависает после завершения вывода (поэтому я нажимаю 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 

Это происходит только с программами, которые я использую вилку() в так оно должно иметь что-то делать с этим. Кто-нибудь знает, что случилось?

ответ

2

Это потому, что дочерний процесс, однажды раздвоенный, на самом деле не связан с родительским процессом. Поэтому, когда родительский процесс достигнет конца программы, он выйдет и продолжит выполнение дочернего процесса в фоновом режиме.

Вы можете запретить его waiting для выхода из процесса ребенка. Это также остановит детский процесс от сиротства.

+0

Спасибо, но где я могу разместить ожидание так, чтобы родительский закончен первым? Или это невозможно? Все, что я делаю, заставляет ребенка выводить весь текст в первую очередь. – user1804208

+0

@ user1804208 В родительском процессе, конечно. :) После того, как цикл в родительском процессе может быть хорошим местом. –

+0

Вот что я сделал, я разместил wait (NULL) в этом месте, и дочерний процесс всегда выводит первым. – user1804208

1

Что удивительно здесь? Ваши родительские процессы завершаются и появляется приглашение оболочки. Детский процесс немного отстает (потому что запуск процесса занимает ненулевое время), поэтому некоторые его результаты появляются немного позже.

Если вы не хотите этого поведения, то почему вы находитесь fork ing в первую очередь?

Смежные вопросы