什么是程序?
编译好的二进制文件。
什么是进程?
- 运行着的程序,空间上的概念。
- 程序员的角度:运行一系列指令的过程
- 操作系统的角度:分配系统资源的基本单位
程序与进程有何区别?
- 程序占用的是磁盘,不占用系统资源
- 内存占用系统资源
- 一个程序可以有多个进程,但是一个进程只能对应一个程序
- 程序没有声明周期,进程有声明周期
fork()函数
- 依赖的头文件
#include <unistd.h>
- 函数定义
pid_t fork(void);
fork()函数作用
在32位系统中,子进程复制父进程的0到3G空间和父进程内核中的PCB,但id号不同,同时fork调用一次返回两次。
fork()函数特点:
- 父进程中返回子进程ID
- 子进程中返回0
- 读时共享,写时复制
fork()函数原理图
获取进程ID函数
//当前进程id
pid_t getpid(void);
//父进程id
pid_t getppid(void);
Linux控制命令
ps 查看进程信息
ps aux
ps ajx---可以追述进程之间的血缘关系
kill 命令
- 给进程发送一个信号
- SIGKILL 9号信号,强制杀死
- kill -SIGKILL pid---杀死进程
fork()函数小案例
#include <stdio.h>
#include <unistd.h>
#include <sys/stat.h>
#include <sys/types.h>
#include <sys/wait.h>
#include <fcntl.h>
#include <time.h>
#include <string.h>
#include <pwd.h>
#include<sys/types.h>
void test_fork()
{
printf("Begin...\n");
pid_t pid = fork();
if (pid < 0)
{
perror("fork err");
exit(1);
}
if (pid == 0)
{
printf("i am child, pid = %d, ppid = %d\n", getpid(), getppid());
while (1)
{
printf("i am child\n");
sleep(1);
}
}
else if(pid > 0)
{
printf("i am parent, childpid = %d, self = %d, ppid = %d\n", pid, getpid(), getppid());
while (1)
{
sleep(1);
}
}
printf("End...\n");
}
int main()
{
test_fork();
return 0;
}