一、进程的管理
1、什么是进程?
进程是程序运行的一个实例。
PCB(进程控制块)
pid:进程号
2、Linux进程的组织管理方式
在linux操作系统中,所有的用户进程组成了一棵树,进程和进程之间的关系是父子关系,或兄弟关系。
tarena@tarena-virtual-machine:~$ pstree
init─┬─NetworkManager─┬─dhclient
│ ├─dnsmasq
│ └─2*[{NetworkManager}]
├─accounts-daemon───{accounts-daemon}
├─acpid
├─atd
├─avahi-daemon───avahi-daemon
init 1号进程 是进程树的树根
pstree (命令) :列出所有用户进程
ps –aux (命令):查看当前进程的详细信息
3、怎么获取进程的pid ?
getpid (2)系统调用:系统调用是用内核来提供服务
#include<sys/types.h>
#include<unistd.h>
pid_tgetpid(void);
pid_tgetppid(void);
功能:获取进程的进程号
参数:
返回值:
举例:pid.c
1#include<stdio.h>
2#include<sys/types.h>
3#include<sys/unistd.h>
4int main(void){
5 pid_t pid;
6 pid=getpid();
7 printf("pid=%d\n",pid);
8 getchar();
9 return 0;
10 }
tarena@tarena-virtual-machine:~$ gcc pid.c
tarena@tarena-virtual-machine:~$ ./a.out
pid=3154
tarena@tarena-virtual-machine:~$ ps -aux
tarena@tarena-virtual-machine:~$ gcc pid.c-E -o getpid.i (查看typedefine pid_t的类型)
tarena@tarena-virtual-machine:~$ pstree
├─gnome-terminal─┬─bash───pstree
│ ├─bash───a.out
bash是pstree和a.out的父进程
4、创建一个子进程
fork (2)
#include<unistd.h>
pid_tfork(void);
功能:创建一个子进程
返回值:
在父进程中,子进程的pid被返回
在子进程中,0被返回
-1代表fork系统调用失败。errno被设置
注意:当fork调用结束时,内核就已经有两个进程(父与子),两个PCB
两个进程都运行这个程序往下走,先执行父进程还是子进程不一定
fork 执行后,父进程和子进程执行同一段代码
子进程还是父进程先执行是异步的。(谁先谁后执行不确定,系统调用决定)
举例:fork.c
1 #include<stdio.h>
2#include<unistd.h>
3int main(){
4 pid_t pid;
5 pid=fork();//此时,已经有两个进程
6 if(pid<0){ //创建子进程失败
7 perror("fork");
8 return 1;
9 }
10 if(pid= =0){// 子进程创建成功
11 printf("pid=%d\n",getpid());//打印子进程的pid
12 }
13 else{//如果不加else父进程和子进程都执行下一条语句,加上后只有父进程执行
14 printf("mypid=%d\n",getpid());//父进程的pid
15 }
16 return 0;
17 }
tarena@tarena-virtual-machine:~$ ./a.out
mypid=3227