1.如何在Linux中查看
ps-ef 查看所有进程及其PID(进程号),系统时间等等。
进阶:除了可显示-ef所有内容外,还可显示CPU及其内存占用率,进程状态
top:动态显示系统中运行的程序
pstree :以树形方式显示系统中的进程
kill :输出特定的信号给指定PID的进程
kill -l 查看所有可用的信号名称
程序和进程的区别:
程序是静态的
进程是动态的,进程是程序执行和资源管理的最小单位
每个进程都有1G内核空间和3G用户空间
进程的分类
1:交互式进程2.批处理进程3.守护进程
进程的状态
1.运行态2.等待态3.停止态4.死亡态5.僵尸态
进程中的优先级
-20到19,值越大,优先级越低,普通用户设置优先级最大为0。
修改优先级:
nice 按用户指定的优先级运行进程
renice 改变正在运行进程的优先级
1.创建进程
fork()函数
返回值为0:子进程 >0:父进程 -1:出错
pid_t getpid(void);获得进程的id号
pid_t getppid(void);获得父进程的id号
vfork()函数
为了提高效率,vfork也创建新进程,但不产生父进程的副本
虽然vfork()不产生父进程的副本,进程间很多东西是共享的
vfork()保证了子进程先执行,且子进程要exit()之后,父进程才开始执行
3.fork()和vfork()区别
1. fork():子进程拷贝父进程的数据段,代码段。vfork():子进程与父进程共享数据段。
2. fork():父子进程的执行次序不确定。 vfork():保证子进程先运行,在调用exec或_exit之前与父进程数据是共享的,在它调用exec或_exit之后父进程才可能被调度运行。
3. vfork()保证子进程先运行,在它调用exec或_exit之后父进程才可能被调度运行。如果在调用这两个函数之前子进程依赖于父进程的进一步动作,则会导致死锁。当需要改变共享数据段中变量的值,则拷贝父进程
进程的退出:
exit()和-exit()
exit()自带清理缓冲区
-exit()不清理缓冲区
fflush()刷新缓冲区
回收内核资源
wait()阻塞等待子进程结束回收资源(子进程不结束,父进程永远不能执行)
waitpid() 回收子进程资源
参数1:pid=-1 等待任意一个子进程退出,此时和wait()作用一样
参数2:status(NULL):同wait一样(NULL)
不为空,可以保存子进程退出时的状态
参数3:
0同wait()一样,阻塞父进程等待子进程退出
WNOHANG:表示非阻塞等待,若无子进程退出,返回值0,有的话返回子进程号
wait(NULL)==waitpid(-1,NULL,0)
阻塞等待任意一个子进程退出,忽略子进程的退出状态
waitpid(-1,NULL,WNOHANG):非阻塞等待任意一个子进程退出,若无子进程返回值为0
若有子进程,返回值是退出的子进程号
父子进程:
(1).fork成功之后,分为父进程(pid>0)和子进程(pid==0),子进程几乎是父进程的完全复制,子进程独有进程号,资源使用和计时器等。(2)父子进程谁先运行?看内核调度,不确定
(3)能否多次调用fork()?可以,每调用一次,创建一个子进程(4)父进程先退出,子进程未结束,子进程称为孤儿进程,被system的进程收养(5)子进程先退出,父进程未结束,并且父进程没有回收子进程的资源,子进程称为僵尸进程
守护进程(Daemon进程)
1.守护进程的特点:
1.守护进程是Linux中三大进程之一,始终运行在后台,通常系统开启时运行,系统关闭后结束
2.独立于控制终端(与终端无关)
3.周期性执行某种任务或等待某些发生的事件。
创建守护进程
1.创建子进程,父进程退出(子进程成为后台进程)
if(fork()>0)
{
exit(0);
}
2.设置新的会话
if(setsid()<0)
{
perror("setsid error");
return -1;
}
3.设置工作目录
chdir("/tmp");
4.修改文件掩码
umask(0);
5.关闭从父进程继承下来的文件描述符
int i=0;
for(i=0;i<getdtablesize();i++)
{
close(i);
}