【申嵌】Linux系统程序设计课堂实训练习
时间:2025-03-09
时间:2025-03-09
【申嵌】Linux系统程序设计课堂实训练习
第二章 基本文件I/O
1、书上实例练习
2、设计一个程序,实现将一个字符串“Hi, I'm a Linux programmer!”写入到文件a.txt,然后将a.txt中前10个字符拷贝到文件b.txt中。
第三章 进程与线程
1、练习使用fork复制进程的例子,观察处理器的调度情况,尝试使用sleep(1)来改变调度顺序。
2、练习fork+execl/execv/execlp/execvp的结合使用。
3、waitpid实验 waitpid.c
问题描述:
首先使用fork新建一个子进程,并使子进程暂停5s(使用sleep函数),接下来,父进程使用waitpid函数,并使用参数WNOHANG使父进程不会阻塞。若有子进程退出,则waitpid返回子进程号;若没有子进程退出,则waitpid返回0,并且父进程每隔一秒循环判断一次。
提示:
pr = waitpid(pid, NULL, WNOHANG)
4、多进程程序实验 proc_expr1.c
实验目的:熟练掌握fork, exec, waitpid等函数的使用
问题描述:
父进程依次创建两个子进程,其中一个子进程运行"ls -l"指令,另一个进程在暂停5s后异常退出,父进程并不阻塞自己,并等待子进程的退出信息,待收集到该信息,父进程就返回。
5、多线程编程实验:利用线程参数重用一个线程函数创建多线程。
(1)创建两个新线程,一个输出x,另一个输入o,每个线程输出固定字符数后就从线程函数中返回退出线程。线程函数char_print在两个线程中均被执行,但是程序为每个线程指定不同的实例作为参数。
(2)引入pthread_join主线程收集两个子线程的退出信息,并释放资源。
6、互斥锁的使用方法 mutex_test.c
目的:掌握互斥锁来进行线程同步的方法。通过互斥锁来同步读、写线程对共享缓冲区的操作。
7、使用信号量同步线程实验 sem_test1.c
目的:掌握使用信号量进行线程同步的方法。
(2) 修改程序使得三个线程的执行顺序为a->b->c
sem_test2.c
上海嵌入式家园-开发板商城
【申嵌】Linux系统程序设计课堂实训练习
8、条件变量同步线程实验
目的:掌握使用条件变量进行线程同步的方法。
cond_test.c
第四章 进程间的通信
1、kill+signal 实现不同进程发送信号机制 kill_signal_expr.c
创建一个子进程,父进程通过kill发送一个SIGTERM信号给子进程,子进程借助signal建立SIGTERM与信号处理函数的关联,当子进程接收到SIGTERM信号,使用execl函数终止自己。
提示:注意到execl函数的参数都是char *类型,因此必须使用sprintf将pid从int转换成char *,
eg:
char s[];
sprintf(s,"%d",getpid());
2、有名管道(命名管道)fifo_read.c, fifo_write.c
编写两个程序,一个用于读管道,另一个用于写管道。其中在读管道的程序里创建管道,并且作为main函数里的参数由用户输入要写入的内容。读管道读出用户写入管道的内容。 要求:这两个函数用的是非阻塞读写管道。
eg:
fd = open(FIFO, O_RDONLY | O_NONBLOCK, 0755);
fd = open(FIFO, O_WRONLY | O_NONBLOCK, 0);
3、信号量综合实例 ipc_sem_test.c
问题描述:首先实现两个函数,用于请求和释放信号量,每个进程只能请求一次,定义一个全局变量semheld
来记录请求次数,当semheld大于0时不再增加信号量,当semheld小于1时,不再释放信号量。
4、信号量应用实例 sem_p_v.c
问题描述:此应用程序实现了父子进程间对信号量的 PV 操作。所谓 P 操作,就是将信号量的值减
去 1;所谓 V 操作,就是将信号量的值加 1。
在此程序中,子进程创建了一个含有一个信号量的信号量集合,并初始化为 5。在前 5 次 V 操作中,子进程每次 V 操作等待 1 秒,在后 5 次 V 操作中,子进程每次 V 操作等待 3
秒。父进程执行10次P操作,每次 P 操作等待 2 秒。
5、实现一个简单的消息队列工具,用于创建消息队列、发送、读取消息、改变权限以及删除消息队列。 msgtool实例, msgtool.c
实现如下功能:
上海嵌入式家园-开发板商城
【申嵌】Linux系统程序设计课堂实训练习
(1) 发送消息
msgtool s (type) “text”
(2) 读取消息
msgtool r (type)
(3) 改变权限
msgtool m (mode)
(4) 删除队列
msgtool d
6、消息队列应用实例练习: msg_receiver_example.c, msg_sender_example.c
原理及功能说明
此实例是一个简单的使用消息队列进行实时聊天的本机通信程序,发送端每发送一个消 息,会立即被接收读取,在没有消息在消息队列中时,将处于阻塞状态。其运行结果如下:
(1)终端 1 运行接收端。
[root@localhost hanson]# ./msg_receiver_example //执行接收端
最开始执行时,在消息队列中没有信息,处于阻塞状态。
(2)终端 2 运行发送端。
[root@localhost hanson]# ./msg_sender_example //执行发送端
Enter the mssage to send:hello //输入信息
Enter the mssage to send:yes
Enter the mssage to send:go
Enter the mssage to send:end //结束信号
(3)有信息发送后,终端 1 接收到的信息。
receiver mssage:hello
receiver mssage:yes
receiver mssage:go
receiver mssage:end //通信结束