实验二Linux进程线程及编程.docx
- 文档编号:26651252
- 上传时间:2023-06-21
- 格式:DOCX
- 页数:10
- 大小:119.75KB
实验二Linux进程线程及编程.docx
《实验二Linux进程线程及编程.docx》由会员分享,可在线阅读,更多相关《实验二Linux进程线程及编程.docx(10页珍藏版)》请在冰豆网上搜索。
实验二Linux进程线程及编程
停,其间隔时间为10s。
五、实验步骤
1.分析下面的代码,注意它的运行会产生几个进程以及掌握fork()调用的具体过程。
/*multi_proc_wrong.c*/
#include
#include
#include
#include
#include
intmain(void)
{
pid_tchild1,child2,child;
/*创建两个子进程*/
child1=fork();
child2=fork();
/*子进程1的出错处理*/
if(child1==-1)
{
printf("Child1forkerror\n");
exit
(1);
}
elseif(child1==0)/*在子进程1中调用execlp()函数*/
{
printf("Inchild1:
execute'ls-l'\n");
if(execlp("ls","ls","-l",NULL)<0)
{
printf("Child1execlperror\n");
}
}
if(child2==-1)/*子进程2的出错处理*/
{
printf("Child2forkerror\n");
exit
(1);
}
elseif(child2==0)/*在子进程2中使其暂停5s*/
{
printf("Inchild2:
sleepfor5secondsandthenexit\n");
sleep(5);
exit(0);
}
else/*在父进程中等待两个子进程的退出*/
{
printf("Infatherprocess:
\n");
child=waitpid(child1,NULL,0);/*阻塞式等待*/
if(child==child1)
{
printf("Getchild1exitcode\n");
}
else
{
printf("Erroroccured!
\n");
}
do
{
child=waitpid(child2,NULL,WNOHANG);/*非阻塞式等待*/
if(child==0)
{
printf("Thechild2processhasnotexited!
\n");
sleep
(1);
}
}while(child==0);
if(child==child2)
{
printf("Getchild2exitcode\n");
}
else
{
printf("Erroroccured!
\n");
}
}
return0;
}
此段代码会是我们所希望的结果,如果child1=fork();child2=fork();都成功则会有4个进程,child1=fork();后会才生一个新的进程:
主进程、child1,child2=fork()后主进程和child1有分别产生一个新的进程。
2.分析下面代码,体会与上一个代码之间的区别,
/*multi_proc.c*/
#include
#include
#include
#include
#include
intmain(void)
{
pid_tchild1,child2,child;
/*创建两个子进程*/
child1=fork();
/*子进程1的出错处理*/
if(child1==-1)
{
printf("Child1forkerror\n");
exit
(1);
}
elseif(child1==0)/*在子进程1中调用execlp()函数*/
{
printf("Inchild1:
execute'ls-l'\n");
if(execlp("ls","ls","-l",NULL)<0)
{
printf("Child1execlperror\n");
}
}
else/*在父进程中再创建进程2,然后等待两个子进程的退出*/
{
child2=fork();
if(child2==-1)/*子进程2的出错处理*/
{
printf("Child2forkerror\n");
exit
(1);
}
elseif(child2==0)/*在子进程2中使其暂停5s*/
{
printf("Inchild2:
sleepfor5secondsandthenexit\n");
sleep(5);
exit(0);
}
printf("Infatherprocess:
\n");
child=waitpid(child1,NULL,0);/*阻塞式等待*/
if(child==child1)
{
printf("Getchild1exitcode\n");
}
else
{
printf("Erroroccured!
\n");
}
do
{
child=waitpid(child2,NULL,WNOHANG);/*非阻塞式等待*/
if(child==0)
{
printf("Thechild2processhasnotexited!
\n");
sleep
(1);
}
}while(child==0);
if(child==child2)
{
printf("Getchild2exitcode\n");
}
else
{
printf("Erroroccured!
\n");
}
}
return0;
}
3.在宿主机上编译调试该程序
gccmulti_proc.c–omulti_proc
4.在确保没有编译错误后,使用交叉编译该程序
arm-linux-gccmulti_proc.c–omulti_proc
5.将生成的可执行程序下载到目标板上运行。
6.分析实验结果
主要是要理解FORK()函数的意义:
在语句child1=fork()之前,只有一个进程在执行这段代码,但在这条语句之后,就变成两个进程在执行了,这两个进程的代码部分完全相同。
两个进程中,原先就存在的那个被称作“父进程”,新出现的那个被称作“子进程”。
父子进程的区别除了进程标志符(processID)不同外,变量child1的值也不相同,child1存放的是fork的返回值。
fork调用的一个奇妙之处就是它仅仅被调用一次,却能够返回两次,它可能有三种不同的返回值:
在父进程中,fork返回新创建子进程的进程ID;
在子进程中,fork返回0;
如果出现错误,fork返回一个负值;
所以掌握了fork的含义后就不难分析结果了。
第二段代码将child2放在了父进程中创建,这样child1就不会在创建child2,此时child1、child2都是主进程的子进程,共有3个进程存在。
六、实验总结
通过实验过程中编写一个完整的守护进程,掌握守护进程编写和调试的方法,进一步熟悉如何编写多进程程序,对Linux的进程和线程有了更多的了解。
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 实验 Linux 进程 线程 编程