南京网站制作百家号,商务网站建设与维护 课件,做网站的前途,自己做的网站怎么让别人能访问1.僵死进程(僵尸进程)#xff1a;
1.僵死进程产生的原因或者条件:
什么是僵死进程?
当子进程先于父进程结束,父进程没有获取子进程的退出码,此时子进程变成僵死进程.
简而言之,就是子进程先结束,并且父进程没有获取它的退出码;
那么僵死进程产生的原因或者条件就是:子进…1.僵死进程(僵尸进程)
1.僵死进程产生的原因或者条件:
什么是僵死进程?
当子进程先于父进程结束,父进程没有获取子进程的退出码,此时子进程变成僵死进程.
简而言之,就是子进程先结束,并且父进程没有获取它的退出码;
那么僵死进程产生的原因或者条件就是:子进程先于父进程结束,并且父进程没有获取子进程的退出码; 2.进程结束的过程以及僵死进程产生的过程: 3.观察僵死进程:
父进程执行7次,子进程改为3次;就能观察到僵死进程(放到后台运行,ps -f); 4.处理僵死进程
(1)父进程先结束(子进程会变成孤儿进程,孤儿进程会被收养(红帽子是init(pid1)收养孤儿进程,Unbuntu是操作系统指定了一个进程)); (2)父进程调用wait()方法获取子进程的退出码; 本质:都是调用了wait方法;
代码演示:
方法一:父进程先结束//就是把父进程的n3,子进程的n7即可;
方法二:显示的调用wait: else { sparent; n7; int val0; wait(val); printf(val%d\n,val); } 但是两种方法都有区别:就是父进程调用wait会阻塞,等子进程执行完之后,父进程才会去执行; 5.处理僵死进程的意义; 僵死进程的坏处:白白消耗内存;(讲服务器代码的时候会演示) Linux内核设计与实现27页; 6.退出码
改代码:exit(3); 执行显示val768; man 2 wait WIFEXITED:正常退出的状态; WEXITSTATUS:获取退出码; else//父进程 { sparent; n7; int val0; wait(val); if(WIFEXITED(val)) { printf(val%d\n,WEXITSTATUS(val)); } } 7.避免僵死进程的方法总结
1)父进程先结束;
2)父进程调用wait()方法获取子进程的退出码;其实两种处理僵死进程的方法本质都是一样的,都调用了wait获取子进程退出码(方法一是父进程先结束后子进程被Init(现在随着内核的发展不一定是1)收养,Init之后调用wait获取子进程退出码;方法二是父进程直接调用wait,)但是两种方法又有区别,就是父进程调用wait会阻塞,等子进程执行完之后,父进程才会执行.
若想父进程调用wait不阻塞,那么我们需要结合信号一起.具体在信号那一节用代码演示;
2.Linux操作文件的底层系统调用
C语言操作文件的几个库函数:fopen,fread,fwrite,fclose; 系统调用:open,read,write,close; 系统调用方法实现在内核中;(陷入内核,切换到内核) 1.open的介绍: open重载:两个参数用于打开一个已经存在的文件;三个参数的用于新建一个文件,并设置访问权限; pathname:文件和路径和名称; flags:文件的打开方式; mode:文件的权限,如0600; 了解特殊权限:linux系统中文件的三种特殊权限_rwsr是什么权限-CSDN博客
关于linux权限s权限和t权限详解_目录权限t_D_R_L_T的博客-CSDN博客 open的返回值为int,称为文件描述符; flags的打开标志,如: O_WRONLY:只写打开; O_RDONLY:只读打开; O_RDWR:读写方式打开; O_CREAT:文件不存在则创建; O_APPEND:文件末尾追加; O_TRUNC:清空文件,重新写入; open的返回值是int,称之为文件描述符;每打开一个文件,我们就会得到一个文件描述符,这个文件描述符是一个整型,通过文件描述符就可以对文件进行读写这样的操作.open失败返回-1,成功返回一个大于等于0的值; 0,1,2是默认打开的; 0:标准输入
1:标准输出
2:标准错误输出 2.write 的介绍 fd:对应打开的文件描述符 buf:写入的文件内容; count:要写入多少个字节; 返回值:ssize_t:实际写入了多少个字节; 3.read: fd:对应打开的文件描述符; buf:把文件内容读取到一块空间buf中; count:期望要读取的字节数; 返回值:ssize_t:实际读取了多少个字节; 4.close的介绍 关闭文件描述符; 5.文件描述符: 文件打开以后,内核给文件的一个编号;(0的整数)
0:标准输入; 1:标准输出; 2:标准错误输出; #include stdio.h #include stdlib.h #include unistd.h int main() { write(1,hello,5); exit(0); } //往屏幕(标准输出)写入hello 5个字节