linux Day3

修改文件后要让文件生效
. 文件

调试gdb

gdb 文件 core文件
gdb –q 文件 core文件 关闭无用信息

gdb 文件
run 在gdb下运行
where 显示出错的代码
list 显示出错代码的上下
print 显示变量的值
break 设置断点 +行号/+函数名/+文件名:行号or函数名
continue 从断点后继续执行
delete 删除一个断点
info break 查看断点
quit 推出调试
set variable varname = value 设置变量的值
step 单步进入函数
next 当遇到函数时,函数当成一条语句
return+数据 停止当前函数,数据为返回值

Stack 栈

1
2
3
int abc(int a,int b){
return a + b;
}

_stdcall Pascal默认调用函数方式
函数从右向左压入栈
函数参数由被调用者压入或弹出栈

1
int _attribute_((stdcall)) abc(int a,int b)

_cdecl c/c++默认调用函数方式
函数从右向左压入栈
函数参数由被调用者压入或弹出栈

1
int _attribute_((cdecl)) abc(int a,int b)

如果用free释放“new创建的动态对象”,那么该对象因无法执行析构函数而可能导致程序出错。
如果用delete释放“malloc申请的动态内存”,结果也会导致程序出错,但是该程序的可读性很差。
所以new/delete必须配对使用,malloc/free也一样。
看看《Effective C++》这个吧。
摘一段:
把new和delete 与malloc和 free混在一起用也是个坏想法。
对一个用new获取来的指针调用 free,或者对一个用 malloc 获取来的指针调用 delete,其后果是不可预测的。大家都知道“不可预测”的意思:它可能在开发阶段工作良好,在测试阶段工作良好,但也可能会最后在你最重要的客户的脸上爆炸。

内存分配

calloc(sizeof(data type),num) 分配内存并置零
realloc 分配的内存连续,如果不够,会找个新内存,把copy过去
realloc不初始化
不要用悬空指针

1
char *s = NULL; free(s); s = NULL;释放完再置为空

不建议使用scanf,无法输入空格,不检测越界问题

1
2
3
4
5
6
7
8
9
10
11
12
#include <stdio.h>
#include <stdlib.h>
int main()
{
char *longNum1 = (char*)malloc(10);
char *longNum2 = (char*)malloc(10);
scanf("%9s",longNum1);
scanf("%9s",longNum2);
printf("%s\n",longNum1);
printf("%s\n",longNum2);
return 0;
}

用read(STDIN_FILENO,buf, sizeof(buf))
标准输入(standard input)的文件描述符是 0,标准输出(standard output)是 1,标准错误(standard error)是 2。

open

open(file, flags)
Flags:O_RDONLY,O_WRONLY,O_RDWR,O_CREAT,O_APPEND
成功后返回一个文件描述符
open失败后会返回-1,并设置errno变量
close() 关闭

tty 查看屏幕位置
file+文件 查看文件类型
cat abc.cpp > a.txt 将abc的结果 输出到a.txt
chmod 000 file 修改权限 000 expression permission denied
sleep(1) 延迟1s
usleep() 微秒

linux Day2

int main(int argc,char *argv[])

argc 代表参数个数
a.out 1 2 表示三个参数
argv 表示指向参数的指针数组

数组指针与指针数组

int (p)[] 数组指针(行指针)类似于函数指针
int
p[] 指针数组

gcc指令

gcc –o hello hello.c 编译hello.c 文件生成hello文件
gcc –o hello1.c –E hello.c 只进行预编译,预编译将结果输出到hello1.c文件中
gcc –o hello.o –c hello1.c 只进行编译不链接
gcc –o hello hello.o 连接
-o filename 输出文件名
-g 包含调试信息
-I 连接指定库文件
-O 优化编译后的代码
-w 关闭所有警告
-Wall 开启所有警告
编译c++文件
连接的时候 gcc –o hello hello.o –lstdc++

编译

预编译->编译->连接
预编译:头文件
编译:生成目标代理 *.o
连接:连接库代码,生成可执行文件

ldd+执行文件 查看用到哪些库文件
nm+执行文件 列出某些文件中的符号
c++在编译完代码后函数名称会发生改变,主要是由于函数重载,所以c++写不了dll文件

安装文件

rpm –ivh 安装软件
rpm –e 卸载软件

makefile规则

1
2
3
4
5
start:hello.o            表示需要依赖 .o文件
gcc &ndash;o hello hello.o
@echo &lsquo;--------------------------&lsquo; 表示只输出结果
hello.o:
gcc &ndash;o hello.o &ndash;c hello.c

注意不是空格键而是tab键
make执行文件
make target 执行表号下的语句

变量varname=some_text
$(varname)引用该变量
例如:CC=gcc
gcc 改为 $(CC)

1
2
3
4
CC=gcc  
SRCS=hello.c
OBJS=$(SRCS:.c=.o) 将SRCS变量中的.c 替代为 .o
EXEC=hello

模式规则
.SUFFIXES:.c .o 便是两个文件有关联
表示任意x.c文件与x.o文件

1
- .c.o:  任何x.o文件都从x.c编译而来

例子:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
.SUFFIXES:.c .o    //.c和.o建立关联
CC=gcc
SRCS=hello.c\
add.c //同时编译两个.c文件
OBJS=$(SRCS:.c=.o) 将SRCS变量中的.c 替代为 .o //ORJS=hello.o add.o
EXEC=hello
start:$(OBJS) //依赖hello.o add.o
$(CC) &ndash;o $(EXEC) $(OBJS)
@echo &lsquo;---------------------ok---------------------&lsquo;
.c.o:
$(CC) -o $@ -c $&lt; //自动根据$(OBJS) 中.o的数量循环编译, 直到编
&nbsp; //译完所有的.c文件
clean:
Rm &ndash;f $(OBJS)

常见的make错误

No rule to make target ‘target’ .Stop
没有规则可以用
;target; is up to date
target 相关文件没有变化
command : Command not found
make找不到命令
missing separator. Stop.
空格与tab的问题

linux Day1

关机

shutdown –h now
poweroff

显示文件

ls –a 显示所有文件
ls –l 详细显示文件
ls –al 组合使用
dir /a windows 平台

1
- 表示常规文件;d 表示目录;c 便是字符设备文件;b 表示块设备文件;s 表示管道文件;l 表示连接文件

ls | more 表示分页显示
ls > 文件 创建文件

目录

cd .. 回到上一级
cd 回到起始目录
cd / 回到根目录
pwd 显示目录
cat+文件 看文件内容

查找文件内容

grep+参数+内容+文件
-n 显示所在行
-v 显示出所在行外的所有行

查找文件

find +目录 –name 查找目录下是否有这个名字的文件
find+目录 –user 查找目录下是否与这个人的文件

移除文件

rm+参数+文件 移除文件
-f 不显示删除信息
-r 删文件夹

1
*              删除所有文件

拷贝文件

cp+目标文件+生成文件

移动文件

mv+移动文件+目标文件 用此条命令可以改变移动文件的名字

查看进程

ps –a 查看所有进程
ps –u 显示进程所有信息
ps –x 显示没有控制终端的进程
top 显示类似任务管理器

查看当前用户

whoami

查看登陆用户

who

归档管理

tar+参数+打包文件名+文件
-cvf 打包
-xvf 解包

压缩

gzip+文件 压缩文件
gzip –d + 文件 解压文件

帮助

man+命令 man+参数+命令

  1. General commands
  2. System calls
  3. Library functions, covering in particular the C standard library
  4. Special files (usually devices, those found in /dev) and drivers
  5. File formats and conventions
  6. Games and screensavers
  7. Miscellanea
  8. System administration commands and daemons

建立用户

useradd –d /home/test5 tes5
passwd test5 建立密码
su – test5 切换到test5用户
su – 切换到root

让linux在当前目录寻找

  1. cd
  2. vi .bash_profile
  3. 在path后面加:.代表在当前目录寻找
  4. :wq
  5. 让文件生效 . .bash_profile 每个用户都有各自的profile文件

网络设置

nmtui 图形化设置界面

清屏操作

clear
cls windows 平台

千里之行始于足下

1
2
3
    千里之行,始于足下。谓走一千里路,也是从迈第一步开始的。比喻事情是从头做起,逐步进行的。
语出老子·《道德经》·第六十四章:“合抱之木,生于毫末;九层之台,起于垒土;千里之行,始于足下。”
易《温尧卿等授官赐绯充沧景江陵判官制》:“夫千里之行,始于足下。苟自强不息,亦何远而不届哉?”



1
2
    春秋时期,著名的哲学家老子根据事物的发展规律提出谨小慎微和慎终如始的主张,他主张:处理问题要在它未发生以前。
治理国家要在未乱之前。合抱的大树是细小的幼苗长成,九层的高台是一筐一筐泥土砌成的,千里远的行程是从脚下开始的。