定义:
进程是一个具有一定独立功能的程序的一次运行活动,同时也是资源分配的最小单元;
- 程序是放到磁盘的可执行文件
- 进程是指程序执行的实例
进程和程序的区别:
进程是动态的,程序是静态的;
进程是暂时的,程序使长久的;
进程与程序组成不同:进程的组成包括程序、数据和进程控制块(即进程状态信息)
进程与程序的对应关系:通过多次执行,一个程序可对应多个进程;通过调用关系,一个进程可包括多个程序。
Linux进程:
Linux系统是一个多进程的系统,它的进程之间具有并行性、互不干扰等特点。 也就是说,每个进程都是一个独立的运行单位,拥有各自的权利和责任。其中,各个进程都运行在独立的虚拟地址空间,因此,即使一个进程发生异常,它也不会影响到系统中的其他进程。
进程PID:
进程ID(PID):标识进程的唯一数字 父进程的ID(PPID) 启动进程的用户ID(UID)
#include <stdio.h> #include <sys/types.h> #include <unistd.h> int main() { printf("pid : %d\n", getpid()); printf("ppid : %d\n", getppid()); while (1); return 0; }
进程调度:
调度方式:
• 抢占式
• 非抢占式
调度算法:
先来先服务调度算法
短进程优先调度算法
高优先级优先调度算法
★时间片轮转法
进程创建fork:
#include <unistd.h> pid_t fork(void) 功能:创建子进程
fork的奇妙之处在于它被调用一次,却返回两次,它可能有三种不同的返回值:
返回值:
- 0: 子进程
- 子进程ID(大于0):父进程
- -1: 出错
#include <sys/types.h> #include <unistd.h> int main() { pid_t pid; /*此时仅有一个进程*/ pid=fork(); /*此时已经有两个进程在同时运行*/ if(pid<0) printf("error in fork!"); else if(pid==0) printf("I am the child process, ID is %d\n",getpid()); else printf("I am the parent process,ID is %d\n",getpid()); }
vfork:
表头文件: #include<unistd.h>
定义函数: pid_t vfork(void);
函数说明: vfork()会产生一个新的子进程,其子进程会复制父进程的数据与堆栈空间,并继承父进程的用户代码,组代码,环境变量、已打开的文件代码、工作目录和资源限制等。 子进程不会继承父进程的文件锁定和未处理的信号。 注意,Linux不保证子进程会比父进程先执行或晚执行,因此编写程序时要留意死锁或竞争条件的发生。
int main(void) { pid_t pid; int count=0; pid = vfork(); if (0 == pid) { count++; printf( “count = %d\n", count ); exit(1); } else if (pid > 0) { count++; printf( “count = %d\n", count ); } return 0; }
fork VS vfork:
1. fork:子进程拷贝父进程的数据 vfork:子进程与父进程共享数据 2. fork:父、子进程的执行次序不确定 vfork:子进程先运行,父进程后运行
exec函数:
#include<unistd.h>
int execl(const char * path,const char * arg1, ...)
参数: path:被执行程序名(含完整路径)。
arg1 – argn: 被执行程序所需的命令行参数,含程序名。以空指针(NULL)结束。
#include <unistd.h> int main() { char * argv[ ]={“ls”,”-l”,”/etc/passwd”,(char*)0}; execv(“/bin/ls”,argv); }
进程等待wait函数:
#include <sys/types.h> #include <sys/wait.h> pid_t wait (int * status) 功能:阻塞该进程,直到其某个子进程退出。
#include <sys/types.h> #include <sys/wait.h> #include <unistd.h> #include <stdlib.h> int main() { pid_t pc,pr; pc = fork(); if(pc == 0){ printf(“This is child process with pid of %d\n”,getpid()); sleep(10); /* 睡眠10秒钟 */ } else if(pc > 0){ pr=wait(NULL); /* 等待 */ printf("I catched a child process with pid of %d\n"),pr); } exit(0); }
Linux的进程控制的初步学习
最新推荐文章于 2024-04-06 17:31:08 发布