相信自己,只有不想做的,没有做不到的。
分类: 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);;
}