fork併發進程處理

線程併發

處理殭屍線程

不少時候咱們fork建立的子進程終止時,須要服務器進程進行清理,假若未進行處理將會處理大量的殭屍線程,那麼咱們能夠選擇將進忽略,並交給init進程進行處理。c++

signal(SIGCHLD, SIG_IGN);
    
    //在fork建立的處理模塊當中添加下列的代碼,當子線程處理結束後將其退出,並由Init來釋放資源。
    exit(EXIT_SUCCESS);

fork 建立進程

fork是建立一個當前運行進程的副本,只能經過返回值去區分當前是父線程仍是子線程。fork是一次調用兩次返回,一般返回下面兩類.面試

  • 當fork()返回的是>0的時候表示當前的是父進程
  • 當fork()返回的爲0表示當前是子進程.
  • 返回<0表示當前建立的進程出現錯誤 ###示例一
#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;
}

相關文章
相關標籤/搜索