进程的优缺点
优点:
对用户来说,操作系统会变得更加健壮(一个进程无法破坏另一个进程或操作系统的运行)
对于开发者来说,更容易进行内存的读取和写入
缺点:
多任务实现开销比较大
编写能够与其他进程通信或者能够对其他进程操作的应用程序将要困难的多
wait函数族
1,wait函数:将当前进程挂起,等待信号来临,再继续运行;用来等待子进程的结束
pid_t wait(int *wstatus);
#include <sys/types.h>
#include <sys/wait.h>
#include <sys/types.h>
#include <sys/wait.h>
#include"stdio.h"
#include"stdlib.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");
exit(1);
}
else
{
pid = wait(&status);
printf("father\n");
}
}
WEXITSTATUS宏定义:返回子进程的退出状态
2,waitpid:它可以指定等待的进程号
pid_t waitpid(pid_t pid, int *wstatus, int options);
#include <sys/types.h>
#include <sys/wait.h>
#include"stdio.h"
#include"stdlib.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 pid=%d\n",getpid());
exit(5);
}
else
{
pid = waitpid(pid,&status, 0);
i=WEXITSTATUS(status);
printf("father pid= %d,%d\n",pid,i);
}
}
僵尸进程的产生
#include "stdio.h"
#include "stdlib.h"
#include "unistd.h"
#include "sys/types.h"
#include "sys/wait.h"
#include "time.h"
int main()
{
if(!fork())
{
printf("child\n");
exit(1);
}
sleep(60);
printf("father\n");
exit(0);
}
产生的原因:当进程走完自己的生命周期之后,会执行自己的系统调用exit函数,然后内存被释放,没有执行代码。但是在进程表里仍留下(pid,退出信息),直到父进程将他们回收。
子进程的资源是父进程回收的。
僵尸进程应该尽量避免
避免僵尸进程的方法:在父进程里面调用waitpid,让父进程先死就可以