linux里面有mysql的僵尸进程_Linux的僵尸进程处理1
Linux中有兩種異常的進程:
1.孤兒進程:應用通過fork進程后,父進程被kill或者exit,該父進程的子進程被1號進程接管。linux內核啟動時候回啟動0號進程,啟動完畢后0號進程就處于空閑狀態,所有的進程的父進程都是有1號進程fork出來的。
2.僵尸進程:fork操作出來的父子進程,子進程收到kil -9的操作或者exit的操作,子進程的內存和CPU資源被操作系統回收,但是PCB塊還會在內核中。Linux進程的控制是依靠PCB塊的,PCB塊記錄了進程的運行信息,比如時間片,運行時間,內存資源等等。linux內核按照不同的進程狀態把進程放到不同的狀態的list中,每次內核會遍歷這些list執行對應的進程。
如下就是一個簡單的例子,設計到了進程間管道通信、信號注冊,信號處理。
#include #include#include#include#include#include#include
#define TDATA 888
void clear_up(intsig) //收到exit或者kill -9的信號,需要處理的事情
{while(1)
{
pid_t p=wait(NULL);if(p == -1) break;
fprintf(stdout,"******recyle %d ok******\n",p);
}
}voidexit_fuc()//收到sigint的信號的處理
{
printf("*********exit %d******\n",getpid());
exit(0);
}int main(void) {int fd[2]; //管道處理,兩個進程的通信
signal(SIGCHLD,&clear_up); //信號的注冊,改信號是發送退出信號給操作系統時候需要處理的事情
signal(SIGINT,&exit_fuc); //信號注冊
pid_t pid= -1;if(pipe(fd) == -1)
{return -1;
}int w_fd = fd[1]; //管道中的fd[1]是寫的操作int r_fd = fd[0];//管道中的fd[0]的是讀操作
pid=fork(); //fork一個子進程
assert(pid!= -1);if(pid > 0)
{
close(r_fd);char buf[4] = {'\0'};int c_sec = 0;while(1)
{
fprintf(stdout,"I am a parent =%d,my child =%d\n\n",getpid(),getppid());
c_sec++;if(c_sec == 2)
{
printf("*********send %d********\n",TDATA); //父進程發送消息
memset(buf,'\0',sizeof(int));
sprintf(buf,"%d",TDATA);
write(w_fd,buf,sizeof(int));//寫到管道
system("ps -ef|grep -v 'grep'|grep 'tx1'");
}
sleep(2);
}
}else{close(w_fd);char buf[4] = {'\0'};while(1)
{
fprintf(stdout,"I am a child =%d,my parent =%d\n\n",getpid(),getppid());
system("ps -ef|grep -v 'grep'|grep 'tx1'");
memset(buf,'\0',4);
read(r_fd,buf,sizeof(int));if(strlen(buf) > 0 && atoi(buf) ==TDATA)
{
fprintf(stdout,"********recive %s***********\n",buf); //如果收到內容
kill(getpid(),9); //給操作系統發送9號信號
}
sleep(1);
}
}return 0;
}
總結
以上是生活随笔為你收集整理的linux里面有mysql的僵尸进程_Linux的僵尸进程处理1的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 求一个qq网名女生7个字!
- 下一篇: mssql mysql 语法区别_mss