libprocps:readproc()栈溢出问题求助
Hey there, let's dig into that stack overflow issue you're hitting when using readproc() from libprocps-dev. Based on your code snippet and common pitfalls with this library, here are the most likely fixes:
1. The #1 Culprit: Stack-Allocated proc_t Struct
The proc_t structure is very large—it packs tons of fields for process metadata like memory stats, status, and more. When you declare it directly on the stack with proc_t proc_info;, you're eating up a huge chunk of your program's limited stack space, which almost always leads to an overflow in practice.
Fix: Use Heap Allocation
Instead of putting proc_t on the stack, dynamically allocate it on the heap (where there's far more available memory):
#include <stdio.h> #include <stdlib.h> #include <proc/readproc.h> #include <string.h> #include <iostream> using namespace std; int main (){ PROCTAB* proc = openproc(PROC_FILLMEM | PROC_FILLSTAT | PROC_FILLSTATUS); if (!proc) { perror("Failed to open /proc handle"); return EXIT_FAILURE; } // Allocate proc_t on the heap to avoid stack overflow proc_t* proc_info = static_cast<proc_t*>(malloc(sizeof(proc_t))); if (!proc_info) { perror("Failed to allocate memory for proc_t"); closeproc(proc); return EXIT_FAILURE; } memset(proc_info, 0, sizeof(proc_t)); // Complete readproc loop (your code was cut off here) while (readproc(proc, proc_info) != NULL) { // Example: Print the process ID cout << "Process ID: " << proc_info->tid << endl; // Reset the struct before next iteration to avoid stale data memset(proc_info, 0, sizeof(proc_t)); } // Clean up resources to prevent leaks free(proc_info); closeproc(proc); return EXIT_SUCCESS; }
2. Compilation Note
Don't forget to link against the procps library when compiling your code, otherwise you'll hit linker errors:
g++ your_program.cpp -o your_program -lprocps
3. Bonus: Avoid Common Pitfalls
- Always check if
openproc()andmalloc()return valid pointers—skipping error handling leads to silent, hard-to-debug crashes. - Reset the
proc_tstruct withmemset()on each loop iteration to prevent leftover data from previous processes causing unexpected behavior. - Always call
closeproc()to clean up the/prochandle when you're done—this prevents resource leaks.
If you're still hitting issues after making these changes, feel free to share more details like your Linux distro, compiler version, or full error message, and we can dig deeper!
内容的提问来源于stack exchange,提问作者user9536663

