首页 > 解决方案 > execvp 做 ps 每次都会给出相同的结果

问题描述

我正在尝试制作一个程序,其中父进程创建 3 个子进程创建另一个进程来监视进程。监控子进程执行

char *argv[6] = {"ps", "-p", "p1,p2,p3", "r", "-o", "pid,%cpu,%mem,stat"};
execvp(argv[0], argv);

并使用管道衬里将它们发送给父级并将标准输出重定向到标准输入。

但是我遇到了问题,因为即使进程死了,进程 STAT 在连续迭代中也不会改变,它仍然显示 p1,p2,p3 正在运行这是我的代码:

#include <iostream>
#include <sys/ipc.h>
#include <unistd.h>
#include <signal.h>
#include <fstream>
#include <math.h>
#include <string.h>
#define BUFFSIZE 40000

using namespace std;


int main()
{
    pid_t c[3];
    c[0] = fork();
    if(c[0] == 0)
        // 1st process code

    else
    {
        c[1] = fork();
        if(c[1] == 0)
            // 2nd process code

        else
        {
            c[2] = fork();
            if(c[2] == 0)
                // 3rd process code

            else
            {
                for (; ;)
                {
                    int fd[2];
                    if(pipe(fd) == -1)
                    {
                        cout<<"on creation pipe error";
                    }
                    if(fork())
                    {
                        close(fd[1]);
                        dup2(fd[0], 0);

                        char s[30000];
                        read(fd[0], s, BUFFSIZE);
                        cout<<s;
                        int j = 0;

                        for (int i = 0; i < strlen(s); ++i)
                        {
                            if(s[i] == '\n')
                                j++;
                        }

                        if(j <= 1)
                        {
                            cout<<"All children have terminated\n";
                            return 0;
                        }
                    }
                    else
                    {
                        close(fd[0]);
                        dup2(fd[1], 1);

                        string listpid = to_string(c[0]) + "," + to_string(c[1]) + "," + to_string(c[2]);
                        char *argv[6] = {"ps", "-p", (char*)listpid.c_str(), "r", "-o", "pid,%cpu,%mem,stat"};
                        close(fd[1]);
                        execvp(argv[0], argv);
                        break;
                    }
                    close(fd[0]);
                    sleep(2);
                }
            }
        }
    }
    return 0;
}

即使在进程终止后,输出仍然保持不变。 (输出截图)

如果有人对此有任何建议或任何解决方案,那就太好了。先感谢您。

标签: c++multiprocessingpipeexecipc

解决方案


推荐阅读