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)相关推荐

  1. csp-s模拟测试54 - 55

    两天炸掉了135分 csp-s模拟测试54 期望得分:100+72+45 实际得分:100+21+31 T2有重边,关于邻接矩阵,它死了TAT,挂了记忆化搜索-39. 然后判c=0想到了1点没度,然而 ...

  2. 高斯传记资料(2012-12-01 20:54:55)

     以高斯命名的数学概念.定义.定理有n项.高斯数域Q(i)或Z[i]所在的二次域.高斯整数.高斯整数环Z[i]或复整数环.高斯整环或UFD.高斯素数(Gaussian primes) .正态分布曲 ...

  3. ​Unity 游戏开发技巧集锦之制作一个望远镜与查看器摄像机

    ​Unity 游戏开发技巧集锦之制作一个望远镜与查看器摄像机 Unity中制作一个望远镜 本节制作的望远镜,在鼠标左键按下时,看到的视图会变大:当不再按下的时候,会慢慢缩小成原来的视图.游戏中时常出现 ...

  4. Educational Codeforces Round 54

    这套题不难,但是场上数据水,导致有很多叉点 A. 因为是让求删掉一个后字典序最小,那么当a[i]>a[i+1]的时候,删掉a[i]一定最优!这个题有个叉点,当扫完一遍如果没有满足条件的,就删去最 ...

  5. 笔试算法题(55):快速排序实现之三路划分, 三元中值法和插入排序处理小子文件...

    议题:快速排序算法实现之三(三路划分遍历,解决与划分元素相等元素的问题) 分析: 算法原理:使用三路划分策略对数组进行划分(也就是荷兰国旗问题,dutch national flag problem) ...

  6. 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 ...

  7. JAVA——JAVA知识点集锦(上)

    转自:http://blog.csdn.net/scythe666/article/details/51994770 1.面向对象的特征有哪些方面?  答:面向对象的特征主要有以下几个方面:  - 抽 ...

  8. 致欧家居通过创业板注册:年营收55亿 安克创新是股东

    雷递网 雷建平 5月5日 致欧家居科技股份有限公司(简称:"致欧家居")日前通过注册,准备在深交所创业板上市. 致欧家居曾计划募资14.86亿元,其中,3.18亿元用于研发设计中心 ...

  9. conda 换成清华的源_[mcj]conda设置清华源以及更换删除源|conda常用命令集锦

    全文包括: 显示目前使用的源channel 增加channel 删除channel 其他命令 1 显示channel: 首先,conda config --show能够显示出所有conda的confi ...

  10. django进阶04部署上线(nginx,uwsgi,supervisor)

    原创博文地址:django进阶04部署上线(nginx,uwsgi,supervisor) django自身服务ok python manage.py runserver,验证可正常访问 uwsgi安 ...

最新文章

  1. IPFS中国社区丨最简单全面介绍IPFS
  2. 文巾解题 面试题 01.06. 字符串压缩
  3. C#开发Android应用的必备——Mono for Android V1.0 发布
  4. 启明云端分享| ESP32-C6有啥特别之处呢?性能如何,搭载的处理器是什么呢?GPIO有多少个呢?采用的框架是什么呢?
  5. 新课改实践下美术课程的新教学观
  6. 抓取dump的头文件
  7. php中tags,php中strip_tags()函数的用法举例
  8. Codefroces1077F2. Pictures with Kittens (hard version)
  9. nginx如何配置多站点
  10. 防不胜防!微信借钱语音确认仍被骗:我可真是太难了
  11. 【转】用Qt生成dll类库及调用方法
  12. AS3多人游戏开发—同步人物移动2
  13. 数据结构实验病毒感染检测问题
  14. kindle看pdf不清楚_Kindle 对 PDF 的支持真的很糟糕吗?
  15. PS中抠图的几种方法简介
  16. linux dhcpv6有状态配置,翻译:IPv6地址自动配置:有状态和无状态的区别
  17. Python批量将MP3音频转为WAV格式(附代码) | Python工具
  18. matlab 狼追兔子,数学模型--狼追击兔子的问题.doc
  19. 腾讯课堂个人老师直播授课操作 首次下载与安装 200308
  20. 10本Linux PDF 书籍免费分享

热门文章

  1. 简单实现ibatis的物理分页
  2. 国内卫星通信技术发展及应用概述
  3. zabbix监控windows主机
  4. CreateRemoteThread注入DLL
  5. sql之left join、right join、inner join的区别,连接自己时的查询结果测试
  6. Vert.x学习笔记(一) Vert.x 核心包
  7. Ubuntu find命令详解
  8. 最全面的百度地图JavaScript离线版开发
  9. c/c++ 函数、常量、指针和数组的关系梳理
  10. linux kernel的中断子系统之(三):IRQ number和中断描述符【转】