pstree in c++ program

Asked

Viewed 47 times

1

The process tree should be displayed at the start of the execution, at the time where all processes are created and at the end of the program. (pstree -s )

This requirement above in bold is part of the development of this code below, the code is working, but I do not know how to display the tree of this process. I put the remote system(pstree -s pidPai) but does not show the tree of this process, but rather the tree of all system processes, test with printf, sprinf, fprintf but none works, does anyone know how to use this required command to display the tree of each program process?

#include <iostream>
#include <unistd.h>
#include <stdio.h>
#include <sys/types.h>
#include <signal.h>
#include <stdlib.h>

using namespace std;
void
proc_neto1(int dtnasc) {
int num_segundos = 0;
while (true) {
    sleep(1);
    num_segundos ++;
    cout << "Sou o processo neto 1 (PID " << getpid() << "), estou rodando   há " << num_segundos << " segundos." << endl;
}
}

void
proc_neto2(int dtnasc) {
int num_segundos = 0;
while (true) {
    sleep(1);
    num_segundos ++;
    cout << "Sou o processo neto 2 (PID " << getpid() << "), estou rodando há " << num_segundos << " segundos." << endl;
    if (dtnasc + num_segundos == 60) {
        cout << "Neto 2 ficou louco! Matou seu pai (PID " << getppid() << ")" << endl;
        kill(getppid(), SIGKILL);
    }
    if (dtnasc + num_segundos == 63) {
        cout << "Não aguentando a pressão, neto 2 se suicida." << endl;
        kill(getpid(), SIGKILL);
    }
}
}

void
proc_filho1(int dtnasc) {
int num_segundos = 0;
int pid_filho = 0;

while (true) {
    sleep(1);
    num_segundos ++;
    cout << "Sou o processo filho 1 (PID " << getpid() << "), estou rodando há " << num_segundos << " segundos." << endl;
    if (num_segundos == 15 && ! (pid_filho = fork())) proc_neto1(dtnasc + num_segundos);
    if (dtnasc + num_segundos == 50) {
        cout << "Filho 1 ficou louco! Matou seu pai (PID = " << getppid() << ")" << endl;
        kill(getppid(), SIGKILL);
    }
    if (dtnasc + num_segundos == 55) {
        cout << "Filho 1 continua louco! Matou seu filho (PID " << pid_filho << ")" << endl;
        kill(pid_filho, SIGKILL);
    }
    if (dtnasc + num_segundos == 57) {
        cout << "Não aguentando a pressão, filho 1 se suicida." << endl;
        kill(getpid(), SIGKILL);
    }
}
}

void
proc_filho2(int dtnasc) {
int num_segundos = 0;

while (true) {
    sleep(1);
    num_segundos ++;
    cout << "Sou o processo filho 2 (PID " << getpid() << "), estou rodando há " << num_segundos << " segundos." << endl;
    if (num_segundos == 15 && ! fork()) proc_neto2(dtnasc + num_segundos);
}
}

int
main(int argc, char ** argv) {
int num_segundos = 0;
int pidPai = getpid();
system("pstree -s pidPai");

while (true) {
    sleep(1);
    num_segundos ++;
    //int pidPai = getpid();
    cout << "Sou o processo pai (PID " << pidPai << "), estou rodando há " << num_segundos << " segundos." << endl;

    // aos 10 segundos, gera o filho 1.
    if (num_segundos == 10 && ! fork()) proc_filho1(num_segundos);
    // aos 20 segundos, gera o filho 2.
    if (num_segundos == 20 && ! fork()) proc_filho2(num_segundos);
}

return 0;
}

1 answer

0


What happens is that you are literally running the command pstree -s pidPai whereas the right one would be to replace the word "pidPai" by the number PID of the current process. Follows the correction:

int pidPai = getpid();
system(string("pstree -s " + to_string(pidPai)).c_str());

Don’t forget to include the header string at the beginning of the code.

Browser other questions tagged

You are not signed in. Login or sign up in order to post.