C语言基本问题

  1. gcc的编译过程
    源代码 – 预处理 – 编译 – 汇编 – 链接 – 可执行文件
    以下面几个文件为例
    ├── test.c
    └── inc
    ├── mymath.h
    └── mymath.c
    预处理(Pre-processing) :进行伪指令(伪指令是以#开头的指令,包括头文件包含,宏替换,条件编译 如# ifdef,# ifndef,# else,# elif,# endif等)和特殊符号处理,得到文本文件,文件中只有常量、变量的定义,以及C语言的关键字(如main, if , else , for , while , { , } , + , - , * , \ 等等)。该文本文件size大比原来很多。
    gcc -E -I./inc test.c -o test.i 或者 cpp test.c -I./inc -o test.i
    -E是让编译器在预编译之后退出; -I是指定头文件目录; -o是指定输出文件
    编译(Compilation):通过词法分析和语法分析,确认所有的指令符合语法规则,然后转换(或翻译)成汇编代码(assembly code)。这里得到的.s文件不是二进制文件,可以打开阅读(会看到如movl、addl等指令)。
gcc -S -I./inc test.c -o test.s

汇编(assemble):将上一步的汇编代码转换成机器码(machine code),生成目标文件(.o文件),是二进制格式。被编译系统处理的每一个C语言源程序,都将最终经过这一处理而得到相应的目标文件。
gcc -c test.s -o test.o
链接(Linking):链接过程将多个目标文以及所需的库文件(.so等)链接成最终的可执行文件(executable file)。
ld -o test.out test.o inc/mymath.o …libraries…
不关心中间过程时可以直接用如下编译指令,达到可执行文件。

gcc hello.c # 编译
./a.out # 执行
  1. char数组的初始化
    char ch_arr[3] = {‘a’, ‘b’, ‘c’}; //字符常量逐个初始化
    char ch_arr[] = {‘a’, ‘b’, ‘c’}; //与前一种等价,用字符常量进行数组元素逐个初始化时,若初值个数与预定的数组长度相同,可以省略数组长度,如后面这种会自动将ch_arr的长度设为3.
    char ch_arr[] = “abc”; 或 char ch_arr[] = {“abc”}; //字符串常量的最后由系统添加一个’\0’,所以ch_arr包含4个元素,这种初始化方式等价于char ch_arr[] = {‘a’, ‘b’, ‘c’, ‘\0’};
    char *ch_arr = “abc”; //在C语言中,"abc"的类型是char[4];在C++中,其类型是 const char[4]。因为数组类型可以当作指针使用,所以该句没有问题。
  2. #progma pack(8)的作用及什么时候使用
    #progma pack(n) 设定变量以n字节对齐方式。不使用编译器对结构(结构体,共用体,类)存储的特殊处理,自己设定变量的对齐方式。
#pragma pack(push) //保存对齐状态
#pragma pack(4)//设定为4字节对齐
struct test
{
char m1;
double m4;
int m3;
};
#pragma pack(pop)//恢复对齐状态

以上结构体占用空间为16字节(1, 8, 补3,1,补3)。改成#pragma pack(8),则结构的大小为24字节。

  1. 系统启动时自动挂载某分区
    linux开机启动时自动挂载的分区通过文件/etc/fstab来描述。通过cat /etc/fstab可以查看挂载情况。该文件有6个字段,分别如下:
    字段1:将要挂载的特定设备或远程文件系统
    字段2:挂载点
    字段3:挂载文件系统
    字段4:文件系统相关联的挂载选项
    字段5:与备份(dump)相关,针对ext2/3/4文件系统,是否要备份,防止断电导致的数据丢失。默认0,不备份
    字段6:指定系统启动时通过fsck检查文件系统的顺序,根文件系统的检查顺序为1,其它为2。默认0,不执行检查。
    手动挂载用mount指令
    df -h可以查看当前系统中挂载情况。

  2. linux系统的进程与优先级
    linux系统中,表示进程优先级的有两个参数,priority(PRI)和nice(NI). 其中PRI是内核动态调整的,用户不能修改。用户可以修改NI来影响PRI。PRI(最终) = PRI(原始) + NI。PRI(最终)的数值越小表示该进程越优先被CPU处理。
    ps -le可以查看这两个数值。
    NI的合法范围是-20–19。普通用户只能调整自己进程的NI,且调整范围是0–19,即只能调高,不能降低。root用户可以调整任意用户的进程,且可以设为负值。

  3. 可重入函数

  4. 对CPU的cache进行flash操作有什么效果

  5. CPU cache的写回策略
    CPU cache分配策略(Cache allocation policy):什么情况下为数据分配Cache。
    –读分配(read allocation)发生在CPU从Cache读取数据时,cache缺失,会分配一个cache line来缓存从主存中读取的数据。Cache都支持都分配。
    –写分配(write allocation)发生在CPU向Cache写数据时,发生cache缺失。若不支持写分配,写指令只会更新主存数据。若支持写分配,则先加载主存数据到Cache,再更新Cache。

Cache更新策略(Cache update policy):CPU执行写操作,cache命中,如何更新数据。
–写直通(write-through):更新Cache数据和主存数据,Cache和主存数据一致。
–写回(write-back):只更新Cache中的数据,并用cache line中的dirty bit记录该cache line是否被更改过,即dirty为置位。只有在Cache line被替换或clean时才会更新主存数据。Cache和主存数据不一致(可能Cache中被修改,而主存中没有)。

/* 下面两个没有用过 */
9. fork函数的返回值
fork,译为派生,分支。fork函数用于将程序分成两个一样的进程,每个进程都启动一个从代码相同位置开始执行的线程。
fork函数能返回两次(父进程和子进程各返回一次),有3种不同的返回值(在父进程中,返回它所创建的子进程ID;子进程中返回0;出错返回负值)。
10. 如何实现互斥

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值