不少时候咱们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; }