实验6进程及进程间的通信之共享内存汇编Word格式.docx
- 文档编号:17222700
- 上传时间:2022-11-29
- 格式:DOCX
- 页数:12
- 大小:120.14KB
实验6进程及进程间的通信之共享内存汇编Word格式.docx
《实验6进程及进程间的通信之共享内存汇编Word格式.docx》由会员分享,可在线阅读,更多相关《实验6进程及进程间的通信之共享内存汇编Word格式.docx(12页珍藏版)》请在冰豆网上搜索。
^d,P?
ZD:
n1'
fgetpidf),getppid(});
exit();
for(i=;
Kn;
i++)
wait(NULL);
prxntf(11PIE:
rd,PPID;
rdx-n'
'
fgetpid(),ge^ppxd());
return.;
2、用进程相关API函数编写一个程序,使之产生一个进程
链:
父进程派生一个子进程后,然后打印出自己的PID,然后
退出,该子进程继续派生子进程,然后打印PID,然后退出,
以此类推。
要求:
1)实现一个父进程要比子进程先打印PID的版本。
(即打印的PID一般是递增的)
2)实现一个子进程要比父进程先打印PID的版本。
(即打印的PID
一般是递减的)
进程链1,process_chainl.c的参考代码如下:
^include<
stdiah>
#include<
stdlib-h>
3ys/types・h>
tinclude<
ij.nistd.h>
intmain(intargcfcharconst*argv[])
3{
intitn;
3canf(MSd"
t&
n);
for(i='
;
i<
n;
T{
printf("
PID:
^dfPPID:
*d\nT,,getpid(),getppidf));
pidta=fork();
//父进程『该干的初千完的「功律圆满『走人!
C>
3I{
exi七
(1);
・i}
//子进程『循环执行跟父进程完全一样的代码「
elseif(a=OJ
:
]:
{
con七1nue;
retuxn1;
~}
进程链2,process_chain2.c的参考代码如下:
#include<
stdio.h>
^include■<
吕七dlib_±
i>
finclude<
sy3/types,h>
tinclude<
int
□{
(intargctcharconst*argv[])
intn;
scanf(,hrdMtfin);
pid_ta=fork();
//父进程,该干的都千完的#功健®
1满,走人!
{
//等待子进程完成之后,打印pidWppidwait(NULL);
printf(FID:
rd,PPID:
rd'
1-n'
getpid(),getppid(});
//功德圆満,走人!
exit(;
子进程,循环执行跟父进程完全一棒的代码=
//
elseif(a={
continue;
}
returii;
卜
3、编写程序execl.c,实现父进程打印自己的pid号,子进程调用
execl函数,用可执行程序file_creat替换本进程。
注意命令行
参数。
参考代码如下:
/*execl.c*/
#includevunistd.h>
#include<
#include<
stdlib.h>
intmain(intargc,char*argv[])
/*判断入参有没有传入文件名*/if(argc<
2)
perror("
youhaven,tinputthefilename,pleasetryagain!
\n"
);
exit(EXIT_FAILURE);
pid_tresult;
result=fork();
if(result>
0)
printf(“I'
mparent,mypid:
%d,mysun'
spid%d\n”,getpid(),result);
/*下面代码是调用ls程序,用可执行程序ls替换本进程if(result==0)
msumprocessmypidis%d\n”,getpid());
if(execl("
/bin/ls"
"
ls"
-l"
NULL)<
{perror("
execlperror"
}*/
/*下面程序调用execl函数,用可执行程序file_creat替换本进程*/
if(result==0)
./file_creat"
file_creat"
argv[1],NULL)<
execlerror!
"
其中file_creat.c的代码如下:
file_creat.c
sys/types.h>
sys/stat.h>
fcntl.h>
voidcreate_file(char*filename)
/*创建的文件具有可读可写的属性*/if(creat(filename,0666)<
printf("
createfile%sfailure!
filename);
exit(EXIT_FAILURE);
else
createfile%ssuccess!
youhaven'
tinputthefilename,pleasetryagain!
}create_file(argv[1]);
exit(EXIT_SUCCESS);
代码分析
execl函数会让一个可执行程序运行并替换本进程,那么这个可执行程序就应该有创建一个文件的功能。
我们可以用file_creat.c
编译产生的可执行文件file_creat来作为该可执行程序。
运行步骤:
1).编译应用程序execl.c和file_creat.c命令:
gccexecl.c-oexecl
gccfile_creat.c-ofile_creat
曲root€>
toc^ho$t:
/mnt/hgf5/red5_share/cocie/2'
2'
3
1口1回丨為1
[root^localhost2-2-3)#Is
execl.cfileexeat.c
[root$localhost2-2-3]#geeexecl.c-oexecl
[toot@2.ocsilhc>
宕t2S3]#gccfile_creat*cfile_creat
[xco匚憩lhost2^2-3]#Isexeclexecl.cfilecreatfilecreat[root@localhost2-2-3]#-
■
2)运行应用程序可以看到运行程序后,创建了新的文件“
file”
彥rootetoc^host:
/mnt/hgf5/r8d5_$hare/code/2-2'
1口1回S3i
[zoot@localhost2-2-3]#Isexeclexecl.cfilecreatfilecreat[root@localhost2*2-3]#./建耳电心1filecrea七总filefilesuccess!
[rooteiocalhost2-2-3]#Xs
execlexecl.cfilefile_creatfile_creat.c[rcot@localhost2-2-3]#
3).总结:
exec函数族会在一个进程中启动另一个程序执行。
并用它来取代原调用进程的数据段、代码段和堆栈段。
在执行完exec函数调用
后,原调用进程的内容除了进程号之外,其他全部被新的进程替换了。
4、execlp函数实例:
/*execlp.c*/
intmain()
{if(execlp("
}代码分析:
使用execlp函数可以省略指定ls的路径,因为ls程序在path路径中。
execlp函数会到path路径中找到可执行程序。
5、execv函数实例:
/*execv.c*/
#include<
#include<
intmain()
char*arg[]={"
NULL};
result=fork();
{if(execv("
arg)<
}代码分析,execv函数将可执行程序的运行参数放到数组*arg[]中。
6、无名管道实验:
用命令行敲入命令:
farsight@ubuntu-desktop:
~$Is-l|wc-w运用所学知识,编程实现上述命令的效果。
ls_wc.c的参考代码如下:
♦include<
stdio■h>
1include<
uniatd.h>
♦includeCar七dlib»
h>
string>
^include七工ings.h>
iri七main(in七argc,charcons七*argv[])□{
//搞一个无窑管道
intfd[];
pip*(fd);
pi■forkf
H父进程
C)
//将管進的写端钿【口療盖1号文件描述符,使得1号文件描述符
//也跟斑[1]一样,代表了管道的写端(而不是标准输出〉dup2(fd[l],1);
//关掉没用的文件描述符
close(fd[J);
close(fd[l])}
H执行“命令,此时“命令的输出结果就会被输送到管道{而不是标准输出)sxeclp(nlsM,rNULL);
H子进程
if(a=)
将管道的读端fd[O]^盖0号文件描述符,使得0号文件描述符//世跟斑[0]—样,代表了管道的读端[而不是标准输入)dup2(fd[.l,);
//关掉没用的文俘描述符close(fd[])'
close(Ed.[])'
//执行皿命令,此时泌命令将从管道的读靖读入数据〔而不是标准输入)exe亡"
wcr,NULL);
7、用命名管道分别写一个服务器程序和一个客户机程序,客户机的
父进程负责每隔一秒产生一个子进程(形成一个进程扇),而每个子进程则往FIFO写入自己的PID号码以及一条当前的系统时间。
服务器负责从该FIFO中读取数据并将之打印到屏幕上。
FIFO
将数据打卬到屏幕
multprocess.c参考代码如下:
4include^stdbool*h>
string.h>
4include<
sy5/types»
#inclade<
sys/stat_h>
#incl口cdeff匚h七1*h>
#inclu.de<
unz_st-d--h>
#incl口*h>
iukfifo(t,fLogfifo|,'
/);
intfd=open(1_jZ1,O_WROKLY);
prin-tf(nmul-tiopen吕口cessfull!
\tih);
intnfi;
t;
scanf「T"
;
charbuf[.22];
for(i=}Kit;
i++)
pid_七a=fork();
If(a>
:
)
elseif(a==)
bzero(but,1);
七immI&
七);
snprintf(buf,1J'
rd,,getpid()fctime(&
t});
write(fd,buf,strlen{buf));
astir():
for(i=;
i<
waitCNLTLL);
return;
server.c的参考代码如下:
std£
o・h>
stdlib・hA#include<
3tdbool・h>
#iiiclude<
staring*h>
#inclu.cie<
syB/types.h>
sy5/stat,h>
fcntl*h>
unistd・h>
rakfifo("
logfifa'
1,);
intfd=open(FTlogf£
fo'
O_RDONIjY);
printf('
serveropenlogsyssucessf口l'
n11)in*fdl=open(t'
logN,O_CRKA.T|O_APPEND|while(1J
(
charbuf[SC];
bzero(buf,5J;
read(fdtbuftz'
wri七e(fdlfbufrstrlen(buf));
printf,buf);
实验分析:
管道的阻塞情况分析表如下:
氏QJD
有写者无写者
有数据
无数据
读操作
成功返回
阻塞
返回0
-t-1-t七
无读者
]未满
缓冲满
缓冲未满]缓冲满
写噪作
成E
W返回
收到SIGPIPE
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 实验 进程 通信 共享 内存 汇编