У меня есть программа, которая должна запустить другой процесс и работать с ним одновременно. я использую fork()
а также system()
чтобы сделать это. У меня есть код, подтверждающий, что мой system()
вызов возвращает, но каждый раз, когда я выполняю, я должен вручную завершить выполнение, набрав ctrl c
, Я могу сказать, что один из моих процессов завершается, но я не совсем уверен, какой именно. Я считаю, что это родитель. Оба должны быть пойманы в ответных заявлениях, хотя.
Вот код родительского процесса (forkWaitTest):
#include <unistd.h>
#include <stdio.h>
#include <stdlib.h>
#include <iostream>
using namespace std;
int main(void)
{
pid_t childPID;
int status;
childPID = fork();
if(childPID >=0)
{
if(childPID == 0)
{
cout <<"I'm the fork child";
cout.flush();
status=system("child");
cout << "status = " << status;
//exit(0);
//cout << "Am I getting here?";
}
else{
cout << "I am the parent and can keep doing things ";
int y=1;
int x=7;
cout<< y+x << " ";
}
}
return 0;
}
Это дочерний процесс, который называется
#include <stdio.h>
int main(int argc, char *argv[] )
{
printf("I am the child\n");
return 0;
}
Вот мой вывод:
-bash-4.2$ forkWaitTest
I am the parent and can keep doing things 8 I'm the fork child-bash-4.2$ I am the child
status = 0
Ваш родитель DID прекращается. Давайте посмотрим на ваш вывод:
-bash-4.2$ forkWaitTest
I am the parent and can keep doing things 8 I'm the fork child-bash-4.2$ I am the child
status = 0
Теперь давайте посмотрим на это более внимательно, особенно на этот бит:
I'm the fork child-bash-4.2$
Видите, прямо посередине написано bash-4.2$
, Это командная строка после завершения родительского. Затем ребенок запускается и тоже выходит, но вы растерялись, поскольку он печатает после приглашения bash. Ваш ^C
просто печатает следующую строку.
Чтобы проверить, нажмите возврат несколько раз, а не ^C
,
Убедитесь, что ваши сообщения заканчиваются символами новой строки (добавьте << endl
к выходам, например).
я вижу твой bash
подсказка ( -bash-4.2$
) перепутаны с другими выходными данными, отчасти потому, что у вас нет новых строк в выходных данных, а отчасти потому, что ваш код не показывает никаких попыток дождаться смерти детей. Это означает, что ваш процесс умер.
Вы можете напечатать: ls -l
и оболочка выполнит эту команду, потому что она ждет, когда вы что-то наберете. Когда вы прерываете его (оболочку), он запрашивает снова, но он бы принял ваш ввод даже без прерывания.
С немного измененной версией child
:
#include <stdio.h>
#include <unistd.h>
int main(void)
{
printf("I am the walrus (%d)\n", (int)getpid());
return 0;
}
и слегка модифицированная версия родителя:
#include <cstdlib>
#include <iostream>
#include <sys/wait.h>
#include <unistd.h>
using namespace std;
int main(void)
{
pid_t childPID;
int status;
childPID = fork();
if (childPID >= 0)
{
if (childPID == 0)
{
cout << "I'm the forked child (" << getpid() << ")\n";
cout.flush();
status = system("child");
cout << "status = " << status << endl;
cout << "Am I getting here?\n";
return 0;
}
else
{
cout << "I am the parent and can keep doing things ";
int y = 1;
int x = 7;
cout << y + x << endl;
}
}
int corpse;
while ((corpse = wait(&status)) != -1)
cout << "PID " << corpse << " exited with status " << status << endl;
return 0;
}
и с подсказкой Osiris JL:
Пример вывода, который я получаю:
Osiris JL: ./parent
I am the parent and can keep doing things 8
I'm the forked child (3192)
I am the walrus (3193)
status = 0
Am I getting here?
PID 3192 exited with status 0
Osiris JL:
Обратите внимание, что программа ‘child’ запускается потомком собственного потомка родительского процесса (вот почему getpid()
значения печатаются). И wait()
в цикле родительского процесса гарантирует, что ребенок умер до смерти родителя. Учитывая структуру дочернего процесса, который использует system()
функция, процесс внука (запуск частично ошибочно child
процесс) вышел до того, как ребенок вышел до того, как вышел родитель. Опустить wait()
цикл и родитель может легко выйти до того, как ребенок и внук сделают:
Osiris JL: ./parent
I am the parent and can keep doing things 8
I'm the forked child (3207)
Osiris JL: I am the walrus (3208)
status = 0
Am I getting here?
ls -ld parent* child*
-rwxr-xr-x 1 jleffler staff 8784 Sep 20 15:57 child
-rw-r--r-- 1 jleffler staff 122 Sep 20 15:57 child.cpp
drwxr-xr-x 3 jleffler staff 102 Sep 20 15:57 child.dSYM
-rwxr-xr-x 1 jleffler staff 9808 Sep 20 16:02 parent
-rw-r--r-- 1 jleffler staff 858 Sep 20 16:02 parent.cpp
drwxr-xr-x 3 jleffler staff 102 Sep 20 16:02 parent.dSYM
Osiris JL: