问题集锦(54-55)
Problem 54 An example for understanding Linux initcall mechanism?
Ans:
1. 源码
#include <stdio.h>
/*定义函数指针*/ typedef int (*initcall_t)(void); /*申明外部变量,在ld的脚本文件中定义*/ extern initcall_t __initcall_start, __initcall_end;
#define __initcall(fn) / static initcall_t __initcall_##fn __init_call = fn
#define __init_call __attribute__ ((unused,__section__ ("function_ptrs")))
#define module_init(x) __initcall(x); /*上述宏定义名为"__initcall_函数名"的函数指针,且将函数指针放在function_ptrs节 这个函数指针,指向fn(fn函数则放在code_segment节中)*/
#define __init __attribute__ ((__section__ ("code_segment"))) /*函数放在code_segment节*/ static int __init my_init1 (void) { printf ("my_init () #1/n"); return 0; }
static int __init my_init2 (void) { printf ("my_init () #2/n"); return 0; } module_init (my_init1);/*定义要被调用的函数指针并放到指定的节中*/ module_init (my_init2);
void do_initcalls (void) { initcall_t *call_p; /*定义函数指针变量*/ call_p = &__initcall_start;/*获取节首址*/ do { fprintf (stderr, "call_p: %p/n", call_p); (*call_p)(); ++call_p;/*32位机器上,函数指针占4bytes,增加一次就是指针便宜4bytes*/ } while (call_p < &__initcall_end); }
int main (void) { fprintf (stderr, "in main()/n"); do_initcalls (); /*调用*/ return 0; } |
2. 定义lds文件
通过命令ld --verbose可以获得默认的连接控制脚本, 即选择 "=======..."之间的文本,保存为linker.lds文件
在linker.lds文件中增加本例需要控制的语句:
将
/*定义__initcall_start符号为当前位置,即.代表当前位置*/
__initcall_start = .;
function_ptrs : { *(function_ptrs) }
__initcall_end = .;
/*上述3行代码代表function_ptrs节位于__initcall_start和__initcall_end之间*/
code_segment : { *(code_segment) }
这段代码copy到linker.lds文件的
__bss_start = .;
语句之前。
这项工作可由如下脚本完成:
#!/bin/sh outputfile=linker.lds
lineno1=`ld --verbose | tee ${outputfile} | sed '/==================================================/q' | wc -l`
sed -i "1,${lineno1}d" ${outputfile} sed -i '/==================================================/d' ${outputfile}
lineno2=`sed -n '/__bss_start/=' ${outputfile}` sed -i "${lineno2} i/__initcall_start = .;/nfunction_ptrs : { *(function_ptrs) }/n__initcall_end = .;/ncode_segment : { *(code_segment) } " ${outputfile} |
3. 编译运行
命令:
gcc -Tlinker.lds -o doinitcall doinitcall.c
其中:
-T选项告诉ld要用的连接控制脚本文件,做为链接程序的依据。格式如下:
-T commandfile 或
--script=commandfile
运行结果如下:
byd123@ubuntu :~/Desktop$ ./doinitcall
in main()
call_p: 0x804a01c
my_init () #1
call_p: 0x804a020
my_init () #2
Problem 55系统管理:Linux系统下临时文件TMP清理?
Ans:
系统使用时间长后会产生临时文件(/tmp下),需要清理,但清理的时候不推荐使用rm –rf。这样有时会引起程序的僵死。推荐使用tmpwatch工具。
tmpwatch工具从指定的目录中递归地搜索,并删除在指定时间段内没有被访问的文件。tmpwatch一般被用来清扫那些用来临时驻留文件的目录(如/tmp),tmpwatch忽略符号链接,它不会切换文件系统,而且只删除空目录和常规文件。
语法: tmpwatch [-afqv] [-test][超期时间][目录…]
补充说明:执行tmpwatch指令可删除不必要的暂存文件,您可以设置文件超期时间,单位以小时计算。
参数:
-a或--all 删除任何类型的文件
-f或--force 强制删除文件或目录,其效果类似rm指令的”-f”参数。
-q或--quiet 不显示指令执行过程
-v或--verbose 详细显示指令执行过程
-test 仅作测试,并不真的删除文件或目录
实例:tmpwatch -afv 3 /tmp
转载于:https://my.oschina.net/fuyajun1983cn/blog/263830
问题集锦(54-55)相关推荐
- csp-s模拟测试54 - 55
两天炸掉了135分 csp-s模拟测试54 期望得分:100+72+45 实际得分:100+21+31 T2有重边,关于邻接矩阵,它死了TAT,挂了记忆化搜索-39. 然后判c=0想到了1点没度,然而 ...
- 高斯传记资料(2012-12-01 20:54:55)
以高斯命名的数学概念.定义.定理有n项.高斯数域Q(i)或Z[i]所在的二次域.高斯整数.高斯整数环Z[i]或复整数环.高斯整环或UFD.高斯素数(Gaussian primes) .正态分布曲 ...
- Unity 游戏开发技巧集锦之制作一个望远镜与查看器摄像机
Unity 游戏开发技巧集锦之制作一个望远镜与查看器摄像机 Unity中制作一个望远镜 本节制作的望远镜,在鼠标左键按下时,看到的视图会变大:当不再按下的时候,会慢慢缩小成原来的视图.游戏中时常出现 ...
- Educational Codeforces Round 54
这套题不难,但是场上数据水,导致有很多叉点 A. 因为是让求删掉一个后字典序最小,那么当a[i]>a[i+1]的时候,删掉a[i]一定最优!这个题有个叉点,当扫完一遍如果没有满足条件的,就删去最 ...
- 笔试算法题(55):快速排序实现之三路划分, 三元中值法和插入排序处理小子文件...
议题:快速排序算法实现之三(三路划分遍历,解决与划分元素相等元素的问题) 分析: 算法原理:使用三路划分策略对数组进行划分(也就是荷兰国旗问题,dutch national flag problem) ...
- Educational Codeforces Round 55 (Rated for Div. 2)
A.Vasya and Book 三种情况讨论一下 1 #include<bits/stdc++.h> 2 using namespace std; 3 int main() 4 { 5 ...
- JAVA——JAVA知识点集锦(上)
转自:http://blog.csdn.net/scythe666/article/details/51994770 1.面向对象的特征有哪些方面? 答:面向对象的特征主要有以下几个方面: - 抽 ...
- 致欧家居通过创业板注册:年营收55亿 安克创新是股东
雷递网 雷建平 5月5日 致欧家居科技股份有限公司(简称:"致欧家居")日前通过注册,准备在深交所创业板上市. 致欧家居曾计划募资14.86亿元,其中,3.18亿元用于研发设计中心 ...
- conda 换成清华的源_[mcj]conda设置清华源以及更换删除源|conda常用命令集锦
全文包括: 显示目前使用的源channel 增加channel 删除channel 其他命令 1 显示channel: 首先,conda config --show能够显示出所有conda的confi ...
- django进阶04部署上线(nginx,uwsgi,supervisor)
原创博文地址:django进阶04部署上线(nginx,uwsgi,supervisor) django自身服务ok python manage.py runserver,验证可正常访问 uwsgi安 ...
最新文章
- IPFS中国社区丨最简单全面介绍IPFS
- 文巾解题 面试题 01.06. 字符串压缩
- C#开发Android应用的必备——Mono for Android V1.0 发布
- 启明云端分享| ESP32-C6有啥特别之处呢?性能如何,搭载的处理器是什么呢?GPIO有多少个呢?采用的框架是什么呢?
- 新课改实践下美术课程的新教学观
- 抓取dump的头文件
- php中tags,php中strip_tags()函数的用法举例
- Codefroces1077F2. Pictures with Kittens (hard version)
- nginx如何配置多站点
- 防不胜防!微信借钱语音确认仍被骗:我可真是太难了
- 【转】用Qt生成dll类库及调用方法
- AS3多人游戏开发—同步人物移动2
- 数据结构实验病毒感染检测问题
- kindle看pdf不清楚_Kindle 对 PDF 的支持真的很糟糕吗?
- PS中抠图的几种方法简介
- linux dhcpv6有状态配置,翻译:IPv6地址自动配置:有状态和无状态的区别
- Python批量将MP3音频转为WAV格式(附代码) | Python工具
- matlab 狼追兔子,数学模型--狼追击兔子的问题.doc
- 腾讯课堂个人老师直播授课操作 首次下载与安装 200308
- 10本Linux PDF 书籍免费分享