基础命令
1.ps
- 显示所有进程的详细信息ps -aux
- 列出所有的进程,相比 ps -aux 信息要少一些ps -ef
- ps -ef | grep [所查找的进程]
2.top命令
- 事实显示进程的信息
- 语法:top[-][i][n数字]
- 不显示任何闲置 (idle) 或无用 (zombie) 的进程top -i
- 更数指定次数后,退出top命令top -n数字
基础信息解析:
3.ps tree
将所有的进程以树型结构的方式进行展示:
4.kill
终止进程
eg:kill -9 + 进程号
创建进程:
1.fork
- 成功:返回给父进程是子进程的pid,返回给子进程的是0
- 失败:返回-1,并设置errno
// 创建一个子进程,并打印 Hello fork
#include <stdio.h>
#include <sys/types.h>
#include <unistd.h>
int main(){
pid_t pid = fork();
if(pid==-1){
perror("fork");
return -1;
}
printf("Hello fork.\n");
return 0;
}
为什么出现两次?
- 父进程在子进程打印之前结束,则会回到终端命令后继续执行子进程
- 子进程的打印语句在父进程结束之前执行,则会在回到终端命令前执行完毕
// 创建一个子进程,并打印进程的pid
#include <stdio.h>
#include <sys/types.h>
#include <unistd.h>
int main(){
pid_t pid = fork();
if(pid==-1){
perror("fork");
return -1; }
printf("pid = %d,Hello fork.\n",getpid());
return 0;}
父子进程:
- 父子进程并发执行,子进程从 fork() 函数之后开始执行
- 父子进程的执行顺序由操作系统算法决定的,不是由程序本身决定
- 子进程会拷贝父进程地址空间的内容,包括缓冲区、文件描述符
// 父子进程数据空间拷贝,缓冲区的拷贝
#include <stdio.h>
#include <sys/types.h>
#include <unistd.h>
int main(){
// 标准IO
write(1,"write hello.",12);
// 文件IO自带缓冲区
fputs("fputs hello.",stdout);
// 注意没有换行符,stdout的缓冲区属于行缓冲(在添加\n后就会直接在缓冲区被冲出来)
pid_t pid = fork();
if(pid==-1){
perror("fork");
return -1;
}
printf("pid = %d,Hello fork.\n",getpid());
return 0;
}
文件描述符的拷贝
- 每个进程都会维护一个文件表项,即文件描述符与文件指针的映射表
- 在 Linux 内核中有一个 struct file 结构体来管理所有打开的文件
- 当子进程拷贝了父进程文件描述符后,则会共享文件状态标志与文件偏移量等信息