Chinaunix首页 | 论坛 | 博客
  • 博客访问: 702241
  • 博文数量: 152
  • 博客积分: 0
  • 博客等级: 民兵
  • 技术积分: 1793
  • 用 户 组: 普通用户
  • 注册时间: 2013-09-12 12:26
个人简介

相信自己,只有不想做的,没有做不到的。

文章分类

全部博文(152)

文章存档

2021年(1)

2015年(2)

2014年(74)

2013年(75)

分类: LINUX

2013-12-16 21:12:20

一 Linux 进程

进程:程序运行时候产生,进程是程序一次执行过程
程序:保存磁盘可执行指令集合

进程组成:代码段,数据段,BSS段,堆,栈,一组寄存器值(PC程序计算器,记录需要执行指令地址)

进程运行需要资源:CPU,内存,时间片

Linux 进程的标识:PID(进程号)
   PPID(父进程)

Linux 用task_struct结构体描述一个进程

struct task_struct
{
 进程所有者
 进程PID,PPID
 存储空间
 ...
}

Linux 进程的类型:
交互进程,批处理进程,守护进程

二 进程命令

A.察看PID,PPID

ps -ef 察看OS所有进程
/proc目录记录进程详细信息

例如:察看一个特定进程

ps -ef | grep 名字或PID号


B.察看进程状态

ps -aux | grep 名字

状态:
R (运行态) ,T(停止态),S(可中断的等待态),D(不可中断的等待态),Z(僵尸态)

C.给进程发信号

kill -信号序号  PID

SIGKILL (9),杀死进程
SIGSTOP (19),停止进程
SIGCONT (18),恢复运行

killall -信号序号 进程名
功能:给所有同名的进程发信号

D.指定进程nice值

nice值[-20,19],nice值越小优先级越高,nice越大优先级越小

(1)进程运行的时候指定优先级
nice -数值 运行的程序
数值如果是负值,表示-nice值

例如:
nice -15 ./while
while程序在运行的时候,进程的nice值为15

nice --15 ./while
while程序在运行的时候,进程的nice值-15

(2)改变已经运行进程nice值

renice 数值 PID

例如:
renice -15 1134
将1134进程的nice值该为-15

renice 10  2234
将2234进程的nice值改为10

三 创建子进程

pid_t fork(void)
功能:创建子进程
返回值:失败返回-1,成功给父进程返回子进程PID,成功子进程返回0

fork创建子进程:拷贝父进程

注意:fork之后,父子进程执行取决于调度算法

僵尸态进程:进程已经死亡,其父进程没有进行收尸处理
孤儿进程  :进程的父进程死亡,进程就会变成孤儿进程,孤儿进程会自动被init收养

注意:父子进程的地址空间是独立

特点:
1.vfork创建子进程和父进程共享同一个地址空间
2.保证子进程先运行,子进程运行结束或者子进程调用exec函数族,父进程才开始运行

如下是一段代码:
1.读写方式打开一个文件,文件不存在创建,文件存在则清空(open)
2.调用fork创建子进程
3.子进程从文件读数据并且打印
4.父进程向文件中写数据,写入的数据从终端输入

int _child_process_read(int fd)
{
 int n;
 int old_offset = 0;
 char buf[1024];

 while(1)
 {
  lseek(fd,old_offset,SEEK_SET);
  n = read(fd,buf,sizeof(buf) - 1);
  buf[n] = '\0';
     
  if(strncmp(buf,"quit",4) == 0)
   break;

  old_offset = lseek(fd,0,SEEK_CUR);

  
  printf("Read %d bytes : %s.\n",n,buf);
 }

 return 0;
}

int child_process_read(int fd,const char *name)
{
 int n;
 char buf[1024];
 
 close(fd);

 if((fd = open(name,O_RDONLY)) < 0)
 {
  fprintf(stderr,"Fail to open %s : %s.\n",name,strerror(errno));
  return -1;
 }

 while(1)
 {
  while((n = read(fd,buf,sizeof(buf) - 1)) == 0);
  buf[n] = '\0';
     
 
  if(strncmp(buf,"quit",4) == 0)
   break;
  
  printf("Read %d bytes : %s.\n",n,buf);
 }

 return 0;
}

int parent_process_write(int fd)
{
 char buf[1024];

 while(1)
 {
  fgets(buf,sizeof(buf),stdin);
  buf[strlen(buf) - 1] = '\0';

  write(fd,buf,strlen(buf));

  if(strncmp(buf,"quit",4) == 0)
   break;
 }

 return 0;
}

//./a.out test.txt
int main(int argc, const char *argv[])
{
 int fd;
 pid_t pid;

 if(argc < 2)
 {
  fprintf(stderr,"Usage : %s argv[1].\n",argv[0]);
  exit(EXIT_FAILURE);
 }

 if((fd = open(argv[1],O_RDWR | O_CREAT | O_TRUNC,0666)) < 0)
 {
  fprintf(stderr,"Fail to open %s : %s.\n",argv[1],strerror(errno));
  return -1;
 }

 if((pid  = fork()) < 0)
 {
  perror("Fail to fork");
  exit(EXIT_FAILURE);
 }

 if(pid == 0)
 {
  child_process_read(fd,argv[1]);
 }

 if(pid > 0)
 {
  parent_process_write(fd);
 }
 
 exit(EXIT_SUCCESS);;
}

阅读(850) | 评论(1) | 转发(0) |
给主人留下些什么吧!~~