实验四 经典的进程同步问题
void waiting( ) { while(wait_mark!=0); } void stop( ) { wait_mark=0; }
八、思考题
1、lockf(stdout,1,0)的作用是什么? 2、该程序段前面部分用了两个wait(0),它们起什么作用? 3、该程序段中每个进程退出时都用了语句exit(0),为什么? 4、为何预期的结果并未显示出? 5、程序该如何修改才能得到正确结果?
else { wait_mark=1; signal(16,stop); /*接收到软中断信号16,转stop*/ waiting( ); lockf(stdout,1,0); printf("Child process 1 is killed by parent!\n"); lockf(stdout,0,0); exit(0); } }
闹钟。当某进程希望在某时间后接收信号时发此信号
软件终止(software termination) 用户自定义信号1 用户自定义信号2 某个子进程死 电源故障
七、参考代码
#include <stdio.h> #include <signal.h> #include <unistd.h> void waiting( ),stop( ); int wait_mark; main( ) { int p1,p2,stdout; while((p1=fork( ))= =-1); /*创建子进程p1*/ if (p1>0) { while((p2=fork( ))= =-1); /*创建子进程p2*/ if(p2>0) { wait_mark=1;
六、有关的系统功能调用: signal(int sig,int function)//;预置对信号的处理方式
int sig:信号 void (*function) ( ) 接收到指定信号后的处理函数
参数sig
值 名 字 说 明
01
02 03 04
SIGHUP
SIGINT SIGQUIT SIGILL
)、
signal( )的功能及用能否得到
结果?为什么?尝试修改源代码,得到预期的结果。 3. 写实验报告
六、有关的系统功能调用: int kill(pid_t pid, int sig); //向进程组或进程发送信号 pid: 1. pid大于零,pid是信号欲送往的进程的标识。 2.pid等于零,信号将送往所有与调用kill()的那个进程属同 一个使用组的进程。 3. pid等于-1,信号将送往所有调用进程有权给其发送信号 的进程,除了进程1(init)。 4. pid小于-1时,信号将送往以-pid为组标识的进程。 sig:准备发送的信号,其值为零则没有任何信号送出
signal(SIGINT,stop); /*接收到^c信号,转stop*/ waiting( ); kill(p1,16); /*向p1发软中断信号16*/ kill(p2,17); /*向p2发软中断信号17*/ wait(0); /*同步*/ wait(0); printf("Parent process is killed!\n"); exit(0); } else { wait_mark=1; signal(17,stop); /*接收到软中断信号17,转stop*/ waiting( ); lockf(stdout,1,0); printf("Child process 2 is killed by parent!\n"); lockf(stdout,0,0); exit(0); } }
Child process1 is killed by parent!
Child process2 is killed by parent! 父进程等待两个子进程终止后,输出如下的信息后终止: Parent process is killed!
实 验 四
• 五、实验要求
1. 阅读有关的参考书,学习系统功能调用 kill(
挂起(hangup)
中断,当用户从键盘按^c键或^break键时 退出,当用户从键盘按quit键时 非法指令
05
06 07 08 09 10 11 12 13
SIGTRAP
SIGIOT SIGEMT SIGFPE SIGKILL SIGBUS SIGSEGV SIGSYS SIGPIPE
跟踪陷阱(trace trap),启动进程,跟踪代码的执行
实 验 四
• 一、编程实现生产者—消费者问题
• 二、进程间的通信 • 三、实验目的 • 1. 掌握进程同步的实现算法
(软中断信号)
• 1. 了解什么是信号 • 2. 熟悉LINUX系统中进程之间软中断通信的基本原 理
实 验
四、实验任务
四
1. 编写程序,创建生产者和消费者进程,生产者进程产生数据并写入缓冲区,消费 者进程取数据并输出,缓冲区能存放四个数据,如果缓冲区满,则生产者不能写 数据,并报警;如果缓冲区空,消费者不能取数据,并报警。(选做,2个生产者, 2个消费者) 2. 编写程序:用fork( )创建两个子进程,再用系统调用signal( )让父进程捕捉键盘 上来的中断信号(即按^c键);捕捉到中断信号后,父进程用系统调用kill( )向两 个子进程发出信号,子进程捕捉到信号后分别输出下列信息后终止:
IOT指令 EMT指令 浮点运算溢出 杀死、终止进程 总线错误 段违例(segmentation violation),进程试图去访问其虚地址空间以外的位置 系统调用中参数错,如系统调用号非法 向某个非读管道中写入数据
14
15 16 17 18 19
SIGALRM
SIGTERM SIGUSR1 SIGUSR2 SIGCLD SIGPWR