linux进程、线程(or子进程)、资源占用查看

#  linux进程、线程(or子进程)、资源占用查看

查看进程:
ps -ef | more  (-e:所有进程,-f:全格式)
++++++++++++++++++++++++++++++++++++
+ UID :用户ID                      +
+ PID :进程ID                      +
+ PPID :父进程ID                   +
+ C :CPU占用率                     +
+ STIME :开始时间                  +
+ TTY :开始此进程的TTY(终端设备)   +
+ TIME :此进程运行的总时间         +
+ CMD :启动进程的指令              +
++++++++++++++++++++++++++++++++++++
ps -ef | grep -i <程序名>


查看线程:
ps -T -p <pid>

查看资源占用:
top -p <pid>     //进程
top -H -p <pid>  //进程及进程下的线程(子进程)
+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
+ PID :进程id                                               +
+ USER :所有者                                              +
+ PR :优先级,越小优先级越高                                +
+ NI :NInice值                                              +
+ VIRT :占用的虚拟内存                                      +
+ RES :占用的物理内存                                       +
+ SHR :占用的共享内存                                       +
+ S:进程状态,S休眠,R正在运行,Z僵死,N优先值为负      +
+ %CPU :cpu占用率                                           +
+ %MEN :物理内存占用率                                      +
+ TIME+ :占用cpu时间的累加值                             +
+ COMMAND :进程启动的命令                                   +
+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++


### VC2019 中跨进程使用 `std::cout` 的方法及注意事项 在 Visual Studio 2019 (VC2019) 开发环境中,解决跨进程使用 `std::cout` 的问题主要涉及以下几个方面:分配新的控制台、重定向标准输出流以及处理多进程间的资源共享。以下是具体的实现方案和需要注意的关键点。 #### 方法一:为子进程分配新控制台 如果希望子进程拥有自己的控制台窗口并能够正常使用 `std::cout`,可以利用 Windows API 函数 `AllocConsole` 和相关工具来设置标准输出流。 ##### 实现步骤 1. **调用 `AllocConsole`** 子进程启动后立即调用 `AllocConsole()` 分配一个新的控制台实例。 2. **重定向标准输出流** 将标准输出流(如 `stdout` 和 `std::cout`)绑定到新控制台的缓冲区。 代码示例如下: ```cpp #include <windows.h> #include <io.h> #include <fcntl.h> #include <iostream> void RedirectStdOutToNewConsole() { AllocConsole(); // 创建新控制台 HANDLE hOut = GetStdHandle(STD_OUTPUT_HANDLE); int hCrt = _open_osfhandle((intptr_t)hOut, _O_TEXT); if (hCrt != -1) { FILE* hf = _fdopen(hCrt, "w"); *stdout = *hf; setvbuf(stdout, NULL, _IONBF, 0); // 设置无缓冲输出 } std::ios::sync_with_stdio(true); // 同步 C++ 流与 C 标准库流 } int main() { RedirectStdOutToNewConsole(); std::cout << "This message is displayed on the new console window." << std::endl; return 0; } ``` 此代码片段展示了如何在一个单独的进程中创建新控制台,并将 `std::cout` 输出导向至该控制台[^1]。 --- #### 方法二:附着到父进程的控制台 如果子进程需要共享父进程的控制台而不是创建新的控制台窗口,可以使用 `AttachConsole` 函数。 ##### 实现步骤 1. **调用 `AttachConsole`** 使用 `AttachConsole(ATTACH_PARENT_PROCESS)` 让子进程附加到父进程的控制台。 2. **验证控制台连接状态** 需要确认是否成功附加到父进程的控制台;如果不成功,则需手动分配一个新控制台。 代码示例如下: ```cpp #include <windows.h> #include <iostream> bool AttachToParentConsole() { if (!AttachConsole(ATTACH_PARENT_PROCESS)) { if (GetLastError() == ERROR_ACCESS_DENIED || GetLastError() == ERROR_INVALID_PARAMETER) { return false; // 父进程未运行于控制台环境 } } return true; } int main() { if (!AttachToParentConsole()) { AllocConsole(); // 若无法附加则创建新控制台 } freopen("CONOUT$", "w", stdout); // 绑定标准输出到控制台 std::ios::sync_with_stdio(true); std::cout << "Attached to parent console or created a new one." << std::endl; return 0; } ``` 这段代码尝试将子进程附加到父进程的控制台,若失败则回退到创建新控制台的方式[^3]。 --- #### 注意事项 1. **资源管理** - 每次调用 `AllocConsole` 或 `AttachConsole` 后,在不需要时务必调用 `FreeConsole` 释放控制台资源,防止内存泄漏或不必要的占用。 2. **同步问题** - 在多线程或多进程场景中,确保不同线程进程不会同时写入相同的控制台区域,以免造成混乱。可以通过互斥锁(mutex)等方式协调访问[^2]。 3. **平台兼容性** - 上述方法仅适用于基于 Windows 的系统。对于其他操作系统(如 Linux),可能需要采用不同的 IPC 技术(如管道、套接字等)来实现类似的功能[^4]。 4. **性能影响** - 控制台操作可能会带来一定的性能开销,尤其是在频繁打印大量日志信息时。建议优化日志记录逻辑以减少对主线程的影响。 --- ###
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值