`

进程控制学习笔记一

 
阅读更多

进程控制
进程的定义:
进程是一个程序的一次执行的过程,同时也是资源分配的最小单元
进程的特点:动态性、并发性、独立性、异步性
进程的状态:
1 就绪、阻塞、执行
2 TASK_RUNNING(运行)
TASK_INTERRUPTIBLE(可中断)
TASK_UNINTERRUPTIBLE(不可中断)
TASK_ZOMBIE(僵死)
TASK_STOPPED(停止)


进程id
进程id(pid) 标识进程的唯一数字
父进程id(ppid)
启动进程的用户id(uid)


进程开互斥
当有若干进程都要使用某一共享资源时,任何时刻最多允许一个进程使用,其他要
使用该资源的进程必须等待,直到占用该资源者释放了该资源为止




临界资源
一次只允许一个进程访问的资源称为临界资源

临界区
访问临界资源的那段程序代码称为临界区


进程的同步
一组并发进程按一定的顺序执行的过程


进程调度
按一定算法从一组待运行的进程中选出一个来占有cpu运行
调度方式:抢占式、非抢占式


调度算法
先来先服务
短进程优先
高优先级优先
时间片轮转法


死锁
多个进程因竞争资源而形成的一种僵局,进程不能向前推进


进程控制编程


获取id
getpid()


#include <unistd.h>
pid_t getpid(void)
获取父进程序id
pid_t getppid(void)




进程创建
#include <unistd.h>
pid_t fork(void)
三种不同的返回值
在父进程中,返回子进程的pid
在子进程中,返回0
如果出现错误,返回一个负值




示例代码如下:
#include <unistd.h>
#include <stdio.h>


int main(void){
pid_t pid;
int count=0;
pid=fork;
printf("count=%d\n",count);
return 0;
}
运行结果:
count=1
count=1


子进程的数据空间、堆栈空间都会从父进程得到一个拷贝

#include <sys/types.h>
#include <unistd.h>
pid_t vfork(void)


fork和vfork的区别
1 fork 子进程拷贝父进程的数据段
vfork 子进程与父进程共享数据段
2 fork 父子进程的执行顺序不确定
vfork 子进程先运行,父进程后运行


exec函数族
exec用被执行的程序替换调用它的程序
与fork的区别:
fork是创建一个新的进程,产生一个新的pid
exec启动一个新程序,替换原有的进程,此进程的pid不会改变






#include <unistd.h>
int execl(const char *path,const char *arg1,...)
用来执行path字符串所代表的文件路径
arg1:被执行程序所需的命令行参数,含程序名,以空指针结束


示例代码如下:
#include <unistd.h>
main(){
execl("/bin/ls","ls","-al","/etc/passwd",(char *)0);
}






#include <unistd.h>
int execlp(const char *path,const char *arg1,...)
path:被执行程序名(不含路径名,将从path环境变量中查找该程序)
arg1:被执行程序所需的命令行参数,含程序名,以空指针结束
示例代码如下:
#include <unistd.h>
main(){
execl("ls","ls","-al","/etc/passwd",(char *)0);
}




#include <unistd.h>
int execv(const char *path,char *const argv[])
path:被执行程序名(含完整路径)
argv[]:被执行程序所需的命令行参数数组


#include <unistd.h>
main(){
char *argv[]={"ls","-al","/etc/passwd",(char *)0};
execl("/bin/ls",argv);
}




#include <unistd.h>
int execvp(const char *file,char *const argv[])




#include <stdlib.h>
int system(const char *string)
调用fork产生子进程,由子进程来调用/bin/sh -c string 来执行参数string所代表的命令
示例代码如下:
#include <unistd.h>
main(){
system("ls -al /etc/passwd");
}




进程等待
#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>


void 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 进程控制阅读笔记

    本阅读笔记将深入探讨Linux进程的创建、进程控制以及守护进程的实现。 首先,让我们了解一下Linux中的进程创建。在Linux中,最常用的创建新进程的方式是使用`fork()`系统调用。`fork()`会创建一个与父进程几乎完全...

    数据仓库学习笔记

    数据仓库学习笔记中提到,决策支持系统(DSS)处理是一个漫长而复杂的演化进程的结果,而且它仍在继续演化。DSS 处理的起源可以追溯到计算机发展的初期。数据仓库学习笔记还提到,决策支持系统的发展可以分为几个...

    Linux 进程 线程学习笔记

    子进程继承了父进程的数据段、堆和栈,但拥有独立的进程控制块(PCB)。在子进程中,`fork()` 的返回值为0;在父进程中,返回的是子进程的PID。这使得程序能够根据返回值区分父子进程并执行不同的代码路径。 示例...

    操作系统学习笔记

    综上所述,这份学习笔记全面覆盖了操作系统的核心概念,从底层的保护模式编程到高层的进程管理和系统调用,对于想要深入理解操作系统的初学者来说是一份宝贵的资源。通过阅读和理解这些文档,不仅可以掌握操作系统的...

    VHDL语言学习笔记

    在学习笔记中,可能会包含一些典型的设计实例,如七段显示驱动器、UART串口控制器、简单的数字信号处理器等,帮助理解VHDL的实际应用。 8. **库和标准包** VHDL标准库包括IEEE库,其中的std_logic_1164库提供了...

    linux学习笔记:进程

    在Linux操作系统中,进程是系统资源分配的基本单位。学习Linux的进程管理对于理解和操作系统的运行至关重要。本篇笔记主要探讨了以下几...在实际操作中,这些知识点可用于进程控制、进程通信、信号处理以及调试等场景。

    go学习笔记 第四版(书签版)

    标题:“Go学习笔记 第四版(书签版)”表明这是一份关于Go语言(又称Golang,是由Google开发的一种静态强类型、编译型、并发型,并具有垃圾回收功能的编程语言)的学习资料,这份资料已经更新到了第四版,并且特地...

    学习笔记信号量和进程间通信

    本学习笔记将深入探讨信号量和进程间通信的相关概念、原理以及实际应用。 首先,让我们理解什么是进程。进程是程序执行的实例,拥有独立的内存空间和系统资源,它们在操作系统中并行运行。在多进程环境中,为了协调...

    contiki 学习笔记.pdf

    Contiki是一款非常适合于内存资源非常有限的嵌入式系统的操作系统,它...通过阅读Contiki的学习笔记和官方文档,结合实际开发经验,可以有效地掌握Contiki操作系统的原理和编程方法,为物联网应用开发打下坚实的基础。

    Oracle学习笔记.pdf

    Oracle是世界上最广泛使用的数据库管理系统之一,它提供了丰富的功能和组件,包括数据存储、查询优化、安全性、并发控制等。以下是对Oracle学习笔记中提到的一些关键知识点的详细解释: 1. **SQL执行顺序**: SQL...

    学习笔记.md

    ### JavaWeb 学习笔记知识点总结 #### Spring Boot 和 Spring MVC 的区别 1. **Spring MVC**: - **定位**:Spring MVC 是 Spring 框架中的一个重要组成部分,主要用于构建 Web 应用程序。 - **作用**:提供了一...

    达内java学习笔记全套

    这部分笔记可能会包括文件管理、进程控制、权限设置、管道与重定向、正则表达式等内容。通过学习Unix,开发者可以更高效地进行开发和调试工作。 2. **SQL note**: SQL(结构化查询语言)是用于管理关系型数据库的...

    Linux学习笔记——入门资料

    Linux学习笔记——入门资料 Linux,作为一款开源、免费的操作系统,因其稳定性和安全性而备受开发者和系统管理员的青睐。这份“Linux学习笔记”旨在帮助初学者快速掌握Linux的基础知识和操作技能,从而轻松入门。 ...

    谭浩强C语言学习笔记

    这是一本关于C语言的学习笔记,涵盖了从基本概念到高级应用的所有方面。下面是从中提取的重要知识点: 一、C语言概述 * C语言的历史和发展 * C语言的特点:结构化、模块化、可移植性、高效性 * C语言的应用领域:...

    成功之路Oracle11g学习笔记

    《成功之路Oracle11g学习笔记》是一本专为初学者设计的Oracle数据库学习资源,旨在帮助读者系统地掌握Oracle11g的基础知识。Oracle11g是Oracle公司推出的一个重要版本,它提供了许多增强的功能和优化,使得数据库...

    JVM学习笔记(一)

    本篇学习笔记主要介绍如何利用一系列工具来查看和监控JVM的各种运行时信息,包括但不限于JVM进程与参数查看、垃圾收集信息、JVM锁信息等内容。 #### 二、查看JVM进程及参数 ##### 1. JPS - **用途**:列出主机上...

    Linux学习笔记-超全总结值得一看(带标签目录)- 154页.pdf

    【Linux学习笔记】这篇超全总结涵盖了Linux操作系统的基础知识,特别是关于命令行的使用和快捷键,以及一些桌面环境下的快捷操作。以下是笔记中的主要内容: 1. **LINUX常用操作命令**: - `clear`:清空终端屏幕...

    软考中级网络工程师学习笔记(考点归纳总结全).pdf

    软考中级网络工程师学习笔记 本资源摘要信息涵盖了软考中级网络工程师学习笔记的主要内容,包括电脑基础知识、操作系统、嵌入式系统、数据通信基础等方面。 一、电脑基础知识 1. 硬件系统:包括中央处理器(CPU)...

    JAVA 多线程学习笔记

    这篇学习笔记将深入探讨Java多线程的核心概念、实现方式以及相关工具的使用。 一、多线程基础 1. 线程与进程:在操作系统中,进程是资源分配的基本单位,而线程是程序执行的基本单位。每个进程至少有一个主线程,...

Global site tag (gtag.js) - Google Analytics