c++ - 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;
}
即使在进程终止后,输出仍然保持不变。 (输出截图)
如果有人对此有任何建议或任何解决方案,那就太好了。先感谢您。
解决方案
推荐阅读
- javascript - 如何将html字符串读取为工作表?
- sqlite - 如何从sqlite中的计算列和表中的列计算天数
- javascript - 如何在不允许用户读取数据的情况下将数据存储在 Windows 共享文件夹 JSON 中?
- mongodb - (如何)聚合()可以破坏索引?
- macos - 奇怪的目录被添加到我的 PATH
- excel - VBA 在 Excel 中的 Word 文档中创建报告
- python - 输出视频与原始视频不同 Open CV
- ios - 仅在滚动时,iFrame 中的延迟加载页面在 iOS 设备上(垂直)被切断
- pandas - Pandas:仅将列中的某些字符串大写
- g1ant - 带有参数相对真或相对假的颜色命令输出?