好文档 - 专业文书写作范文服务资料分享网站

操作系统预习报告1 

天下 分享 时间: 加入收藏 我要投稿 点赞

内蒙古工业大学数据科学与应用学院

【举例2】

在上面任务1中,增加语句signal(SIGINT,SIG_IGN)和语句signal(SIGQUIT,SIG_IGN),观察执行结果,并分析原因。这里signal(SIGINT,SIG_IGN)和signal(SIGQUIT,SIG_IGN)分别为忽略“Ctrl+c”键信号以及忽略中断信号。 【程序】

#include #include #include #include

int pid1,pid2;

int endflag=0,pf1=0,pf2=0;

void intdelete() {

kill(pid1,16); kill(pid2,17); endflag=1; } void int1() {

printf(“child process 1 is killed by parent!”); exit(0); } void int2() {

printf(“child process 2 is killed by parent!”); exit(0); }

main() {

第页

内蒙古工业大学数据科学与应用学院

int exitpid;

signal(SIGINT,SIG_IGN); signal(SIGQUIT,SIG_IGN); while((pid1=fork())= =-1); if(pid1= =0) {

printf(“process 1 run!\\n”); signal(SIGUSR1,int1); signal(16, SIG_IGN); pause(); exit(0); } else {

while((pid2=fork())= =-1); if(pid2= =0) {

printf(“process 2 run!\\n”); signal(SIGUSR2,int2); signal(17, SIG_IGN); pause(); exit(0); } else {

printf(“parent run!\\n”); signal(SIGINT,intdelete); waitpid(-1,&exitpid,0);

printf(“parent process is killed!\\n”); exit(0); } }

第页

内蒙古工业大学数据科学与应用学院

}

2.进程的管道通信 【举例】

编制一段程序,实现进程的管道通信。使用系统调用pipe()建立一条管道线。两个子进程p1和p2分别向管道各写一句话: child 1 is sending a message! child 2 is sending a message!

而父进程则从管道中读出来自于两个子进程的信息,显示在屏幕上。 【程序】

#include #include #include

int pid1,pid2; main() {

int fd[3];

char outpipe[100],inpipe[100]; pipe(fd);

while((pid1=fork())= =-1); if(pid1= =0) {

printf(“p1 run!\\n”); lockf(fd[1],1,0);

sprintf(outpipe,”child 1 process is sending a message!”); write(fd[1],outpipe,50); sleep(1); lockf(fd[1],0,0); exit(0); } else

第 页

内蒙古工业大学数据科学与应用学院

{

while((pid2=fork())= =-1); if(pid2= =0) {

printf(“p2 run!\\n”); lockf(fd[1],1,0);

sprintf(outpipe,”child 2 process is sending a message!”); write(fd[1],outpipe,50); sleep(1); lockf(fd[1],0,0); exit(0);

} else {

printf(“parent run!\\n”); wait(0);

read(fd[0],inpipe,50); printf(“%s\\n”,inpipe); wait(0);

read(fd[0],inpipe,50); printf(“%s\\n”,inpipe); exit(0); } } }

3.进程的消息队列通信 实验要求:

(1)实现客户机与服务器之间的通信程序。

1)基本要求:实现1台客户机对1台服务器;提高要求:实现n台客户机对1台服务器; 2)要求服务器分别接收客户机数据。

3)要求每个客户机与服务器采用消息队列通信机制来发送和接收消息。

(2)测试程序,给出测试结果并进行分析。

第 页

内蒙古工业大学数据科学与应用学院

(3)书写预习报告和实验报告。

实验提示:

进程间消息队列通信主要用到的四个系统调用如下: int msgget(key_t key,int msgflg)

int msgctl(int msgqid,int cmd,struct msqid_ds *buf)

int msgsnd(int msgqid,struct msgbuf *msgp, size_t msgsz,int msgflg)

int msgrcv(int msgqid,struct msgbuf *msgp, size_t msgsz,long msgtyp,int msgflg) 包含的头文件如下: #include #include #include 【举例】

编制一个客户机进程,定义消息的格式,使用msgget()系统调用创建消息队列,使用msgsnd()和msgrcv()系统调用实现与服务进程之间消息的发送和接收,通信结束后使用msgctl()系统调用删除相关的消息队列。

(1)客户机程序设计 #include #include #include #define MSGKEY 75 struct msgform{ long mtype; char mtext[256]; }; int main() {

printf(\ struct msgform msg; int msgqid,pid;

msgqid=msgget(MSGKEY,0777); pid=getpid(); char*pint=msg.mtext;

第 页

操作系统预习报告1 

内蒙古工业大学数据科学与应用学院【举例2】在上面任务1中,增加语句signal(SIGINT,SIG_IGN)和语句signal(SIGQUIT,SIG_IGN),观察执行结果,并分析原因。这里signal(SIGINT,SIG_IGN)和signal(SIGQUIT,SIG_IGN)分别为忽略“Ctrl+c”键信号以及忽略中断信号。
推荐度:
点击下载文档文档为doc格式
6y98a6hush6u75f0b3w102ra61x6wi01dgt
领取福利

微信扫码领取福利

微信扫码分享