修改通过PID获取进程名称方法:系统调用ps -A | grep "pid "实现

This commit is contained in:
gb 2024-02-29 17:45:53 +08:00
parent 7e8895ce26
commit 53b08a8f3e
1 changed files with 74 additions and 16 deletions

View File

@ -303,28 +303,86 @@ void shared_memory::release_buf(void* buf)
} }
#if !defined(WIN32) && !defined(_WIN64) #if !defined(WIN32) && !defined(_WIN64)
std::string shared_memory::get_proc_name_by_pid(pid_t pid) std::string get_command_result(const char* cmd, int len, int* err)
{ {
char path[512] = { 0 }; std::string result("");
unsigned int* v = (unsigned int*)&pid; FILE* src = popen(cmd, "r");
std::string ret("");
if (sizeof(pid) > 4 && v[1]) if (err)
sprintf(path, "/proc/%lld/status", pid); *err = 0;
else
sprintf(path, "/proc/%u/status", pid);
FILE* src = fopen(path, "rb");
if (src) if (src)
{ {
char val[512] = { 0 }; char buf[128] = { 0 };
int rv = fread(buf, 1, sizeof(buf) - 1, src);
memset(path, 0, sizeof(path)); while (rv > 0)
fgets(path, sizeof(path) - 1, src); {
fclose(src); buf[rv] = 0;
sscanf(path, "%*s %s", val); result += buf;
ret = val; if (len != -1 && result.length() >= len)
{
result.erase(len);
break;
}
rv = fread(buf, 1, sizeof(buf) - 1, src);
}
if (rv == -1 && err)
{
*err = errno;
VLOG_MINI_3(LOG_LEVEL_DEBUG_INFO, "Failed to excute shell command '%s' in read pipe: %d - %s\n", cmd, errno, strerror(errno));
}
pclose(src);
} }
else if (err)
{
*err = errno;
VLOG_MINI_3(LOG_LEVEL_DEBUG_INFO, "Failed to excute shell command '%s' in open pipe: %d - %s\n", cmd, errno, strerror(errno));
}
return std::move(result);
}
std::string shared_memory::get_proc_name_by_pid(pid_t pid)
{
std::string ret("");
unsigned int* v = (unsigned int*)&pid;
{
char cmd[80] = { 0 };
int err = 0;
std::string result("");
size_t pos = 0;
sprintf(cmd, "ps -A | grep \"%lld \"", pid);
result = get_command_result(cmd, -1, &err);
if (result.length())
{
VLOG_MINI_2(LOG_LEVEL_DEBUG_INFO, "Command result of '%s' is: %s\n", cmd, result.c_str());
pos = result.rfind(' ');
if (pos++ != std::string::npos)
{
ret = result.substr(pos);
}
}
}
//char path[512] = { 0 };
//if (sizeof(pid) > 4 && v[1])
// sprintf(path, "/proc/%lld/status", pid);
//else
// sprintf(path, "/proc/%u/status", pid);
//FILE* src = fopen(path, "rb");
//if (src)
//{
// char val[512] = { 0 };
// memset(path, 0, sizeof(path));
// fgets(path, sizeof(path) - 1, src);
// fclose(src);
// sscanf(path, "%*s %s", val);
// ret = val;
//}
if (sizeof(pid) > 4 && v[1]) if (sizeof(pid) > 4 && v[1])
{ {
VLOG_MINI_2(LOG_LEVEL_DEBUG_INFO, "PID(%lld) name is: %s\n", pid, ret.c_str()); VLOG_MINI_2(LOG_LEVEL_DEBUG_INFO, "PID(%lld) name is: %s\n", pid, ret.c_str());