C语言 Windows中与Linux中的“pidof”等价的是什么?

8fsztsew  于 2023-10-16  发布在  Windows
关注(0)|答案(5)|浏览(116)

在一个批处理脚本中,我需要获取一个具有给定二进制路径C:\path\to\binary.exe的进程ID列表。在Linux中,我只能执行pidof /path/to/binary
是否有一个Win32可执行文件可以执行相同的操作,从WinXP Home到Win7都支持(任务列表不起作用)?
包括这个的软件包必须是便携式的,所以10MB的下载不是我想要的。
有没有一个C函数可以做到这一点 * 和 * 是支持从WinXP到Win7?注意:我想匹配一个进程路径,而不是一个可以被其他应用程序使用的文件名。

5jdjgkvh

5jdjgkvh1#

wmic.exe可在XP、Vista和7上使用,并且可以执行此操作。但是,它不附带Windows XP家庭版。

wmic process where ExecutablePath='C:\\windows\\system32\\notepad.exe' get ProcessId

如果您也希望支持Windows XP Home,则可以使用EnumProcessGetModuleFileNameEx。这里的缺点是,如果您不是以管理员身份运行,则无法查询其他用户运行的进程的名称。QueryFullProcessImageName可能会做的伎俩在这里,但它的Vista+。
如果这还不够,你还需要Process32First(swatkat的代码)。对于每个进程,您需要调用Module32First,然后获取MODULEENTRY32->szExePath。请注意,即使这样也不是完全可移植的,并且在需要QueryFullProcessImageName的x64上也不能很好地工作。

wnvonmuf

wnvonmuf2#

您可以使用ToolhelpAPI来枚举进程,获取它们的完整路径并将其与所需的进程名称进行比较。您需要遍历每个进程的模块列表。列表中的第一个模块是进程可执行文件本身。下面是一个示例代码:

int main( int argc, char* argv[] )
{

    if( argc > 1 )
    {
        printf( "\nGetting PID of: %s\n", argv[1] );
        HANDLE hProcSnapshot = ::CreateToolhelp32Snapshot( TH32CS_SNAPPROCESS, 0 );
        if( INVALID_HANDLE_VALUE != hProcSnapshot )
        {
            PROCESSENTRY32 procEntry = {0};
            procEntry.dwSize = sizeof(PROCESSENTRY32);
            if( ::Process32First( hProcSnapshot, &procEntry ) )
            {
                do
                {
                    HANDLE hModSnapshot = ::CreateToolhelp32Snapshot( TH32CS_SNAPMODULE, procEntry.th32ProcessID );
                    if( INVALID_HANDLE_VALUE != hModSnapshot )
                    {
                        MODULEENTRY32 modEntry = {0};
                        modEntry.dwSize = sizeof( MODULEENTRY32 );
                        if( Module32First( hModSnapshot, &modEntry ) )
                        {
                            if( 0 == stricmp( argv[1], modEntry.szExePath ) )
                            {
                                printf( "\nPID: %ld\n", procEntry.th32ProcessID );
                                ::CloseHandle( hModSnapshot );
                                break;
                            }
                        }
                        ::CloseHandle( hModSnapshot );
                    }
                }
                while( ::Process32Next( hProcSnapshot, &procEntry ) );
            }
            ::CloseHandle( hProcSnapshot );
        }
    }
    return 0;
}
mrphzbgm

mrphzbgm3#

你可以写一个小的C#应用程序,它首先调用Process.GetProcessesByName(String),然后检查结果,并在MainModule时打印每个的Id属性。FileName等于您要查找的路径。

rn0zuynd

rn0zuynd4#

PowerShell可以解决你的问题,如果是内置在Win 7中,并可在其他操作系统上下载。

param($fileName)
Get-Process | where -FilterScript {$_.MainModule.FileName -eq $fileName}

此脚本将接收一个参数,即您正在查找的文件名,并将输出其可执行文件的文件名。
你可以从一个bat文件中调用它,方法是:
powershell -Command“& {Get-Process|其中-FilterScript {$_.MainModule.FileName -eq %FILENAME%}”

pjngdqdw

pjngdqdw5#

我使用pidof和进程名作为参数。我以前不需要可执行路径。我用它就像:

pidof php

它只是返回正在运行的进程的PID。与PowerShell类似,我可以如下使用它:

(get-process php).id

它像pidof一样返回PID。

相关问题