中南大学linux程序设计环境实验四
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
实验4 Linux 高级程序设计
1、实验目的
(1) 了解Linux操作系统下应用程序开发流程
(2) 掌握gun工具链的使用
(3) 了解Linux高级编程技巧(例如IPC机制、系统调用等)
2、实验内容
(1) 编写一个简单的C语言程序,编写Makefile文件。
了解编译过程,并用gdb进行调试。
(2) 编写一段程序,适用系统调用fork( )创建两个新的子进程,此程序运行使系统中有三个活动进程存在。
控制让一个进程在屏幕上显示一个字符:父进程显示“a”,子进程分别显示字符“b”和字符“c”。
试观察屏幕上的显示结果,并对输出结果进行分析。
在实验报告中写出说明和分析。
(3) 编写一段程序实现父进程创建一个子进程,通过系统调用使子进程和父进程执行不同的任务。
(提示:利用system(), exec系列函数)
试思考,怎样实现进程间的同步?
(4) 编写一段C程序完成:父进程创建一个子进程,父进程对子进程设置一个报警信号,然后父进程等待子进程的结束,如果此时报警信号先到,就终止子进程。
3、实验要求
(1) 写出源程序,并编译运行
(2) 详细记录程序调试及运行结果
4、实验思路及过程
(1)
makefile文件:
main.c文件:
1.c文件:
2.c文件:
-o写成-c,函数库导入不正确:
(2)
出现acb的结果:p1=fork()会创建一个新的进程,父进程遇到p2=fork()创建又一个新的进程,此时,父进程运行完毕输出a,p2=fork()创建的子进程运行完毕输出c,最后p1=fork()创建的子进程运行完毕输出b;
出现abc的结果:p1=fork()会创建一个新的进程,父进程遇到p2=fork()创建又一个新的进程,此时,父进程运行完毕输出a,p1=fork()创建的子进程运行完毕输出b,最后p2=fork()创建的子进程运行完毕输出c;
出现bca的结果:p1=fork()会创建一个新的子进程,运行完毕输出b,父进程遇到p2=fork()创建又一个新的子进程,运行完毕输出c,最后父进程运行完毕输出a;
出现bac的结果:p1=fork()会创建一个新的子进程,运行完毕输出b,父进程遇到p2=fork()创建又一个新的子进程,父进程运行完毕输出a,最后子进程运行完毕输出c;
(3)
system是用shell来调用程序=fork+exec+waitpid,而exec是直接让你的程序代替原来的程序运行。
system 是在单独的进程中执行命令,完了还会回到你的程序中。
而exec函数是直接在你的进程中执行新的程序,新的程序会把你的程序覆盖,除非调用出错,否则你再也回不到exec后面的代码。
这就是为什
么看不到之后的两条打印语句的原因。
用P,V原语操作实现进程间的同步:
1. 为各并发进程设置私用信号量
2. 为私用信号量赋初值
3. 利用P、v原语和私用信号量规定各进程的执行顺序。
例:设进程PA和PB通过缓冲区队列传递数据。
PA为发送进程、PB为接收进程。
PA发送数据时调用发送过程deposit(data),PB接收数据时调用过程remove(data)。
且数据的发送和接收过程满足如下条件: 1)在PA至少送一块数据入一个缓冲区之前,PB不可能从缓冲区中取出数据(假定数据块长等于缓冲区长度), 2)PA往缓冲队列发送数据时,至少有一个缓冲区是空的; 3)由PA发送的数据块在缓冲队列中按先进先出(FIFO)方式排列。
描述发送过程deposit(data)和接收过程remove(data)。
(4)
#include <unistd.h>
#include <signal.h>
#include <sys/types.h>
#include <sys/wait.h>
#include <stdio.h>
#include <stdlib.h>
int main()
{
int id = fork();
(void) signal(SIGALRM,ding);
if(id < 0)
{
printf("error!\n");
exit(0);
}
if(id == 0)
{
sleep(1);
}
if(id > 0)
{
int statloc;
kill(id,SIGALRM);
wait(&statloc);
printf("statloc:%d\n",statloc);
if(WIFEXITED(statloc))
printf("EXIT
WITH:%d\n",WEXITSTATUS(statloc));
if(WIFSIGNALED(statloc))
printf("KILLED WITH:%d\n",WTERMSIG(statloc));
}
exit(0);
}
5、心得体会
本次实验加深了linux中对C语言编程的理解,了解了一些常用的函数,会编写一些简单的程序,但是不够熟练,需要日后的练习强化。