創建進程c語言,c++進程創建

本文目錄一覽:

C語言創建進程

fork()應該是Linux操作系統的函數。

從#include sys/signal.h和fork()上判斷,這個程序應該是Linux操作系統的應用程序。

Windows上應該用CreateProcess創建進程

獲取進程ID用

DWORD GetWindowThreadProcessld(HWND hwnd,LPDWORD lpdwProcessld)

hWnd:窗口句柄。

lpdwProcessld:接收進程標識的32位值的地址。如果這個參數不為NULL,GetWindwThreadProcessld將進程標識拷貝到這個32位值中,否則不拷貝。

返回值:返回值為創建窗口的線程標識。

操作系統 用C語言創建進程

按字面意思,

typedef struct pb PCB; //把struct pb定義成新類型PCB,這個struct pb應該是保存進程信息的結構體

PCB a[10]; //定義一個10個元素的數組a,它的元素類型是PCB,也就是上面的struct pb結構體,這個數組定義出來可以用來管理10個進程。

C語言如何創建並發進程

WIN32API函數CreateProcess用來創建一個新的進程和它的主線程,這個新進程運行指定的可執行文件。

函數原型:

BOOL CreateProcess

(

LPCTSTR lpApplicationName,

LPTSTR lpCommandLine,

LPSECURITY_ATTRIBUTES lpProcessAttributes。

LPSECURITY_ATTRIBUTES lpThreadAttributes,

BOOL bInheritHandles,

DWORD dwCreationFlags,

LPVOID lpEnvironment,

LPCTSTR lpCurrentDirectory,

LPSTARTUPINFO lpStartupInfo,

LPPROCESS_INFORMATIONlpProcessInformation

);

參數:

lpApplicationName

指向一個NULL結尾的、用來指定可執行模塊的字符串。

這個字符串可以是可執行模塊的絕對路徑,也可以是相對路徑,在後一種情況下,函數使用當前驅動器和目錄建立可執行模塊的路徑。

這個參數可以被設為NULL,在這種情況下,可執行模塊的名字必須處於 lpCommandLine 參數最前面並由空格符與後面的字符分開。

lpCommandLine

指向一個以NULL結尾的字符串,該字符串指定要執行的命令行。

這個參數可以為空,那麼函數將使用lpApplicationName參數指定的字符串當做要運行的程序的命令行。

如果lpApplicationName和lpCommandLine參數都不為空,那麼lpApplicationName參數指定將要被運行的模塊,lpCommandLine參數指定將被運行的模塊的命令行。新運行的進程可以使用GetCommandLine函數獲得整個命令行。C語言程序可以使用argc和argv參數。

lpProcessAttributes

指向一個SECURITY_ATTRIBUTES結構體,這個結構體決定是否返回的句柄可以被子進程繼承。如果lpProcessAttributes參數為空(NULL),那麼句柄不能被繼承。

在Windows NT中:SECURITY_ATTRIBUTES結構的lpSecurityDescriptor成員指定了新進程的安全描述符,如果參數為空,新進程使用默認的安全描述符。

lpThreadAttributes

同lpProcessAttribute,不過這個參數決定的是線程是否被繼承.通常置為NULL.

bInheritHandles

指示新進程是否從調用進程處繼承了句柄。

如果參數的值為真,調用進程中的每一個可繼承的打開句柄都將被子進程繼承。被繼承的句柄與原進程擁有完全相同的值和訪問權限。

dwCreationFlags

指定附加的、用來控制優先類和進程的創建的標誌。以下的創建標誌可以以除下面列出的方式外的任何方式組合後指定。

⑴值:CREATE_DEFAULT_ERROR_MODE

含義:新的進程不繼承調用進程的錯誤模式。CreateProcess函數賦予新進程當前的默認錯誤模式作為替代。應用程序可以調用SetErrorMode函數設置當前的默認錯誤模式。

這個標誌對於那些運行在沒有硬件錯誤環境下的多線程外殼程序是十分有用的。

對於CreateProcess函數,默認的行為是為新進程繼承調用者的錯誤模式。設置這個標誌以改變默認的處理方式。

⑵值:CREATE_NEW_CONSOLE

含義:新的進程將使用一個新的控制台,而不是繼承父進程的控制台。這個標誌不能與DETACHED_PROCESS標誌一起使用。

⑶值:CREATE_NEW_PROCESS_GROUP

含義:新進程將是一個進程樹的根進程。進程樹中的全部進程都是根進程的子進程。新進程樹的用戶標識符與這個進程的標識符是相同的,由lpProcessInformation參數返回。進程樹經常使用GenerateConsoleCtrlEvent函數允許發送CTRL+C或CTRL+BREAK信號到一組控制台進程。

⑷值:CREATE_SEPARATE_WOW_VDM

如果被設置,新進程將會在一個私有的虛擬DOS機(VDM)中運行。另外,默認情況下所有的16位Windows應用程序都會在同一個共享的VDM中以線程的方式運行。單獨運行一個16位程序的優點是一個應用程序的崩潰只會結束這一個VDM的運行;其他那些在不同VDM中運行的程序會繼續正常的運行。同樣的,在不同VDM中運行的16位Windows應用程序擁有不同的輸入隊列,這意味着如果一個程序暫時失去響應,在獨立的VDM中的應用程序能夠繼續獲得輸入。

⑸值:CREATE_SHARED_WOW_VDM

如果WIN.INI中的Windows段的DefaultSeparateVDM選項被設置為真,這個標識使得CreateProcess函數越過這個選項並在共享的虛擬DOS機中運行新進程。

⑹值:CREATE_SUSPENDED

含義:新進程的主線程會以暫停的狀態被創建,直到調用ResumeThread函數被調用時才運行。

⑺值:CREATE_UNICODE_ENVIRONMENT

含義:如果被設置,由lpEnvironment參數指定的環境塊使用Unicode字符,如果為空,環境塊使用ANSI字符。

⑻值:DEBUG_PROCESS

含義:如果這個標誌被設置,調用進程將被當做一個調試程序,並且新進程會被當做被調試的進程。系統把被調試程序發生的所有調試事件通知給調試器。

如果你使用這個標誌創建進程,只有調用進程(調用CreateProcess函數的進程)可以調用WaitForDebugEvent函數。

⑼值:DEBUG_ONLY_THIS_PROCESS

含義:如果此標誌沒有被設置且調用進程正在被調試,新進程將成為調試調用進程的調試器的另一個調試對象。如果調用進程沒有被調試,有關調試的行為就不會產生。

⑽值:DETACHED_PROCESS

含義:對於控制台進程,新進程沒有訪問父進程控制台的權限。新進程可以通過AllocConsole函數自己創建一個新的控制台。這個標誌不可以與CREATE_NEW_CONSOLE標誌一起使用。

〔11〕值:CREATE_NO_WINDOW

含義:系統不為新進程創建CUI窗口,使用該標誌可以創建不含窗口的CUI程序。

dwCreationFlags參數

還用來控制新進程的優先類,優先類用來決定此進程的線程調度的優先級。如果下面的優先級類標誌都沒有被指定,那麼默認的優先類是NORMAL_PRIORITY_CLASS,除非被創建的進程是IDLE_PRIORITY_CLASS。在這種情況下子進程的默認優先類是IDLE_PRIORITY_CLASS。

可以選擇下面的標誌中的一個:

優先級:HIGH_PRIORITY_CLASS

含義:指示這個進程將執行時間臨界的任務,所以它必須被立即運行以保證正確。這個優先級的程序優先於正常優先級或空閑優先級的程序。一個例子是Windows任務列表,為了保證當用戶調用時可以立刻響應,放棄了對系統負荷的考慮。確保在使用高優先級時應該足夠謹慎,因為一個高優先級的CPU關聯應用程序可以佔用幾乎全部的CPU可用時間。

優先級:IDLE_PRIORITY_CLASS

含義:指示這個進程的線程只有在系統空閑時才會運行並且可以被任何高優先級的任務打斷。例如屏幕保護程序。空閑優先級會被子進程繼承。

優先級:NORMAL_PRIORITY_CLASS

含義:指示這個進程沒有特殊的任務調度要求。

優先級:REALTIME_PRIORITY_CLASS

含義:指示這個進程擁有可用的最高優先級。一個擁有實時優先級的進程的線程可以打斷所有其他進程線程的執行,包括正在執行重要任務的系統進程。例如,一個執行時間稍長一點的實時進程可能導致磁盤緩存不足或鼠標反映遲鈍。

lpEnvironment

指向一個新進程的環境塊。如果此參數為空,新進程使用調用進程的環境。

一個環境塊存在於一個由以NULL結尾的字符串組成的塊中,這個塊也是以NULL結尾的。每個字符串都是name=value的形式。

因為相等標誌被當做分隔符,所以它不能被環境變量當做變量名。

與其使用應用程序提供的環境塊,不如直接把這個參數設為空,系統驅動器上的當前目錄信息不會被自動傳遞給新創建的進程。對於這個情況的探討和如何處理,請參見注釋一節。

環境塊可以包含Unicode或ANSI字符。如果lpEnvironment指向的環境塊包含Unicode字符,那麼dwCreationFlags字段的CREATE_UNICODE_ENⅥRONMENT標誌將被設置。如果塊包含ANSI字符,該標誌將被清空。

請注意一個ANSI環境塊是由兩個零位元組結束的:一個是字符串的結尾,另一個用來結束這個快。一個Unicode環境塊是由四個零位元組結束的:兩個代表字符串結束,另兩個用來結束塊。

lpCurrentDirectory

指向一個以NULL結尾的字符串,這個字符串用來指定子進程的工作路徑。這個字符串必須是一個包含驅動器名的絕對路徑。如果這個參數為空,新進程將使用與調用進程相同的驅動器和目錄。這個選項是一個需要啟動應用程序並指定它們的驅動器和工作目錄的外殼程序的主要條件。

lpStartupInfo

指向一個用於決定新進程的主窗體如何顯示的STARTUPINFO結構體。

lpProcessInformation

指向一個用來接收新進程的識別信息的PROCESS_INFORMATION結構體。

返回值:

如果函數執行成功,返回非零值。

如果函數執行失敗,返回零,可以使用GetLastError函數獲得錯誤的附加信息。

進程的查看、創建和撤銷(C語言)

例程:

#include stdio.h

#include windows.h

#includetlhelp32.h

int showallproc()

{

    PROCESSENTRY32 pe32;//用來存儲進程信息的結構體

    pe32.dwSize=sizeof(pe32);

    HANDLE hProcessSnap=CreateToolhelp32Snapshot(TH32CS_SNAPPROCESS,0);//獲取進程快照

    if(hProcessSnap==INVALID_HANDLE_VALUE)

    {

        printf(“調用失敗\n”);

        return 1;

    }

    BOOL bProc=Process32First(hProcessSnap,pe32);

    while(bProc)

    {

        printf(“%5d %s\n”,pe32.th32ProcessID,pe32.szExeFile);//輸出進程ID和進程名

        bProc=Process32Next(hProcessSnap,pe32);

    }

    CloseHandle(hProcessSnap);

    return 0;

}

int creatproc()

{

    char str[256]={0};

    printf(“請輸入可執行文件路徑(*.exe):\n”);

    scanf(” %s”,str);

    STARTUPINFO si={0};

    si.cb=sizeof(STARTUPINFO);

    si.dwFlags=STARTF_USESHOWWINDOW;

    si.wShowWindow=SW_SHOW;

    PROCESS_INFORMATION pi;

    if (!CreateProcess(NULL,str,NULL,NULL,FALSE,0,NULL,NULL,si,pi))

    {

        printf(“創建失敗\n”);

        return -1;

    }

    else

    {

        printf(“創建成功\n”);

        printf(“進程號:%d\n”,pi.dwProcessId);

    }

return 0;

}

int stopproc()

{

    DWORD ProcessID;

    printf(“請輸入想要終止的進程ID\n”);

    scanf(” %d”,ProcessID);

    HANDLE hProcess=OpenProcess(PROCESS_TERMINATE,FALSE,ProcessID);//打開對應進程句柄

    if (hProcess==NULL)

    {

        printf(“失敗\n”);

        return -1;

    }

    if (!TerminateProcess(hProcess,0))//關閉進程

    {

        printf(“關閉失敗\n”);

    }

    else

    {

        printf(“關閉成功\n”);

    }

    CloseHandle(hProcess);

   

    return 0;

}

int main()

{

    int n=0;

    while(n!=4)

    {

        printf(“1 查看進程\n”);

        printf(“2 創建進程\n”);

        printf(“3 終止進程\n”);

        printf(“4 結束\n”);

        printf(“請選擇:”);

        scanf(” %d”,n);

        switch(n)

        {

        case 1:

            showallproc();

            break;

        case 2:

            creatproc();

            break;

        case 3:

            stopproc();

            break;

        case 4:

            break;

        default:

            printf(“輸入有誤!\n”);

            break;

        }

    }

    return 0;

}

急急急急!用c語言創建一個新進程 十分鐘,

#include stdio.h

#include stdlib.h

#include unistd.h

int main()

{

pid_t id; //定義一個進程號變量

int i=0;

printf(“start fork/n”);

id = fork(); //調用fork函數新建一個進程

i ++;

printf(“end fork/n”);

//判斷當前進程

if(id 0){ //出錯

perror(“fork failed/n”);

exit(1);

}

else if(id == 0){ //子進程

printf(“In child/n”);

printf(“i = %d/n”, i++);

exit(0);

}

else{ //父進程

printf(“In father/n”);

printf(“i = %d/n”, i++);

exit(0);

}

return 0;

}

原創文章,作者:小藍,如若轉載,請註明出處:https://www.506064.com/zh-hk/n/159043.html

(0)
打賞 微信掃一掃 微信掃一掃 支付寶掃一掃 支付寶掃一掃
小藍的頭像小藍
上一篇 2024-11-19 18:57
下一篇 2024-11-19 18:57

相關推薦

  • AES加密解密算法的C語言實現

    AES(Advanced Encryption Standard)是一種對稱加密算法,可用於對數據進行加密和解密。在本篇文章中,我們將介紹C語言中如何實現AES算法,並對實現過程進…

    編程 2025-04-29
  • 學習Python對學習C語言有幫助嗎?

    Python和C語言是兩種非常受歡迎的編程語言,在程序開發中都扮演着非常重要的角色。那麼,學習Python對學習C語言有幫助嗎?答案是肯定的。在本文中,我們將從多個角度探討Pyth…

    編程 2025-04-29
  • Python被稱為膠水語言

    Python作為一種跨平台的解釋性高級語言,最大的特點是被稱為”膠水語言”。 一、簡單易學 Python的語法簡單易學,更加人性化,這使得它成為了初學者的入…

    編程 2025-04-29
  • OpenJudge答案1.6的C語言實現

    本文將從多個方面詳細闡述OpenJudge答案1.6在C語言中的實現方法,幫助初學者更好地學習和理解。 一、需求概述 OpenJudge答案1.6的要求是,輸入兩個整數a和b,輸出…

    編程 2025-04-29
  • 如何通過jstack工具列出假死的java進程

    假死的java進程是指在運行過程中出現了某些問題導致進程停止響應,此時無法通過正常的方式關閉或者重啟該進程。在這種情況下,我們可以藉助jstack工具來獲取該進程的進程號和線程號,…

    編程 2025-04-29
  • Python按位運算符和C語言

    本文將從多個方面詳細闡述Python按位運算符和C語言的相關內容,並給出相應的代碼示例。 一、概述 Python是一種動態的、面向對象的編程語言,其按位運算符是用於按位操作的運算符…

    編程 2025-04-29
  • Python語言由荷蘭人為中心的全能編程開發工程師

    Python語言是一種高級語言,很多編程開發工程師都喜歡使用Python語言進行開發。Python語言的創始人是荷蘭人Guido van Rossum,他在1989年聖誕節期間開始…

    編程 2025-04-28
  • Python語言設計基礎第2版PDF

    Python語言設計基礎第2版PDF是一本介紹Python編程語言的經典教材。本篇文章將從多個方面對該教材進行詳細的闡述和介紹。 一、基礎知識 本教材中介紹了Python編程語言的…

    編程 2025-04-28
  • Python語言實現人名最多數統計

    本文將從幾個方面詳細介紹Python語言實現人名最多數統計的方法和應用。 一、Python實現人名最多數統計的基礎 1、首先,我們需要了解Python語言的一些基礎知識,如列表、字…

    編程 2025-04-28
  • Python作為中心語言,在編程中取代C語言的優勢和挑戰

    Python一直以其簡單易懂的語法和高效的編碼環境而著名。然而,它最近的發展趨勢表明Python的使用範圍已經從腳本語言擴展到了從Web應用到機器學習等廣泛的開發領域。與此同時,C…

    編程 2025-04-28

發表回復

登錄後才能評論