00. 目录
文章目录
01. 第1章_shell脚本
02. 第2章 系统调用和文件IO作业
2.1 实现who命令(选做)
deng@local:~/桌面$ who
deng tty2 2023-08-29 08:44 (tty2)
deng pts/2 2023-08-29 09:25 (10.36.104.58)
deng pts/3 2023-08-29 14:17 (10.36.104.58)
deng pts/4 2023-08-29 14:39 (10.36.104.58)
deng@local:~/桌面$
2.2 实现ls -l 命令(选做)
deng@local:~$ ls -l
总计 68996
drwxr-xr-x 2 deng deng 4096 7月 18 00:56 公共的
drwxr-xr-x 2 deng deng 4096 7月 18 00:56 模板
drwxr-xr-x 2 deng deng 4096 7月 18 00:56 视频
drwxr-xr-x 2 deng deng 4096 7月 18 00:56 图片
drwxr-xr-x 2 deng deng 4096 7月 18 00:56 文档
drwxr-xr-x 2 deng deng 4096 7月 18 00:56 下载
drwxr-xr-x 2 deng deng 4096 7月 18 00:56 音乐
drwxr-xr-x 2 deng deng 4096 7月 18 00:56 桌面
drwxrwxr-x 4 deng deng 4096 8月 23 17:20 arm
-rwxrw-r-- 1 deng deng 61548598 10月 10 2013 arm-linux-gcc-4.5.1-v6-vfp-20120301.tgz
drwxrwxr-x 6 deng deng 4096 8月 23 14:59 code
drwxrwxr-x 4 deng deng 4096 8月 25 11:28 kernel_code
drwxrwxr-x 18 deng deng 4096 8月 1 16:23 openssl-1.1.1d
-rwxrwxr-x 1 deng deng 8845861 8月 1 16:19 openssl-1.1.1d.tar.gz
drwx------ 3 deng deng 4096 7月 18 00:57 snap
drwxrwxr-x 2 deng deng 4096 8月 29 09:56 test
drwxr-xr-x 3 deng deng 4096 5月 8 2016 vim_configure
-rwxrw-r-- 1 deng deng 189503 4月 15 2017 vim_configure.tar.bz2
deng@local:~$
03. 第3章_进程
3.1 实现system函数
题目:实现system函数
提示:
子进程调用exec启动/bin/sh -c string来执行参数string字符串所代表的命令
父进程等待子进程退出
程序流程图
3.2 多进程编程(选做)
父进程fork三个子进程:
- 一个调用ps命令
- 一个调用自定义应用程序
- 一个调用会出现段错误的程序
父进程回收三个子进程(waitpid),并且打印三个子进程的退出状态
04. 第4章_信号
05. 第5章_管道、命令管道
5.1 实现以下命令
deng@local:~/code/3linux/5pipe$ ps -A | grep bash
2606 pts/0 00:00:00 bash
2696 pts/1 00:00:00 bash
2806 pts/2 00:00:00 bash
deng@local:~/code/3linux/5pipe$
思路分析:
//创建管道 子进程读管道 父进程写管道
pipe
父进程:
dup2(fd[1], 1);
执行 ps -A execlp
子进程:
dup2(fd[0], 0);
执行grep bash execlp
5.2 使用多进程的方式改写聊天程序(有名管道)
16mkfifo_room
思路分析
06. 第6章_消息队列
消息队列多人聊天程序
07. 第7章_共享内存
7.1 创建一个守护进程,在后台周期性执行任务
08. 第8章_线程
09. 第9章_多任务互斥与同步
9.1 写一个死锁程序
提示: 有两个互斥锁 mutex1 mutex2
线程A: 申请加锁mutex1 再申请加锁mutex2
线程B: 申请加锁mutex2 再申请加锁mutex1
9.2 C语言定时器 setitimer
setitimer函数用于设置定时器,并指定定时器到期后所产生的信号行为。其函数原型如下:
#include <sys/time.h>
int setitimer(int which, const struct itimerval *new_value, struct itimerval *old_value);
该函数接受三个参数:
which:指定定时器类型,可以是以下两个值之一:
ITIMER_REAL:真实时间定时器,使用系统实时时间,到期后将发送SIGALRM信号。
ITIMER_VIRTUAL:虚拟时间定时器,使用进程运行时间,到期后将发送SIGVTALRM信号。
ITIMER_PROF:以两者之和作为时间基准,到期后将发送SIGPROF信号。
new_value:一个指向struct itimerval结构体的指针,用于指定新的定时器值(启动时间和间隔时间)。
it_value字段表示定时器首次到期的时间间隔。
it_interval字段表示定时器循环触发的时间间隔。
old_value:一个指向struct itimerval结构体的指针,用于获取旧的定时器值,即之前设置的定时器值。如果不需要获取旧的定时器值,则可以传入NULL。
调用setitimer函数后,会根据new_value所指定的定时器值来启动或修改定时器。到期后,系统会发送相应的信号,并根据信号处理机制执行相应的操作。可以使用signal函数或sigaction函数来捕获并处理定时器到期产生的信号。
以下是一个示例代码,演示如何使用setitimer函数设置一个定时器:
#include <stdio.h>
#include <stdlib.h>
#include <sys/time.h>
#include <signal.h>
void timer_handler(int signum) {
printf("Timer expired!\n");
}
int main() {
struct itimerval timer;
// 设置首次触发定时器为1秒后,定时器到期后每10秒触发一次
timer.it_interval.tv_sec = 10;
timer.it_interval.tv_usec = 0;
timer.it_value.tv_sec = 1;
timer.it_value.tv_usec = 0;
// 注册信号处理函数
signal(SIGALRM, timer_handler);
// 启动定时器
setitimer(ITIMER_REAL, &timer, NULL);
// 死循环,等待定时器到期
while (1);
return 0;
}
上述代码中,我们设置了一个定时器,其初次到期时间为1秒后,之后每10秒触发一次。当定时器到期时,会触发SIGALRM信号,并通过注册的信号处理函数timer_handler进行处理。在示例代码中,我们只是简单地打印一条信息并没有做其他处理。
9.3 实现生产者和消费者(基于信号量)
sem1信号量初始化为10 sem2信号量初始化为0