1. 多进程的优缺点
木马病毒:通过侵入用户的内核,获得对进程的调度权
多进程的优缺点:
- 优点:
1、对用户来说,操作系统更加健壮(因为一个进程无法破坏另一个进程或操作系统的运行,进程之间相互独立)
2、对开发者来说,更容易进行内存的读取和写入(因为进程有独立的内存) - 缺点:
1、多任务实现开销大,效率低
2、编写能够与其他进程通信或能够对其他进程操作的应用程序将要困难的多
2. wait函数族
- wait函数:将当前进程挂起,等待信号来临,在继续运行;用来等待子进程的结束。
pid_t wait(int *wstatus);
WEXITSTATUS(宏定义):是用来返回子进程退出状态
题外话:宏函数(宏定义)
优点:1、执行效率高 2、节省空间
与普通函数的区别:
1、编译效率更高
代码如下:
#include <stdio.h>
#include <stdlib.h>
#include <sys/types.h>
#include <sys/wait.h>
#include <unistd.h>
int main()
{
int i = 0;
int status;
pid_t pid = fork();
if(-1 == pid)
{
perror("fork error!");
exit(1);
}
if(0 == pid)
{
printf("child\n");
}
else
{
pid = wait(&status); //wait()发生在父进程中,等待子进程结束
printf("father\n");
}
}
运行结果如下:子进程先执行,执行结束后,父进程再执行。
- waitpid:可以指定等待的进程号
pid_t waitpid(pid_t pid, int *wstatus, int options);
作用:1、防止资源浪费
2、有时候不需要很多wait()函数,所以可以用waitpid()来等待指定的进程
举例说明,代码如下:
#include <stdio.h>
#include <stdlib.h>
#include <sys/types.h>
#include <sys/wait.h>
#include <unistd.h>
int main()
{
int status;
pid_t pid = fork();
if(-1 == pid)
{
perror("fork error!\n");
exit(1);
}
if(0 == pid)
{
printf("child\n");
exit(3);
}
else
{
pid = waitpid(pid, &status, 0);
printf("father\n%d\n",WEXITSTATUS(status));
}
}
运行结果如下:
- 僵尸进程
- 僵尸进程产生的原因:当进程走完自己的生命周期之后,会执行自己的系统调用exit(9)函数,然后内存被释放,没有执行代码。但是在进程表里面仍留下进程信息(pid,退出信息),直到父进程将他们回收。
(僵尸进程的存在会占用资源,如果占用资源过多,使得进程表满了,会造成操作系统崩溃。所以僵尸进程应该尽量避免!!!) - 如何避免僵尸进程:wait函数族
在进程表中黄色字体"1 zombie"说明有1个僵尸进程。
用ps -ef命令后,显示出僵尸进程