一,基本概念
1.定义
进程是操作系统资源分配的基本单位,是运行种的程序。
2.进程构成
分为三部分:代码段,数据段,堆栈段。
代码段:存储可执行代码。
数据段:存放全局变量,变量,静态变量
堆:存放动态分配的内存变量
栈:用于函数调用,存放函数参数,内部定义的局部变量。
3.用于进程控制的系统调用
fork,exit,exec,wait,getpid,nice.
二,应用
1.进程创建
两种方式:系统创建,父进程创建。例如 系统开机启动创建的init进程.
父进程创建有两种方法:fork()和vfork()。
1>fork(),vfork()
fork创建进程,创建成功会返回两个值,父进程会返回一个数,这个数为子进程的进程ID;子进程返回0,表示进程创建成功。创建失败返回-1.fork()创建之后父子进程谁先运行是系统随机的系统.
vfork创建进程,子进程共享父进程的地址空间(创建相比fork速率高),创建后先保证子进程先运行,父进程挂起等待。
创建实例:
#include
#include
#include
#include
int main(void)
{
pid_t pid;
pid=fork();
switch(pid)
{
case 0:
printf("child process is running,process,curpid is %d,parent's ID is %d\n",pid,getpid());
break;
case -1:
perror("process creat error!");
break;
default:
printf("parents process is running,child's ID is %d,parents's ID is %d\n",pid,getppid());
}
exit(0);
}
2>.父子进程关系
子进程完全复制父进程的资源。子进程继承父进程的大部分属性。
3>守护进程
在后台运行的,没有控制终端与之相连的进程。
创建方法:
1.创建一个进程并让其后台执行(先fork再exit父进程);
2.调用 setsid创建一个新对话期,使进程脱离控制终端;
3.禁止进程重新打开终端(fork进程再exit父进程);
4.关闭不再需要的文件描述符(for(i=0;i 5.将当前目录切换为根目录(chdir("/"));
6.将文件创建时使用的屏蔽字置零(umask(0));
7.处理signal信号(signal(SIGCHLD,SIG_IGN)).
4>进程退出
正常推出:exit(带参数,先执行一些清除操作,将控制权交还给内核),_exit(立即将控制权交给内核),return(返回至调用函数)
异常推出:about,收到某个信号。
5>执行新程序
exec
调用exec执行另外一个程序
exec(const char *path,char *const argv[],char *const envp[]);
例子:
int main(int argc,char *argv[],char **environ)
.....
exec("program name",argv,environ)
.....
6>等待程序结束
wait
如果子进程先于父进程结束,且父进程没有调用 waitpid或wait函数等待子进程结束,则子进程会变为僵尸进程。
7>获取进程ID
getpid() 获取当前进程ID
getppid() 获取父进程ID
8>设置用户ID和有效用户ID
setuid和setgid
9>改变进程优先级
nice
阅读(309) | 评论(1) | 转发(0) |