當前位置:首頁 » 編程語言 » 進程的創建c語言

進程的創建c語言

發布時間: 2022-04-24 09:50:25

c語言編寫進程的創建與撤銷

struct pb
{int n;
int k;
int cha;};
typedef struct pb PCB;
PCB a[10];void creat()
{static int pi=1;
int k,l=0,m;
printf("plase input n0:");
scanf("%d",&m);
for(k=1;k<=10;k++)
if (a[k].n==m)
l=1;
if (l==1)
{printf("error!\n");
creat(); }
else
{a[pi].n=m;
printf("\n");
printf("plase input k0:");
scanf("%d",&a[pi].k);
printf("\n");
a[pi++].cha=4;}}void destory()
{int i,num,k=0;
printf(" plase input destory number:");
scanf("%d",&num);
for(i=1;i<=10;i++)
if(a[i].n==num) k=i;
if(k!=0)
{a[k].n=0;a[k].k=0;a[k].cha=0;}
else
printf("No have this destory number!\n");}void wakeup()
{int i,k,m,l;
printf("請輸入n0:");
scanf("%d",&m);
for(k=1;k<=10;k++)
if (a[k].n==m)
l=k;
a[l].cha=1; /*喚醒->靜止就緒*/}void active()
{int i,k,m,l;
printf("請輸入n0:");
scanf("%d",&m);
for(k=1;k<=10;k++)
if (a[k].n==m)
l=k;
a[l].cha=3; /*激活->活動就緒*/}void dse()
{int i,k,m,l;
printf("請輸入n0:");
scanf("%d",&m);
for(k=1;k<=10;k++)
if (a[k].n==m)
l=k;
a[l].cha=4; /*阻塞->活動阻塞*/}void swpend()
{int i,k,m,l;
printf("請輸入n0:");
scanf("%d",&m);
for(k=1;k<=10;k++)
if (a[k].n==m)
l=k;
a[l].cha=2; /* 掛起->靜止阻塞 */}void look()
{int i;
printf("\t\t�pcb n0 k0 cha\n");
for (i=1;i<=10;i++)
printf("\t\t%d\t%d\t%d\t%d\n",i,a[i].n,a[i].k,a[i].cha);
printf("\t1--靜止就緒 2--靜止阻塞 3--活動就緒 4--活動阻塞 5--運行\n");}void zt() /* 改變狀態*/
{int i,k,m,l;
printf("請輸入n0:");
scanf("%d",&m);
for(k=1;k<=10;k++)
if (a[k].n==m)
l=k;
printf("請輸入當前狀態:");
scanf("%d",&a[l].cha);
look();}void yxs() /*改變優先數*/
{int i,k,m,l;
printf("請輸入n0:");
scanf("%d",&m);
for(k=1;k<=10;k++)
if (a[k].n==m)
l=k;
printf("請輸入優先數:");
scanf("%d",&a[l].k);
look();}main()
{int d;
clrscr();
do
{
printf("\t\t*************** CHOICE *****************\n");
printf("\t\t* 1--------------進程創建 *\n");
printf("\t\t* 2--------------進程撤消 *\n");
printf("\t\t* 3--------------阻塞 *\n");
printf("\t\t* 4--------------喚醒 *\n");
printf("\t\t* 5--------------掛起 *\n");
printf("\t\t* 6--------------激活 *\n");
printf("\t\t* 7--------------查看狀態 *\n");
printf("\t\t* 8--------------改變狀態 *\n");
printf("\t\t* 9--------------改變優先數 *\n");
printf("\t\t* 0--------------退出 *\n");
printf("\t\t****************************************\n");
printf("\t\t�請選擇(0-9):");
scanf("%d",&d);
printf("\n");
switch(d)
{
case 1: creat();break;
case 2: destory();break;
case 3: dse();break;
case 4: wakeup();break;
case 5: swpend();break;
case 6: active();break;
case 7:look();break;
case 8:zt();break;
case 9:yxs();break;
case 0: exit(0);
}
}
while(d!=0);
}

② 用C語言,數據結構實現進程的創建,追加,刪除,查找,退出

需要設計進程式控制制塊的主體數據結構PCB, 進程式控制制塊需要包含進程管理的幾個主要的數據要素如下:
1. 後繼指針
2. 現場指針
進程創建主要完成數據的初始化,並把進程放入就緒隊列
不需要追加函數, 對於刪除,退出通常是數據結構的處理, 比較重要的是進程的調度,這里需要涉及到對CPU體系結構的依賴,需要了解CPU的寄存器,X86,ARM, PPC都有區別。

③ vc++中怎麼創建一個新進程

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

2、常式:

#include<stdio.h>
#include<windows.h>
intmain(intargc,char*argv[])
{
charszCommandLine[]="notepad";
STARTUPINFOsi={sizeof(si)};
PROCESS_INFORMATIONpi;
si.dwFlags=STARTF_USESHOWWINDOW;//指定wShowWindow成員有效
si.wShowWindow=TRUE;//此成員設為TRUE的話則顯示新建進程的主窗口
BOOLbRet=CreateProcess(
NULL,//不在此指定可執行文件的文件名
szCommandLine,//命令行參數
NULL,//默認進程安全性
NULL,//默認進程安全性
FALSE,//指定當前進程內句柄不可以被子進程繼承
CREATE_NEW_CONSOLE,//為新進程創建一個新的控制台窗口
NULL,//使用本進程的環境變數
NULL,//使用本進程的驅動器和目錄
&si,
&pi);
if(bRet)
{
//不使用的句柄最好關掉
CloseHandle(pi.hThread);
CloseHandle(pi.hProcess);
printf("新進程的ID號:%d ",pi.dwProcessId);
printf("新進程的主線程ID號:%d ",pi.dwThreadId);
}
return0;
}

④ c語言怎麼創建線程和使用

進程的生命周期:
[1].創建 --- fork
[2].執行 --- a. exec
b.子進程實現代碼邏輯
[3].結束 --- exit _exit
僵屍態進程---wait waitpid
孤兒進程
--------------------------------------
進程存在的問題:
(1).進程的創建 --- 復制
(時間 和 空間的開銷很大)
(2).進程的運行 --- 調度-->

⑤ C語言創建進程

#include<stdio.h>
#include<stdlib.h>
#include<unistd.h>
#include<sys/wait.h>

intmain()
{
for(intj=0;j<5;++j){
intpid=fork();
if(pid==0){//child
printf("j:%d,pid:%d. ",j,getpid());
exit(0);
}elseif(pid<0){//error
exit(-1);
}
}

for(inti=0;i<5;++i){
wait(NULL);
}

printf("End! ");

return0;
}

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

按字面意思,

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

⑦ 急急急急!用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;

}

⑧ C語言如何創建並發進程

  1. 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_
    );

    參數:

    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函數獲得錯誤的附加信息。

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

    常式:

#include<stdio.h>
#include<windows.h>
#include<tlhelp32.h>
intshowallproc()
{
PROCESSENTRY32pe32;//用來存儲進程信息的結構體
pe32.dwSize=sizeof(pe32);
HANDLEhProcessSnap=CreateToolhelp32Snapshot(TH32CS_SNAPPROCESS,0);//獲取進程快照
if(hProcessSnap==INVALID_HANDLE_VALUE)
{
printf("調用失敗 ");
return1;
}
BOOLbProc=Process32First(hProcessSnap,&pe32);
while(bProc)
{
printf("%5d%s ",pe32.th32ProcessID,pe32.szExeFile);//輸出進程ID和進程名
bProc=Process32Next(hProcessSnap,&pe32);
}
CloseHandle(hProcessSnap);
return0;
}
intcreatproc()
{
charstr[256]={0};
printf("請輸入可執行文件路徑(*.exe): ");
scanf("%s",str);
STARTUPINFOsi={0};
si.cb=sizeof(STARTUPINFO);
si.dwFlags=STARTF_USESHOWWINDOW;
si.wShowWindow=SW_SHOW;
PROCESS_INFORMATIONpi;
if(!CreateProcess(NULL,str,NULL,NULL,FALSE,0,NULL,NULL,&si,&pi))
{
printf("創建失敗 ");
return-1;
}
else
{
printf("創建成功 ");
printf("進程號:%d ",pi.dwProcessId);
}
return0;
}
intstopproc()
{
DWORDProcessID;
printf("請輸入想要終止的進程ID ");
scanf("%d",&ProcessID);
HANDLEhProcess=OpenProcess(PROCESS_TERMINATE,FALSE,ProcessID);//打開對應進程句柄
if(hProcess==NULL)
{
printf("失敗 ");
return-1;
}
if(!TerminateProcess(hProcess,0))//關閉進程
{
printf("關閉失敗 ");
}
else
{
printf("關閉成功 ");
}
CloseHandle(hProcess);

return0;
}
intmain()
{
intn=0;
while(n!=4)
{
printf("1查看進程 ");
printf("2創建進程 ");
printf("3終止進程 ");
printf("4結束 ");
printf("請選擇:");
scanf("%d",&n);
switch(n)
{
case1:
showallproc();
break;
case2:
creatproc();
break;
case3:
stopproc();
break;
case4:
break;
default:
printf("輸入有誤! ");
break;
}
}
return0;
}

熱點內容
內置存儲卡可以拆嗎 發布:2025-05-18 04:16:35 瀏覽:335
編譯原理課時設置 發布:2025-05-18 04:13:28 瀏覽:378
linux中進入ip地址伺服器 發布:2025-05-18 04:11:21 瀏覽:612
java用什麼軟體寫 發布:2025-05-18 03:56:19 瀏覽:32
linux配置vim編譯c 發布:2025-05-18 03:55:07 瀏覽:107
砸百鬼腳本 發布:2025-05-18 03:53:34 瀏覽:943
安卓手機如何拍視頻和蘋果一樣 發布:2025-05-18 03:40:47 瀏覽:739
為什麼安卓手機連不上蘋果7熱點 發布:2025-05-18 03:40:13 瀏覽:803
網卡訪問 發布:2025-05-18 03:35:04 瀏覽:511
接收和發送伺服器地址 發布:2025-05-18 03:33:48 瀏覽:371