不少時候咱們fork建立的子進程終止時,須要服務器進程進行清理,假若未進行處理將會處理大量的殭屍線程,那麼咱們能夠選擇將進忽略,並交給init進程進行處理。c++
signal(SIGCHLD, SIG_IGN); //在fork建立的處理模塊當中添加下列的代碼,當子線程處理結束後將其退出,並由Init來釋放資源。 exit(EXIT_SUCCESS);
fork是建立一個當前運行進程的副本,只能經過返回值去區分當前是父線程仍是子線程。fork是一次調用兩次返回,一般返回下面兩類.面試
#include <stdio.h> #include <string.h> #include <unistd.h> int main( void ) { int pid = fork(); if ( pid == 0 ) { printf( "當前處於子線程運行" ); } else { printf("當處於父進程運行,當前所建立的子線程的ID: %d\n",pid); } return 0; }
運行的結果服務器
gcc ForkTest.c ./a.out 當處於父進程運行,當前所建立的子線程的ID: 6761 當前處於子線程運行%併發
###getpid() 經過調用getpid能夠得到本身的標識. 示例2線程
#include <stdio.h> #include <string.h> #include <unistd.h> int main( void ) { int pid = fork(); if ( pid == 0 ) { printf( "當前處於子線程運行,id:%d",(int)getpid() ); } else { printf("當處於父進程運行,父進程的ID:%d,當前所建立的子線程的ID: %d\n",(int)getpid(),pid); } return 0; }
運行結果code
gcc ForkTest2.c ./a.out 當處於父進程運行,父進程的ID:6837,當前所建立的子線程的ID: 6838 當前處於子線程運行,id:6838%進程
示例3資源
#include <stdio.h> #include <string.h> #include <unistd.h> int main( void ) { int sum=50; int pid; for (int i = 0; i < 2; i++) { pid=fork(); if(pid==0){ printf("建立了一個子線程成功\n"); printf("pid=%d,ppid=%d\n",getpid(),getppid()); printf("i=%d\n",i); } else if(pid>0){ printf("父進程\n"); printf("pid=%d,ppid=%d\n",getpid(),getppid()); printf("i=%d\n",i); } } return 0; }
運行結果get
gcc ForkTest.c /a.out 父進程 pid=7226,ppid=2513 i=0 父進程 pid=7226,ppid=2513 i=1 建立了一個子線程成功 pid=7227,ppid=7226 i=0 建立了一個子線程成功 pid=7228,ppid=7226 i=1 父進程 pid=7227,ppid=1 i=1 建立了一個子線程成功 pid=7229,ppid=7227 i=1 string
上面的程序咱們進行一個for循環,本意是想經過這個循環調用fork建立兩個子進程,但是執行的結果倒是建立了三個進程 產生這個問題的緣由是: 建立了7227這個副本的時候咱們也拷貝了父進程的全部的代碼,那麼7227也會進入for循環,這裏i=1就會在子線程也會調用一次fork這樣就建立了三個線程
示例四 解決上面所述的問題
#include <stdio.h> #include <string.h> #include <unistd.h> int main( void ) { int sum=50; int pid; for (int i = 0; i < 2; i++) { pid=fork(); if(pid==0){ printf("建立了一個子線程成功\n"); printf("pid=%d,ppid=%d\n",getpid(),getppid()); printf("i=%d\n",i); break; } else if(pid>0){ printf("父進程\n"); printf("pid=%d,ppid=%d\n",getpid(),getppid()); printf("i=%d\n",i); } } return 0; }
gcc ForkTest.c ./a.out 父進程 pid=7326,ppid=2513 i=0 父進程 pid=7326,ppid=2513 i=1 建立了一個子線程成功 pid=7327,ppid=7326 i=0 建立了一個子線程成功 pid=7328,ppid=7326 i=1
網上面試題講解
#include <stdio.h> #include <sys/types.h> #include <unistd.h> int main(void) { int i; for(i=0; i<2; i++){ I fork(); printf("%d,%d\n",getpid(),getppid()); } wait(NULL); wait(NULL); return 0; }