強制結束進程的兩種實現方式

來源:互聯網
上載者:User

強制結束進程的兩種實現方式--C#和C++實現

最近在做一個大型的項目,由於進程之間的關聯出了一些問題,長話短說,就是我們不得不強制停止某些進程以保證系統正常的運行,在網上找了一下,沒發現有這方面詳細的介紹和寫的比較全面的文章,於是按照MSDN的說明寫了兩種方法,希望對遇到類似問題的朋友有所協助。

首先,我們來看看C#的實現方式, 由於C#對進程的封裝比較好,所以我們只需要較少的語句就可以完成這個工作,值得強調的是參數有效性檢測和名字比較,由於系統中可能運行很多意想不到的進程,所以在比較名字的時候一定要用等於而不是包含或者之比較開頭和結尾,否則很可能殺錯進程,相關代碼如下。

C# Code:

//Return true for successful and false for failed

public bool FindAndKillProcessByName(string name)

{

            //Parameter check

            if (0 == name.Length)

            {

                return
false;

            }

            //Find the named process and terminate it

            foreach (Process winProc
in Process.GetProcesses())

            {

                //use equals for the task in case we kill

                //a wrong process

                if (winProc.ProcessName.Equals(name))

                {

                    winProc.Kill();

                    return
true;

                }

            }

            return false;

}

使用C++完成相同的工作就需要相對多幾行代碼,首先是取得當前系統中所有進程的快照,完成這個工作的函數是CreateToolhelp32Snapshot(),在標頭檔#include<tlhelp32.h>中,調用這個函數並返回有效控制代碼之後我們需要在這個快照中尋找我們想要結束的進程,值得一提的是Process32First(), Process32Next()這兩個函數的邏輯請仔細看代碼,否則很可能漏掉某個進程而導致錯誤,另外就是OpenProcess()網上很多文章說開啟進程需要SEDebug許可權,其實是不需要的,只要我們傳入PROCESS_TERMINATE
作為參數就可以成功的開啟進程。

C++ Code:

BOOL FindAndKillProcessByName(LPCTSTR strProcessName)

{

        if(NULL == strProcessName)

        {

                return FALSE;

        }

        HANDLE handle32Snapshot = CreateToolhelp32Snapshot(TH32CS_SNAPPROCESS, 0);

        if (INVALID_HANDLE_VALUE == handle32Snapshot)

        {

                        return FALSE;

        }

        PROCESSENTRY32 pEntry;       

        pEntry.dwSize = sizeof( PROCESSENTRY32 );

        //Search for all the process and terminate it

        if(Process32First(handle32Snapshot, &pEntry))

        {

                BOOL bFound = FALSE;

                if (!_tcsicmp(pEntry.szExeFile, strProcessName))

                {

                        bFound = TRUE;

                        }

                while((!bFound)&&Process32Next(handle32Snapshot, &pEntry))

                {

                        if (!_tcsicmp(pEntry.szExeFile, strProcessName))

                        {

                                bFound = TRUE;

                        }

                }

                if(bFound)

                {

                        CloseHandle(handle32Snapshot);

                        HANDLE handLe =  OpenProcess(PROCESS_TERMINATE , FALSE, pEntry.th32ProcessID);

                        BOOL bResult = TerminateProcess(handLe,0);

                        return bResult;

                }

        }

        CloseHandle(handle32Snapshot);

        return FALSE;

}

總結

本文以C++ 和 C# 為例詳細的介紹了兩種強制結束進程的方式,經過嚴格的測試,以上代碼均可以成功運行並完成相關的任務,但是值得一提的是,這種結束進程的方式就是傳說中的下策,如果還有其他解決方案盡量不要採取這種方式結束進程,因為會導致相關的記憶體或者某些資源無法釋放,建議只在程式安裝或者升級使用這種方式

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.