Linux进程与task_struct详解

什么进程?

  • 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 : 创建进程出错

猜你喜欢

转载自blog.csdn.net/weixin_45309916/article/details/107580766