linux-基础-进程控制

9 篇文章 0 订阅

大纲:
1.进程控制基础
2.进程控制编程基础知识
3.进程通讯概述–初识
一.进程控制的基础
1.概念
进程是一个具有独立功能的程序的一次运动活动
进程是动态的,可以并发,可以异步(发送一个请求,不需要等待返回,随时可以再发送下一个请求,即不需要等待),是独立的
linux进程的结构–代码段, 数据段,堆栈段–存放动态分配内存变量,栈函数的调用
2.进程的三态
这里写图片描述
3.进程的ID(PID)–标识进程的唯一数字
父进程ID(PPID)
启动进程用户ID(UID)
4.进程互斥
任何时候只允许一个进程使用,其他要使用该资源的进程必须等待,直到该资源被当前的进程释放
5.临界资源
操作系统中同一时刻只允许一个进程访问的资源
6.临界区
进程中访问临界资源的那段代码
7.进程同步
一组并发进程按照一定的顺序执行的过程称为进程间的同步,具有同步关系的一组并发进程称为合作进程
8.进程调度
按一定算法,从一组待运行的进程中选出一个来占用cpu
9.进程调度的方式
抢占式 非抢占式
10.进程算法
先来先服从调度
短进程优先
优先级高的优先
时间片轮转
11.死锁
多个进程因竞争资源形成僵局,若无外力,将永远无法向前推进
二.进程控制编程基础知识
1.获取ID

#include<stdio.h>
#include<sys/types.h>
#include<unistd.h>
/*pid_t getpid(void)获取本进程id*/
/*pid_t getppid(void)获取父进程id*/
int main(){
/*main是程序入口函数,首先执行main,void main()和int main(void)不同的是void main>不需要返回值,int main(void)返回值是int类型
()表示传入的参数,()和(void)都表示不需要传入参数*/
    printf("PID=%d\n",getpid());
    printf("PPID=%d\n",getppid());
    return 0;/*表示程序正常退出*/

执行结果:
这里写图片描述
2.进程创建

#include<unistd.h>
#include<stdio.h>
#include<sys/types.h>
/*pid_t fork(void)创建子进程
fork被调用一次返回两次,它可能有两种不同的返回值
(1)在父进程中,fork返回新创建的子进程的PID
(2)在子进程中fork返回0
(3)如果出错fork返回负值*/
main(){
    pid_t pid;
    pid=fork();
    if(pid<0){
        printf("there is error");
    }else if(pid==0){
        printf("this is a child process %d:\n",getpid());
    }else{
        printf("this is a parent process %d:\n",getppid());
    }
}

执行结果:
这里写图片描述
子进程的数据空间,堆栈空间都会从父进程得到一个拷贝,而不是共享,假如父进程中count=0,在子进程中count加1并不影响父进程中count值,父进程count仍为0
3.创建子进程
子进程创建原型:pdi_t vfork(void)
4.fork和vfork之间的区别
(1)fork:子进程拷贝父进程的数据段
vfork:子进程和父进程共享数据段
(2)fork:父子进程执行的次序不确定
vfork:子进程先运行,父进程后运行
5.exec函数
exec属于bash内部命令(builtins commands),在bash下输入man exec可以查看所有的内部命令信息
exec:用被执行的进程替换调用它的进程,启动一个新的程序,替换原来的进程,所以PID不变
fork:创建一个新的进程,产生一个新的PID
exec命令不产生新的子进程。exec命令在执行时会把当前的shell process关闭,然后换到后面的命令继续执行。
http://blog.csdn.net/cyberrusher/article/details/7253385

exec的头文件#include<unistd.h>
1)int execl(const char*path,const char *arg...)
arg1-argn:被执行程序所需要命令行参数,含程序名。以空指针NULL结束
path:被执行程序名及路径
execl("/bin/ls","ls","-al","/etc/passwd",(char*)0);
等价于ls -al /etc/password
2)int execlp(const char*path,const char *arg...)
arg1-argn:被执行程序所需要命令行参数,含程序名。以空指针NULL结束
path:被执行程序不含有路径,将从path环境变量里面查找
execl("ls","ls","-al","/etc/passwd",(char*)0);
3)int execv(const char *path, char *const argv[])
path:别执行程序名,含完整路径
argv[]:被执行程序所需的命令行参数组
char*argv[]={"ls","-l","/etc/passwd",NULL};
execv("/bin/ls",argv);
4)int system(const char* string)
调用fork产生子进程, 由子进程来调用/bin/sh -cstring来执行参数string所代表的参数
system("ls -l /etc/passwd");
5)int execve(const char *path, char *const argv[], char *const envp[]);
返回值:函数执行成功时没有返回值,执行失败时的返回值为-1.
函数说明:execve()用来执行参数filename字符串所代表的文件路径,第二个参数是利用数组指针来传递给执行文件,并且需要以空指针(NULL)结束,最后一个参数则为传递给执行文件的新环境变量数组。

6.进程等待
阻塞该进程,直到子进程退出

#include<sys/types.h>
#include<sys/wait.h>
    pid_t wait(int *status)

wait()会暂时停止目前进程的执行, 直到有信号来到或子进程结束. 如果在调用wait()时子进程已经结束,
则wait()会立即返回子进程结束状态值. 子进程的结束状态值会由参数status 返回, 而子进程的进程识别
码也会一快返回. 如果不在意结束状态值, 则参数 status 可以设成NULL. 子进程的结束状态值请参考
waitpid().返回值:如果执行成功则返回子进程识别码(PID), 如果有错误发生则返回-1. 失败原因存于errno 中

#include<stdlib.h>
#include<unistd.h>
#include<stdio.h>
#include<sys/types.h>
#include<sys/wait.h>
/*pid_t fork(void)创建子进程
fork被调用一次返回两次,它可能有两种不同的返回值
(1)在父进程中,fork返回新创建的子进程的PID
(2)在子进程中fork返回0
(3)如果出错fork返回负值*/
main(){
        pid_t pid;
        int status;
        pid=fork();
        if(pid<0){
                printf("there is error");
        }else if(pid==0){
                printf("this is a child process %d:\n",getpid());
        }else{
                pid=wait(&status);

                printf("this is a parent process %d:,pid=%d\n",getppid(),pid);
        }
}

这里写图片描述

这里写图片描述

这里写图片描述
三.进程通讯概述
1.为什么要进行进程间通讯
1)数据传输:一个进程要将它的数据传给下一个进程
2)资源共享:多个进程进行资源共享
3)通知事件:一个进程要向另一个进程或者一组进程发送消息,通知他们发生了什么事件
4)进程控制:有哪些进程希望控制另一个进程(比如:Debug),此时控制进程希望能够拦截另一个进程的所有操作,并能即使的通知它状态的改变
2.linux使用进程通信方式包括哪些==IPC方式有哪些?
1)信号(single)
2)消息列队
3)管道(pipe)
4)信号量(semaphore)
5)共享内存
6)套接字(socket)
下面我们会具体用一个章节讲述进程通信

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值