⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 linux.txt

📁 linux课程实验的题目和参考程序。有进程管理
💻 TXT
字号:
实验一、二参考程序段

实验一   进程管理
(1) 进程的创建
编写一段程序,使用系统调用fork()创建两个子进程。当此程序运行时,在系统中有一个父进程和两个子进程活动。让每一个进程在屏幕上显示一个字符:父进程显示字符“a”:子进程分别显示“b”和“c”。试观察记录屏幕上显示结果,并分析原因。
#include<stdio.h>
int main()
{
int p1 ,p2 ;
while((p1=fork())==-1);  
if(p1==0)           
putchar('b');
else
{
while((p2=fork())==-1);  
if(p2==0)             
putchar('c');
else    
putchar('a');           
}
return 0;
}

(2)进程的控制
1. 修改已编写的程序,将每个进程的输出由单个字符改为一句话,再观察程序执行是屏幕上出现的现象,并分析其原因。

#include<stdio.h>
int main()
{  
int p1,p2;
while((p1=fork())==-1);
if(p1==0)
printf("Child1 is running!\n");
else
{
while((p2=fork())==-1);
if(p2==0)
printf("Child2 is running!\n");
else
printf("Father is running!\n");
}
return 0;
}


2.如果在程序中使用系统调用lock()来给每个进程加锁,可以实现进程之间的互斥,观察并分析出现的现象。

#include<stdio.h>
int main()
{
int p1 ,p2;
while((p1=fork())==-1); 
if(p1==0)           
{
lockf(1,1,0); 
putchar('b');
lockf(1,0,0);
}
else
{
while((p2=fork())==-1);  
if(p2==0) 
{
lockf(1,1,0); 
putchar('c');
lockf(1,0,0);
}
else 
{
lockf(1,1,0); 
putchar('a');
lockf(1,0,0);
}
}
return 0;
}


3. 编写一段程序,使其实现进程的软中断通信
[1] 使用系统调用fork()创建两个子程序,再用系统调用signal()接收父进程从键盘上来的中断信号;当有中断信号后,父进程用系统调用Kill()向两个子进程发出信号,子进程有信号后分别输出
Child Processll is Killed by Parent!
Child Processl2 is Killed by Parent!
父进程等待两个子进程终止后,输出如下的信息后终止:
Parent process is Killed!
============================
 #include<stdio.h>
#include<signal.h>
int  wait_mark;
void waiting(){
while(wait_mark==1);
}
void  stop(){
wait_mark=0;
}
int main(){
int p1,p2;
while((p1=fork())==-1);
if(p1==0){
wait_mark=1;
signal(SIGINT,SIG_IGN);
signal(16,stop);
waiting();
lockf(1,1,0);
printf("Child Process11 is Killed by Parent!\n");
lockf(1,0,0);
exit(0);
}
else{
while((p2=fork())==-1);
if(p2==0){
wait_mark=1;
signal(SIGINT,SIG_IGN);
signal(17,stop);
waiting();
lockf(1,1,0);
printf("Child Process12 is Killed by Parent!\n");
lockf(1,0,0);
exit(0);
}
else{
wait_mark=1;
signal(SIGINT,stop);
waiting();
kill(p1,16);
kill(p2,17);
wait(0);
wait(0);
printf("Parent Process is Killed!\n");
exit(0);
}
}
}
           
[2]在上面的程序中增加语句signal(SIGINT,SIG_IGN)和signal(SIGQUIT,SIG_IGN),观察执行结果,并分析原因。
           
#include<stdio.h>
#include<signal.h>int flag=1;void  stop()
{
flag=0;
}
int main()
{
int p1,p2;
signal(SIGINT,SIG_IGN);
signal(SIGQUIT,SIG_IGN);
while((p1=fork())==-1);
if(p1==0)
{
signal(SIGINT,SIG_IGN);
signal(1,stop);
while(flag);
lockf(1,1,0);
printf("Child Process11 is Killed by Parent!\n");
lockf(1,0,0);
exit(0);
}
else
{
while((p2=fork())==-1);
if(p2==0)
{
signal(SIGINT,SIG_IGN);      
signal(2,stop);
while(flag);
lockf(1,1,0);
printf("Child Process12 is Killed by Parent!\n");
lockf(1,0,0);
exit(0);
}
else
{
signal(SIGINT,stop);
while(flag);
kill(p1,1);
kill(p2,2);
wait(0);
wait(0);
printf("Parent Process is Killed!\n");
exit(0);
}
}
}
 
实验二   进程间通信

(1)消息的创建,发送和接收
         在Linux系统中系统调用msgget()、msgsnd()、msgrev()及msgctl()来进行消息的发送和接收程序。其中,msgget()用于创建或获取消息队列;msgsnd()用于往消息队列中发送一个消息;msgrev()用于从消息队列中接收一个消息;msgctl()则是消息队列的控制函数。

#include<stdio.h>
#include<sys/types.h>
#include<sys/ipc.h>
#include<sys/msg.h>
#define key 1
#define buffersize 1024
typedef struct {
long mtype;char mtext[buffersize];
}Msg ;
int pid;
Msg msg;
int main(){
int p;
while((p=fork())==-1);
if(p==0){
sleep(5);
pid=msgget(key,IPC_CREAT|0600);
msgrcv(pid,&msg,buffersize,1,0);
printf("receive msg is:%s\n",msg.mtext);
msgctl(pid,IPC_RMID,0);
}
else{
pid=msgget(key,IPC_CREAT|0600);
msg.mtype=1;
strcpy(msg.mtext,"This is the message which the parent have sent!");
while((msgsnd(pid,&msg,buffersize,0))==-1);
}
return 0;
}
(2)共享存储区的创建、附接和断接
在Linux系统中是用系统调用shmget()、shmat()、shmdt()和shmctl()来实现不同的进程见的内存的共享的。shmget()用于取得共享内存的地址;shmat()用于连接共享内存;shmdt()用于解除共享内存。

#include<stdio.h>
#include<sys/types.h>
#include<sys/ipc.h>
#include<sys/msg.h>
#define buffersize 1024
#define key 1
int main()
{
int p;
while((p=fork())==-1);
if(p==0)
{
int pid;
pid=shmget(key,buffersize,IPC_CREAT|0600);
char *addr;
addr=(char *)shmat(pid,NULL,0);
printf("receive msg is:%s\n",addr);
shmdt(addr);
}
else
{
int pid;
pid=shmget(key,buffersize,IPC_CREAT|0600);
char *addr;
addr=(char *)shmat(pid,NULL,0);
strcpy(addr," This is the message which the parent have sent!");
shmdt(addr);
}
return 0;
}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -