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;
}

相关文章
相关标签/搜索