什么进程?
- Linux中事务管理的基本单元 代表资源的总和
进程的属性
- 独立性,每个进程都是独立的资源集合
内核中进程的结构体(0.1版本)
struct task_struct{
/* these are hardcoded - don't touch*/
long stat; //进程的运行状态 (-1 unrunnable ,1 runnable , 0 stopped)
long counter; //进程的执行时间片,表示当前进程能够占用CPU资源的时间
long signal; //信号量位图32bit每一个bit来表示一个信号
struct sigaction sigaction[32]; //信号量
long blocked; //信号掩码
/* various fields*/
int exit_code; //退出码
unsigned long start_code,end_code,end_data,brk,start_stack; //当前进程的内存使用信息
long pid,father,pgrp,session,leader; //pid
unsigned short uid,euid,suid; //进程的用户ID,进程的有效ID,进程的超级ID
unsigned short gid,egid,sgid; //进程组ID,进程的有效组ID,进程的超级组ID
long alarm; //进程的警告标志
long utime,stime,cutime,cstime,start_time; //有关进程的用户时间,系统时间当前用户时间等
unsigned short used_math; //是否使用协处理器
/*file system info*/
int tty; //当前进程是否占用控制台
unsigned short umask; //用户的掩码
struct m_inode * pwd; //路径
struct m_inode * root; //根目录
struct m_inode * excutable; // 执行位图
unsigned long close_on_exec; // 执行结束后关闭位图
struct file * fds[NUMFD]; //当前进程的文件列表FD在这个数组中找到一个file结构体
struct desc_struct ldt[3];
struct tss_struct tss;
}
进程状态
define TASK_RUNNING 0 运行状态
define TASK_INTERRUPTIBLE 1 可中断睡眠状态
define TASK_UNINTERRUPTIBLE 2 不可中断睡眠状态(应用层不存在)
define TASK_STOPPED 4 停止状态
define TASK_ZOMBIE 8 僵死状态
TASK_RUNNING : 运行状态
define TASK_INTERRUPTIBLE: 可中断睡眠状态 (比如说 read ,accept等阻塞状态不浪费系统CPU资源,会被信号所打断)
TASK_UNINTERRUPTIBLE: 不可中断睡眠状态(应用层不存在)
TASK_STOPPED: 停止状态
TASK_ZOMBIE: 僵死状态
进程基本属性
进程号
pid_t getpid(void); //获取当前进程的pid
#include<stdio.h>
#include<unistd.h>
int main(int argc,char *argv[])
{
printf("the current program's pid is %d\n",getpid());
return 0;
}
pid_t getppid(void); //获取当前父进程的pid
#include<stdio.h>
#include<unistd.h>
int main(int argc,char *argv[])
{
printf("the current program's ppid is %d\n",getppid());
return 0;
}
getpgid(); //获取当前进程的组的pid
#include<stdio.h>
#include<unistd.h>
int main(int argc,char *argv[])
{
int i;
printf("\tpid\t ppid \t pgid\n");
printf("parent\t%d\t%d\t%d\n",getpid(),getppid(),getpgid(0));
for(i=0;i<2;i++)
if(fork()==0)
printf("child\t%d\t%d\t%d\n",getpid(),getppid(),getpgid(0));
return 0;
}
用户号
pid_t getpgid(pid_t pid); //获取进程组ID
int setuid(uid_t uid); //临时将该进程设置为文件拥有权限
#include<stdio.h>
#include<stdlib.h>
#include<unistd.h>
int main()
{
int uid,euid,suid;
getresuid(&uid,&euid,&suid);
printf("uid=%d,euid=%d,suid=%d\n",uid,euid,suid);
printf("after setuid(501)\n");
printf("return=%d\n",setuid(501));
uid=-1;euid=-1;suid=-1;
getresuid(&uid,&euid,&suid);
printf("uid=%d,euid=%d,suid=%d\n",uid,euid,suid);
return 0;
}
会话号
pid_t getsid(pid_t pid); //获取当前进程的会话号
setsid(void); //设置当前进程的会话号
控制终端
一个会话可以有一个控制终端,控制进程就是打开终端的进程终端发送的信号,只有前台进程组的进程会收到,后台不处理
进程创建
pid_t fork(void);
返回值 >0 : 父进程
返回值 =0 :子进程
返回值小于0 : 创建进程出错