Linux的进程和进程间通信 操作系统课件

合集下载

7-linux进程管理ppt课件

7-linux进程管理ppt课件
ppt精选
5、nice 功能:指定程序运行的优先级 格式: nice –n command 参数: -n //将原有优先级加n 优先级范围:-20~19(值越小表示优先级别越高,缺省进 程的优先级为0) 实例: #nice -5 ls //将ls优先序加5 #nice - - 5 vi& //优先级为-5
参数:
• -a //显示所有进程(不包括没有终端的进程)
• -u //显示用户名和启动时间
• -x //显示没有终端的进程
• -e //显示所有进程(不显示进程状态)
实例:
• # ps
//显示当前用户进程
• # ps –aux
//显示所有进程信息
ppt精选
# ps –aux USER PID %cpu %mem vsz rss tty stat start time command
3、kill 功能:终止进程 格式:kill -9 PID 实例: • # kill -9 3 • # kill -9 3 5 8
//一次杀死3,5,8多个进程
ppt精选
4、killall 功能:终止指定程序名的所有进程 格式: killall -9 程序名 实例: #killall -9 vsftpd //杀死所有对应vsftpd程序的进程
ppt精选
1. 把当前时间改为2008年8月8日16点30分30秒; 2. 利用at设置一个任务自动化,在当天17:00钟,在根目录
下自动创建一个abc目录,并进入到abc目录中,建立一个 空的文件test,同时对该文件进行打包成test.tar; 3. 让该系统在每周的1、3、5下午17:30自动关闭该系统; 4. 在该系统在每月的16号自动启动smb服务;

linux程序设计课件 第7章-进程间的通信

linux程序设计课件 第7章-进程间的通信
第7章 进程间的通信
本章重点
1. 进程通信中信号的概念及信号处理。 2. 进程间的管道通信编程。 3. 进程间的内存共享编程。 4. 进程间队列通信编程。
2
进程之间要交换数据必须通过内核,在内核中开辟一块缓冲区, P1进程把数据从用户空间拷到内核缓冲区,P2进程再从内核缓冲区把 数据读走,如图7.1所示。内核提供的这种机制称为进程间通信(IPC, InterProcess Communication)。
例7.2 下列程序应用函数alarm(10)在运行10秒后发送信号 SIGALARM,程序接收到SIGALARM信号就被终止。
7-2源程序
[root@localhost root]# ./7-2
正在计数中:0 正在计数中:1 ........ 正在计数中:905 闹钟
11
7.2 信 号
例7.3 设计一个程序,要求用户进程创建一个子进程,父进程向子进 程发出SIGKILL信号,子进程收到此信号,结束子进程的运行。
24
7.3.1 无名管道操作
管道允许在进程之间按先进先出的方式传送数据, 是进程间通信的一种常见的方式。 例如: [root@localhost root]# ls | more
无名管道操作时,建立管道用pipe函数。管道操作分以下步骤: 1. 父进程调用pipe开辟管道,得到两个文件描述符指向管道的两端; 2. 父进程调用fork创建子进程,那么子进程也有两个文件描述符指向 同一管道; 3. 父进程关闭管道读取端,子进程关闭管道写入端。父进程可以往管 道里写,子进程可以从管道里读,管道是用环形队列实现的,数据从 写入端流入从读取端流出,这样就实现了进程间通信。
在Linux中,管道是一种特殊的文件,对一个进程来说,管道 的写入和读取与一个普通文件没有区别。

linux进程间通信PPT课件

linux进程间通信PPT课件

2
.
linux进程间通信(IPC)由以下几部分发展而来:
早期UNIX进程间通信、基于System V进程间通信、 基于Socket进程间通信和POSIX进程间通信。
UNIX进程间通信方式包括:管道、FIFO、信号。
System V进程间通信方式包括:System V消息队 列、System V信号灯、System V共享内存。
普通的Linux shell都允许重定向,而重定向使用的就是 管道。例如:
ps | grep vsftpd
管道是单向的、先进先出的、无结构的、固定大小的字 节流,它把一个进程的标准输出和另一个进程的标准输入 连接在一起。写进程在管道的尾端写入数据,读进程在管 道的首端读出数据。数据读出后将从管道中移走,其它读 进程都不能再读到这些数据。管道提供了简单的流控制机 制。进程试图读空管道时,在有数据写入管道前,进程将 一直阻塞。同样,管道已经满时,进程再试图写管道,在 其它进程从管道中移走数据之前,写进程将一直阻塞。
if((fp=popen(cmd,"r"))==NULL)
perror("popen");
while((fgets(buf,BUFSIZE,fp))!=NULL)
POSIX进程间通信包括:posix消息队列、posix信 号灯、posix共享内存。
3
.
现在linux使用的进程间通信方式: (1)管道(pipe)和有名管道(FIFO) (2)信号(signal) (3)消息队列 (4)共享内存 (5)信号量 (6)套接字(socket)
4
.
2、管道通信
必须在系统调用fork( )中调用pipe( ),否则子进 程将不会继承文件描述符。

LINUX内核进程管理PPT幻灯片

LINUX内核进程管理PPT幻灯片

❖ suid和sgid是根据POSIX标准引入的,在系统调用改变uid 和gid时,用于保留真正的uid和gid。
❖ fsuid和fsgid称为文件系统的uid和gid,用于对文件系统操
作时的合法性检查,是LINUX独特的标识类型。它们一般分
别和euid和egid一致,但在NFS文件系统中NFS服务器需要
SIGSTP、SIGTTIN 或SIGTTOU)的反应; 其二是受到父进程ptrace调用的控制,
而暂时将处理机交给控制进程。
35
◆ ZOMBIE: 僵尸状态。 表示进程结束但尚未消亡的一种状态。 此时进程已经结束运行并释放大部分资
源,但尚未释放进程控制块。
36
进程调度
调度程序(scheduler)用来实现进程状态 之间的转换。
0 1 //等待资源 2 4 //等待信号 8
29
◆ RUNNING: 正在运行,或者在就绪队列中等待运行
的进程。 也就是上面提到的运行态和就绪态进程
的综合。 一个进程处于RUNNING状态,并不代表
它一定在被执行。
31
由于在多任务系统中,各个就绪进程需 要并发执行,所以在某个特定时刻,这些处 于RUNNING状态的进程之中,只有一个能 够得到处理机,而其他进程必须在一个就绪 队列中等待。
4
2. 动态性
进程与程序的区别在于,程序只是一个静态的 指令集合,而进程是一个正在系统中活动的指令集 合。
在进程中加入了时间的概念。进程具有自己的 生命周期和各种不同的状态,这些概念在程序中都 是不具备的。
5
由于以上两个性质,又可以衍生出进程 的第三个重要特性,即并发性。
若干个进程可以在单处理机状态上并发 执行。注意并发性(concurrency)和多处理机 并行(parallel)是两个不同的概念。

第7章 Linux编程环境之进程控制与进程间通信

第7章 Linux编程环境之进程控制与进程间通信

用户程序不能直接存取和修改进程的系统数据 系统调用可用来访问或修改这些属性
chdir, umask,open, close setpgrp, getpid, getppid
第 7章 第 8页
进程的基本状态
基本状态
进程创建之后,主要有运行状态和睡眠状态(也叫阻塞 状态,等待状态,挂起状态,等等) 内核总是在分时处理运行状态的进程,而不顾那些处 于睡眠状态的进程 睡眠状态的进程,在条件满足后转化为运行状态 进程在睡眠时,不占用CPU时间

核心态
④ ⑦
睡眠状态

进程调度
硬件中断

驱动程序(下半部分) ttyintr() { ... if (...) wakeup(...); ... }

唤醒进程
scanf("%d", &n);程序在串口终端上执行时操作员输入756然后按下回车
time:进程执行的时间
进程执行时间包括
睡眠时间,CPU时间(用户时间和系统时间) 外部命令/usr/bin/time B-shell和C-shell都有个内部命令time /usr/bin/time find /usr -name '*.c' -print Real 6.06 User 0.36 System 2.13 C-shell: time find /usr -name '*.h' -print 0.4u 6.2s 0:10 61% 4+28k 0+0io 0pf+0w
执行结果 [1] ./fork1: BEGIN [2] a+b=30 [3] a+b=230 [4] ./fork1: END [3] a+b=230 [4] ./fork1: END

LINUX内核进程管理PPT幻灯片

LINUX内核进程管理PPT幻灯片
信号发生时,内核中断当前的进程,进 程执行处理函数来响应信号,结束后恢复正 常的进程处理。
信号有自己的名称和特定的编号,见表 3-1所示。
Hale Waihona Puke 19进程状态进程是一个动态的实体,故而它是有生 命的。
从创建到消亡,是一个进程的整个生命 周期。
在这个周期中,进程可能会经历各种不 同的状态。
一般来说,所有进程都要经历以下3种状 态。
❖ suid和sgid是根据POSIX标准引入的,在系统调用改变uid 和gid时,用于保留真正的uid和gid。
❖ fsuid和fsgid称为文件系统的uid和gid,用于对文件系统操
作时的合法性检查,是LINUX独特的标识类型。它们一般分
别和euid和egid一致,但在NFS文件系统中NFS服务器需要
16
3 进程的状态和调度
17
Linux系统信号
信号主要用于通知进程异步事件的发生。 在Linux中可以识别29种不同的信号,这些信号 中的大部分都有了预先定义好的意义,
进程可以显式的用kill或killpg系统调用来 向另一个进程发信号。
18
进程可以通过提供信号处理函数来取代 对于任意信号的缺省反应,这种缺省反应一 般都是终止进程。
uid=euid=fsuid, gid=egid=fsgid。
10
进程标识:
❖ uid和gid是运行进程的用户标识和用户组标识。
❖ euid和egid又称为有效的uid和gid。出于系统安全权限的考 虑,运行程序时要检查euid和egid的合法性。通常,uid等 于euid,gid等于egid。有时候,系统会赋予一般用户暂时 拥有root的uid和gid(作为用户进程的euid和egid),以便 于进行运作。

实验 进程管理进程通信PPT课件

实验 进程管理进程通信PPT课件

main()
{ int k,p1;
while((p1=fork())==-1);
//创建子进程
if(p1>0)
//父进程返回
{ for(k=1;k<4;k++) //显示3行信息
{ printf("How are you !\n");
sleep(1);
}
kill(p1,12); //发软中断信号给子进程
10
[例] 父子进程同步要求如下: 父进程创建一个子进程,在父进程中显示3行"How are you ! "然后发软中断信号给子进程,再等待子 进程终止后输出结束信息"OK!",然后终止执行。 子进程中循环显示"I'm child" ,当接收到父进程发 来的软信号后停止循环,显示"Child exited! "并终 止执行。
1
2
Linux进程低级通信
Linux提供了同步、互斥及软中断的系统调用/库函数:
lockf(fd,function,size) 可用于互斥 fcntl 文件控制函数(根据文件描述词来操作文件的特性)。 wait() 用于父子进程间的同步 sleep(n) 使当前进程睡眠n秒后自动唤醒自己 kill(pid,sig)传递软中断信号 signal(sig,func)接收软中断信号
演讲人:XXXXXX 时 间:XX年XX月XX日
4
发送软中断信号函数
int kill ( pid , sig )
pid——表示一个或一组进程的标识符: 当pid>0时,将信号发送给指定pid的进程; 当pid=0时,将信号发送给同组的所有进程; 当pid=-1时,将信号发送给以下所有满足条件的进程:该进 程用户标识符等于发送进程有效用户标识符; sig——软中断信号的序号或名称

linux操作系统课件7进程

linux操作系统课件7进程

fork示例
编译并运行这个程序: $gcc -o fork_test fork_test.c $./fork_test PID before fork():1991 I am the parent process, my process ID is 1991 I am the child pro world. hello wold. 再运行一遍,输出结果可能不同。 读者考虑一下为什么?
进程介绍-进程状态
一般操作系统中进程有三个最基本的状态 运行态

阻塞态
就绪态
进程控制块
为了描述和控制进程的运行,系统为每个进程定 义了一个数据结构 —进程控制块 (process control block,PCB),它是进程实体的一部分,是操作系统 中最重要的记录型数据结构。 进程控制块中记录了操作系统所需的、用于描述 进程当前情况以及控制进程运行的全部信息。操作系 统是根据进程控制块来对并发执行的进程进行控制和 管理的。
进程
进程介绍
进程控制块
进程的组织方式
进程调度 进程的创建
与进程相关的系统调用及其应用 与调度相关的系统调用及应用
并行与并发
现代计算机系统提供多道程序运行环境,这种环境可以由 多处理器结构构成,也可以由单处理器结构构成。 并行(Parallelism):多个程序在不同的处理器上同时运行。 并发(Concurrency):多个程序在单个处理器上按照一定 规则进行切换, 轮流运行。由于切换迅速,给用户的感觉 是每个用户独占自己的cpu,宏观上面看起来并行。
fork示例
#include <stdio.h> main() { int pid; /*此时仅有一个进程*/ printf(“PID before fork():%d\n”,(int)getpid()); pid=fork( ); /*此时已经有两个进程在同时运行*/ if(pid<0) printf("error in fork!"); else if(pid==0) printf("I am the child process, my process ID is%d\n",getpid()); else printf("I am the parent process, my process ID is%d\n",getpid()); printf(“hello world.\n”); }
  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
◦ #include <sys/types.h> ◦ #include <sys/ipc.h> ◦ #include <sys/shm.h> ◦ int shmget(key_t key,int size,int shmflg); ◦ void *shmat(int shmid,const void *shmaddr,int shmflg); ◦ int shmdt(const void *shmaddr); ◦ int shmctl(int shmid,int cmd,struct shmid_ds *buf);
例子1(续)
} else if(child==0) { int i; printf("I am the child:%ld\n",getpid()); for(i=0;i<1000000;i++) i++; i=5; printf("I exit with %d\n",i); exit(i); } while(((child=wait(&status))==-1)&(errno==EINTR)); }
区分父进程和子进程:
◦ 跟踪fork返回值
失败:-1 否则
父进程fork 返回子进程的ID fork 子进程返回0
可根据这个返回值来区分父子进程
调用系统程序
调用系统程序, 可以使用系统调用exec 族调用。 exec 族调用有着5 个函数:
#include <unistd.h> int execl(const char *path,const char *arg,...); int execlp(const char *file,const char *arg,...); int execle(const char *path,const char *arg,...); int execv(const char *path,char *const argv[]); int execvp(const char *file,char *const argv[]):
例子(续)
if(fork()) { p_addr=shmat(shmid,0,0); memset(p_addr,'\0',1024); strncpy(p_addr,argv[1],1024); exit(0); } else { c_addr=shmat(shmid,0,0); printf("Client get %s",c_addr); exit(0); } }
Linux的进程和进程间通信
进程创建
fork 函数: #include <unistd.h> pid_t fork(); 当一个进程调用了fork 以后,系统会创建一个子
进程。这个子进程和父进程不同的地方只有他的 进程ID 和父进程ID,就象符进程克隆(clone)自 己一样。
父进程和子进程
size 是共享内存的大小 shmat 是用来连接共享内存 shmdt 是用来de <unistd.h> #include <sys/stat.h> #include <sys/types.h> #include <sys/ipc.h> #include <sys/shm.h> #define PERM S_IRUSR|S_IWUSR int main(int argc,char **argv) { int shmid; char *p_addr,*c_addr; if(argc!=2) { printf("Usage:%s\n\a",argv[0]); exit(1); } if((shmid=shmget(IPC_PRIVATE,1024,PERM))==-1) { printf("Create Share Memory Error\n\a"); exit(1); }
进程通信
主要手段:
◦ 管道(Pipe) ◦ 信号(Signal) ◦ 消息(Message) ◦ 共享内存(Shared memory) ◦ 信号量(Semaphore) ◦ 套接口(Socket)
共享内存
进程通信的另一个方法是使用共享内存。System V 提供了以下几个 函数以实现共享内存:
例子2
#include <unistd.h> #include <sys/types.h> #include <sys/wait.h> #include <stdio.h> #include <errno.h>
int main() { int rtn; /*子进程的返回数值*/ if ( fork() == 0 ) { /* 子进程执行此命令 */ execlp("/bin/ls","ls -al ",(char *)0); /* 如果exec函数返回,表明没有正常执行命令,打印错误信息*/ exit( 1 ); } else { /* 父进程, 等待子进程结束,并打印子进程的返回值 */ wait ( &rtn ); printf( " child process return %d\n",. rtn ); } }
消息队列
为了便于进程之间通信, 可以使用管道通信System V 提供的函数来 实现进程的通信,这就是消息队列。
例子1
#include <unistd.h> #include <sys/types.h> #include <sys/wait.h> #include <stdio.h> #include <errno.h> #include <math.h>
void main(void) { pid_t child; int status; printf("This will demostrate how to get child status\n"); if((child=fork())==-1) { printf("Fork Error :%s\n",strerror(errno)); exit(1);
相关文档
最新文档