目录
1 数字0
数字 ___000___
字符 ___\0\0\0___
vi显示 ___^@^@^@___
gedit显示 ___\00\00\00___
cat显示 ______
windows显示 ___ ___
2 查看特殊类型的本质
read()和write()的返回值类型是ssize,是谁的别名?
$gcc -E write.c -o wirte.i
$vi write.i
/ssize_t回车
按n继续查找
发现ssize_t是__ssize_t的别名,__size_t是long int的别名。
3 别名的好处
1、好理解
2、数据超出范围时,方便将int改为long:
typedef int data_t; //数据量超出40亿时,将此1处改为long int 即可。
data_t all;
data_t am;
data_t pm;
当然,%d要改为%ld
4 pstree 进程快照
执行pstree命令,得到进程快照,看到里面有pstree进程,但其实pstree进程已经结束。
5 段错误(核心已转储)
uc_03*_段错误 Segmentation fault(core dumped)-CSDN博客
6 吐核
生成转储文件,俗称吐核
7 void* arg
泛型指针,可传递任意类型、任意数量的参数
8 进程、线程
进程是内存中的代码和数据,是资源分配的最小单位。进程表、映射...
线程是执行代码的过程,是执行调度的最小单位。调度器...
进程是线程的容器。
9 file path
"run.sh" 是file
"./run.sh" 是path
10 返回值特殊的函数
fork() 调用1次,返回2次
exit() _exit() 不返回(谁调谁死,在哪调在哪死)
execl() 不返回
11 忽略 屏蔽
信号的忽略很容易理解。
信号的屏蔽,是使信号被阻塞于未决状态,后续还是还会递送的。
可以参考:信号掩码的意义:
当信号正在执行类似更新数据库这样的敏感任务时,可能并不希望被某些信号中断。这时可以通过信号掩码暂时屏蔽而非忽略这些信号,使其一旦产生即被阻塞于未决状态(即屏蔽),待任务完成后,再回过头来处理这些信号。
12 僵尸进程
进程死后(如被kill掉)进程仍存在,是僵尸进程,需收尸。
存不存在,和死不死没关系。概念要清晰~
13 set
set~ 动词,设置 例如:setsockopt()
~set 名字,集 例如:sigfillset()
14 void*
void printm(void* buf,size_t size){...} 泛化类型,啥都能接,在函数代码中再强转即可。
15 sizeof(buf) - 1
char buf[64] = {};
fgets(buf,sizeof(buf),stdin); / /这里不用减1,fgets()会自动减