我设法为每个单独的进程输出正确的进程ID顺序,但我的问题是我无法显示子进程的PID。
我的程序能够打印父PID和孙子的PID。我确实看到了孩子的PID,但它显示为父母的PID。
如何计算子PID并将其添加到我的代码中?我希望我的输出显示父节点的PID,子节点的PID和孙子的PID。
#include <sys/types.h>
#include <sys/wait.h>
#include <unistd.h>
#include <iostream>
#include <stdio.h>
#include <stdlib.h>
using namespace std;
int main()
{
pid_t pid; //process id
const char *message;
int n;
int exit_code;
cout << "\nfork program starting\n";
pid = fork();
switch ( pid ) {
case -1:
cout << "Fork failure!\n";
return 1;
case 0:
pid = fork();
cout << "Parent PID = " << getppid() << endl;
switch ( pid ) {
case -1:
cout << "Fork Failure!\n";
return 1;
case 0:
cout << "Grandchild finished: PID = " << getpid() << endl;
message = "This is the child\n";
n = 5;
exit_code = 9;
break;
}
}
//waiting for child to finish
if ( pid != 0 ) { //parent
int stat_val;
pid_t child_pid;
child_pid = wait( &stat_val ); //wait for child
if (WIFEXITED (stat_val))
cout << "child exited with code " << WEXITSTATUS (stat_val) << endl;
else
cout << "child terminated abnormally!" << endl;
}
exit ( exit_code );
}
答案 0 :(得分:0)
在第二个fork()
之前,你似乎并没有打扰子PID变化:
case 0:
pid = fork();
cout << "Parent PID = " << getppid() << endl;
switch ( pid ) {
case -1:
cout << "Fork Failure!\n";
return 1;
[...]
}
到:
case 0:
cout << "Child PID = " << getpid() << endl;
pid = fork();
cout << "Parent PID = " << getppid() << endl;
switch ( pid ) {
case -1:
cout << "Fork Failure!\n";
return 1;
[...]
}
答案 1 :(得分:0)
这里,在第一行之后,打印getpid(),而不是稍后打印。然后使用pid2或不同的标识符,而不是使用相同的pid。这将解决你所有的问题。
case 0:
pid = fork();
cout << "Parent PID = " << getppid() << endl;
switch ( pid ) {
case -1:
cout << "Fork Failure!\n";
return 1;
case 0:
cout << "Grandchild finished: PID = " << getpid() << endl;//
为什么会出现问题?因为只有'第二种情况0'之后,那就是孩子的孩子你正在打印getpid(),这显然是打印了孩子的PID。相反,你应该尝试'默认:'这将适用于一级儿童&amp;二级父母(因为不是pid而不是大孩子!= 0)。值得注意的是,你不允许父母的情况。你给了一个失败的案例(-1),另一个案例给了孩子(0),没有给父母。