网络编程(11)—— 进程和僵尸进程
来源:互联网 发布:淘宝 clarks小公主 编辑:程序博客网 时间:2024/05/21 07:00
一 新建进程
在linux中,可以用fork函数创建一个进程的副本(windows中无该功能),fork函数的原型如下:
#include <unistd.h>pid_t fork(void);若在主进程调用fork函数,将会在内存中原样拷贝主进程而形成子进程,这样子进程和主进程就会同时享有fork之后的代码,而在主进程中fork函数返回子进程的ID,而在子进程中fork返回的进程ID值为0,通过fork函数的返回值我们就可以区分子进程和主进程。
#include<stdio.h>#include<stdlib.h>#include<unistd.h>int gval=10;int main(){ int ival=100; int pid=fork(); if(pid==0)//子进程 { ival++; } else//父进程 { gval++; } if(pid==0) { printf("child process: gval=%d,ival=%d\n",gval,ival); } else { printf("parent process: gval=%d,ival=%d\n",gval,ival); } return 0;}在主进程中,fork返回了子进程的进程ID,并赋值给pid,而在子进程中pid是0,然后根据pid进行判断,在子进程中ival加1,而在主进程中gval加1,然后在不同的进程中输出gval和ival的值。
二 僵尸进程
当一个进程遇到下面两种情况会自行销毁:1、exit(int para)函数
2、return para语句
执行到上述语句时,进程会结束,但是进程的资源却不会被收回.进程结束时会将exit的参数或者return的值,交给操作系统,只有父进程主动向操作系统索取这些值后,子进程的资源才会被回收。直到父进程关闭时子进程和父进程一起关闭,在等待父进程关闭的这段时间内,子进程就成了僵尸进程。
#include<stdio.h>#include<stdlib.h>int main(){ pid_t pid=fork(); if(pid==0)//子进程 { printf("hi I'm a child process!\n"); } else { printf("I'm parent process!\n"); sleep(30); } if(pid==0) puts("End child process"); else puts("End parent process"); return 0;}在上述代码中,子进程return后,返回值0会交给操作系统,而操作系统会把其交给主进程,此时主进程正在sleep 30秒,在这30秒内,子进程就成了僵尸进程。如下在这段时间用ps au查看所有进程列表:
USER PID %CPU %MEM VSZ RSS TTY STAT START TIME COMMANDroot 1344 0.0 0.0 1960 276 tty2 Ss+ Jul13 0:00 /sbin/mingeroot 1346 0.0 0.0 1960 272 tty3 Ss+ Jul13 0:00 /sbin/mingeroot 1348 0.0 0.0 1960 272 tty4 Ss+ Jul13 0:00 /sbin/mingeroot 1353 0.0 0.0 1960 276 tty5 Ss+ Jul13 0:00 /sbin/mingeroot 1359 0.0 0.0 1960 276 tty6 Ss+ Jul13 0:00 /sbin/mingeroot 1387 0.4 2.2 35536 23188 tty1 Ss+ Jul13 6:07 /usr/bin/XoHyman 5769 0.0 0.0 6928 960 pts/0 Ss Jul13 0:03 bashHyman 7028 0.0 0.1 6848 1332 pts/1 Ss Jul13 0:01 bashroot 9226 0.0 0.2 9584 2212 pts/0 S 08:58 0:00 suroot 9235 0.0 0.1 6860 1260 pts/0 S+ 08:58 0:00 bashHyman 9253 0.0 0.1 6848 1736 pts/2 Ss+ 09:00 0:00 bashHyman 9675 0.1 0.0 1820 332 pts/1 S 10:55 0:00 ./a.outHyman 9676 0.0 0.0 0 0 pts/1 Z 10:55 0:00 Hyman 9677 0.0 0.0 6384 1000 pts/1 R+ 10:55 0:00 p请注意PID=9676的进程,其状态STAT为Z的就是我们的子进程,现在就成了僵尸进程,直到我们的主进程结束后其资源才会被释放.
Github位置:
https://github.com/HymanLiuTS/NetDevelopment
克隆本项目:
git clone git@github.com:HymanLiuTS/NetDevelopment.git
获取本文源代码:
git checkout NL11
1 0
- 网络编程(11)—— 进程和僵尸进程
- UNIX网络编程——僵尸进程
- 网络编程(12)—— 利用wait和waitpid函数消毁僵尸进程
- 网络编程(13)—— 利用信号处理函数signal和sigaction销毁僵尸进程
- Linux网络编程(一)——消灭僵尸进程
- 网络编程之僵尸进程
- Linux — 孤儿进程和僵尸进程
- UNIX网络编程——使用waitpid处理僵尸进程(TCP客户/服务器优化1)
- 网络编程(32)—— linux中销毁僵尸进程的四种方法
- 【Linux编程】僵尸进程和孤儿进程
- Linux系统编程——特殊进程之僵尸进程
- Linux系统编程——特殊进程之僵尸进程
- Linux系统编程——特殊进程之僵尸进程
- Linux系统编程——特殊进程之僵尸进程
- Linux系统编程——特殊进程之僵尸进程
- Linux系统编程——特殊进程之僵尸进程
- 网络编程中服务器端避免僵尸进程
- socket网络编程避免僵尸进程
- 关于使用Makefile进行GCC编译报错问题解决方法
- Python 练习册--存入数据库(Mongodb,MySQL)操作
- php防sql注入
- 开始写博客
- Linux文件读写机制及优化方式
- 网络编程(11)—— 进程和僵尸进程
- 【Spring学习笔记】文件上传
- Repeater 双向排序
- memcache模拟
- 自学MVC看这里——全网最全ASP.NET MVC 教程汇总
- 飞思卡尔IMX6处理器的GPIO配置方式
- Oracle 10g的安装步骤和注意事项
- 海思移植opencv+人脸检测+速度优化
- Java中List、Set、Map区别--小记