进程结构体task_struct
进程状态
define TASK_RUNNING 0 运行状态
define TASK_INTERRUPTIBLE 1 可以被信号中断睡眠
define TASK_UNINTERRUPTIBLE 2 不可以被信号中断睡眠
define TASK_STOPPED 4 停止状态
define TASK_ZOMBIE 8 将死状态
进程基本属性
进程号
pid_t getpid(void);
pid_t getppid(void);
getpgid();获取父进程组id号
getresuid(&uid,&euid,&suid);
用户号
pid_t getpgid(pid_t pid);
int setuid(uid_t uid);
euid(有效用户id) uid(创建者id)suid(set以后的id)
root用户下:chmod u+s bd文件
普通用户下:使用bd文件是root权限
会话号
pid_t getsid(pid_t pid)
setsid(void)
控制终端
进程创建
vfork() 开一个轻量进程 相当于线程,共享主线程代码段 数据段
execve(/bin/sh) 启动一个程序
execl(/bin/sh,sh,ls,-l,-a,null) 相当于/bin/sh ls -l -a
execlp(sh,sh,ls,-l,-a)
execle(/bin/sh,sh,ls,-l,-a,env); 多了一个环境变量
execv(/bin/sh,argv[]);数组行驶传入参数
回收进程资源
on_exit(void (* funtion)(int stat,void *));//绑定一个退出函数,在执行exit时,调用这个函数
pid_t ret = waitpid(pid,&status,time); //status子进程退出吗 time =0 一直等待 =1 不等待
pid >0 指定进程 =-1 表示等待任意子进程结束 =0和自己进程id一样的进程结束 >-1gpid组中任意一个进程结束
WIFEXITED(statue)&ret == pid 判断退出码
守护进程
守护进程例子
#include "stdio.h"
#include "stdlib.h"
#include "signal.h"
#include "unistd.h"
#include <fcntl.h>
#include <sys/types.h>
#include <sys/stat.h>
void creat_daemon()
{
int i ,fd;
pid_t id;
struct sigaction sa;
umask(0);//第一步,将文件模式创建屏蔽字设置为0
if((id = fork())<0)
{
printf("(fork error!)\n");
return;
}
else if(id!=0){
exit(0);//第二部,父进程退出,子进程不退出
}
setsid();//第三部,设置新会话
sa.sa_handler = SIG_IGN;
sigemptyset(&sa.sa_mask);
sa.sa_flags = 0;
if(sigaction(SIGCHLD,&sa,NULL)<0){
//注册子进程退出忽略信号
return;
}
if((fd= fork())<0){
printf("fork 2 error!\n");
return;
}
else if(fd!=0){
exit(0);
}
//守护进程空间
if(chdir("/")<0){
printf("child dir error\n");
return;
}
close(0);
fd = open("/dev/null",O_RDWR);//关闭标准输入,重定向所有输入输出错误到/dev/null上
dup2(fd,1);
dup2(fd,2);
}
int main(){
creat_daemon();
while(1){
sleep(1);
}
return 0;
}