****linux的特性
开放
多用户
多任务
良好的用户界面
设备独立性
丰富的网络功能
可靠的系统安全
良好的可移植性
****实际操作 (http://www.php100.com/html/webkaifa/Linux/2009/1106/3485.html命令大全的网站)
一般共享的文件都挂在在/mnt/下
tree / -L 2 查看根目录下的2级
tree / |less 查看目录树 通过/bin即可查找到bin
shift + ctrl +N 会弹出一个新的命令行窗口
akaedu@ubuntu:~$ 用户名@计算机名:路径 用户等级提示符
uname -r 可以查找版本号
uname -a 内核,操作系统名称,主机名称
uname -n系统名称
*******文件和目录的操作命令
ls命令
ls -a 显示所有文件包括隐藏文件
ls -l 列出文件的详细信息
ls -R 显示目录下所有子目录的文件
ls -alh 显示文件大小是以k为单位
man ls 进入命令使用手册,通过j下移,k上移,q退出
cd 命令
cd /切换到根目录 ********************(前面有一个/表示绝对路径)
cd ..切换到上一级目录
cd ~ 切换到用户目录,回到home目录
cd -回到切换前的路径
pwd 当前所在目录
touch命令(编译文件时会使用)
功能:创建文件,更新时间戳(根据时间戳记来查看是否编译了)
使用:touch 文件名
ln命令
功能:创建链接
ln -s才创建软链接
ln -s 源 目标(源必须是绝对路径)
(删除以后并不影响源文件)
例如:ln -s /bin/less /usr/local/bin/less
ln -s file1 file2 创建硬链接
man 1 printf系统调用
2 系统调用
man 3 open 可以查看库函数
man -k printf 查到所有函数printf的文件
尝试使用man /etc/passwd
cp命令
功能:copy文件
cp source target 将文件source复制为target (target可以使路径)
cp -av soure_dir target_dir 将整个目录复制,两个目录完全一样
cp -R source_cddir target_dir 将整个目录复制,两个目录完全一样
**如果复制目录,必须加上-a或-R选项
rm命令
rm file删除某一个文件
mv命令
mv source target 将文件source更名为target
也是移动命令
vim 文件名 编辑文件内容
之后按Esc键,之后按:wq即可保存退出wim编辑环境
diff命令
功能:比较文件内容
diff dir1 dir2 比较目录1和目录2的文件是否一样
cat a.txt 查看文件内容
patch 命令
打补丁修补文件
diff a.txt b.txt >patch.txt生成差异文件到patch.txt
patch a.txt patch.txt
grep命令
在文件中查找相应字符
mkdir命令
-p创建子目录
rmdir test/test2 可以删除子目录
find命令
find 路径 -name "文件名"
find 路径 -name "文件名" -exec grep -inH "关键字" {} ;
find path -option [-print] [-exec -ok command] {} ;
chown命令
改变文件的所有者
chown akaedu /opt
chown 用户:组 目录/文件
chown -R改变目录下所有子目录的所有者
做开发的一般有个习惯就是把开发相关的放在opt文件,比如kernel文件
find ./ -name "*.c" -exec grep -inH "main" {};查找main函数的位置
chmod命令
改变文件的权限
chmod 666(用户:组:其他) file ***********将文件file设置为可读写 ******6代表421,即rwx(可读可写可执行)
x权限表示可不可以进到这个目录,这个文件是否可执行
tar -cvf <DSTfiler,ame.tar><SRCfilename>压缩文件或目录
-c创建新的档案文件
-v详细报告tar处理的文件信息
-f使用档案文件或设备,这个选项通常是必选的
-z用gzip来压缩或解压缩文件
tar命令
解压缩或压缩文件
tar -cvf 压缩后的文件名.tar 要压缩的文件名
tar -cvf 压缩后文件名.tar.bz2 要压缩的文件名
tar -cvjf 压缩后文件名.tar.gz 要压缩的文件名
tar -xvjf 解压缩文件名.tar.bz2
tar -xvzf 解压缩文件名.tar.gz
自动补全 用TAB命令
命令别名
命令历史 方向键可以查看历史上使用过的命令****历史放置的文件在 ~/.bash_history
通过history来查看使用过的命令
history -c 清空历史命令
!数字 用来查找在历史中使用过的命令
快捷方式
1.ctrl + U 清空到行首
2.ctrl + L 清空shell,当前命令变成行首
3.ctrl + K 清空到行尾
快速定位
******命令的执行次序
; 用;间隔的各命令按顺序依次执行
&& 前后命令的执行存在“逻辑与”关系,只有&&前面的命令执行成功后,它后面的命令才会执行
|| 前后的命令执行存在“逻辑或”关系,只有||前面的命令失败后,它后面的命令才被执行
; 的优先级最低
||和&&具有相同的优先级
可以使用()改变优先级顺序
*********管道
将前一个命令的输出传送给后一个命令,作为另一个命令的输入
方法:命令1|命令2
*******重定向
STDIN 0(代号) 标准输入 键盘 命令在执行时所要的输入数据通过它来取得
STDOUT 1 标准输出 显示器
STDERR 2
< $ ls -l /tmp >mydir 覆盖原来的内容 history >test.txt将历史命令写入到test.txt文件中,若文件不存在则自动创建
<< $ ls -l /etc >>mydir在原来的基础上 cat test.txt >> teat.txt 将test.txt的文件中的内容追加到teat.txt,不存在创建
cat a.txt || cat b.txt >c.txt 这里如果a.txt存在,则后面的|| cat b.txt>c.txt命令不在执行
********su 命令
变更使用者的身份
whoami查看当前用户名
*******sudo命令
它允许系统管理员分配给普通用户一些合理的“权利”,让它们执行一些只有超级用户或其他特许用户才能完成的任务
比如:运行一些像mount,halt,su之类的命令,或编辑一些系统配置文件
***********ps命令
用来显示瞬间行程的信息
pa ux 显示当前用户的进程
-a 当前终端的进程信息
-A 当前系统的所有进程信息
-H 以树形结构显示进程关系
-u
通常使用 ps -aux
(此时,每一行表示的信息,分别如下:
用户 进程号%cpu的使用率%内存的使用率 虚拟的使用率 实际大小 终端号 状态(s睡眠状态,d不可终结状态,R运行状态 )START开始时间 时间 进程的名称
**********top命令
使用top命令后可以查看到的信息如下:
英文zombie表示僵死的进程
sy系统所使用时间的百分比
id空闲率
toutal 多大的内存
swap交换空间,类似于虚拟内存
PID进程Id号
VURT虚拟内存
I表示空闲状态
COMMAND进程名称
查看系统cpu,内存等使用情况
-i<时间> 设置间隔时间
-u<用户名>指定用户名
-p<进程号>指定进程
-n<次数> 循环显示的次数
ps -aux |grep "vim 查看vim的进程
**********kill命令
kill 9 11305杀死进程
*********mount文件系统挂载命令**********做交叉编译的时候会被用到
功能:文件系统挂载命令
monut [-t vfstype][-o options] device dir
注:建立目录用来作挂载点(mount point)
#mount -t ntfs /dev/sdc1 /mnt/usbhd1
/mnt通常用来挂载
umount用来卸载挂载
*********export命令 ***********export只对当前有效
功能:设置或显示环境变量
**echo $PATH可以显示出环境变量
使用QT时通常要设置QTDIR环境变量
export PATH=$PATH:/home/cxl/day02/
echo $PATH*******显示修改后的环境变量
export PATH=/home/cxl/day02/ ****注意:这里会取消PATH原来的值
***************/etc 相关环境变量的配置文件
语法:export[-fnp][变量名称]=[变量设置值]
参数:
-f 代表[变量名称]中为函数名称
-n删除指定
pc平台上用gcc做开发
ARM-linux-gcc编译成arm指令集
二进制的命令放在环境变量里面
********dmesg
功能:显示开机信息
-c 显示信息后,清除ring ruffer中的内容
-s <缓冲区大小> 与设置为8196,刚好等于ring ruffer的大小
************************网络命令****************
***********ping
功能:测试与目标主机的连通性
window会ping4次
-f 极限检测
-c 数目 :在发送指定数目的包后停止
ping -c 次数 IP地址
*************ifconfig
功能:查看和配置网络设备
参数:
up 启动指定网络设备/网卡
down 关闭指定网络设备/网卡
inconfig eth0 192.168.255.255
ifconfig 网卡名称 down 关闭网卡
ifconfig 网卡名称 ip地址 netmask 掩码
coute add default gw 网关IP
手动配置ip在首选项的网络连接中,点击Auto eth4 ,点击“编辑”,选择IPV4设置,选择手动,添加IP地址即可
**************netstat命令
功能:显示网络连接,路由表,接口状态,网络链路等信息
-a显示所有选项
-at 列出所有tcp端口
-au 列出所有UDP端口
-lt 列出所有tcp监听的端口
-lu列出所有的udp监听的端口
-s列出端口的统计信息
在使用上面的命令可以查看到:nfs是一种网络文件系统的类型
***********telnet命令
功能:远端登陆
1.可以通过telnet登陆到开发板,对开发板进行操作
2.检测某个端口是否开放
***********minicom命令
功能:串口工具
linux下的minicom的功能与windows下的超级终端功能相似,可以通过串口控制外部的硬件设备,适合在linux通过超级终端进行管理
***************cat命令
功能:文本文件查看和连接工具
cat a.txt 显示文件内容
cat a.txt b.txt 将文件a.txt 和b.txt分两行输出
cat a.txt b.txt -n 将文件内容标号输出
-n 对输出的文件进行标号
-b 对非空行进行编号
-s 有连续的空行,用一个空白行代替
==
*************more命令
功能:和cat命令一样,都是用来查看文件里的内容,大有所不同的时more命令时按页来查看
分屏查看内容
space向下翻页
b上翻页
q退出
*********************less命令
功能:使用less可以随意浏览文件,而more命令只能向前移动不能向后移动
进入less中之后可以使用 “/要搜索的内容” 向下搜索
“?要搜索的内容”向上搜索
k 光标上移动
j光标下移动
-N 参数N加加行号
*******************grep命令
功能:文件搜索工具,它能使用正则表达式搜索文本,并把匹配的行打印在我们的标准输出设备上面
-i 不区分大小写
-I 区分大小写
-c 只输出匹配行的计数
-H 显示匹配行的文件名和路径
-n 显示匹配行及行号
-v 反向(打印所有没有匹配的行)
ps -aux >test
grep -n "PID" test
*****************set命令
功能:行编辑工具,行为单位进行处理,可以将数据进行替换、删除、新增、选取等特定工作
a:新增
******************wc命令
功能:统计指定文件中的字节数、字数、行数
(可以和ls命令结合使用)
-c统计字节数
-l统计行数
-m统计字符数
ps -aux |wc -l查看当前有多少个任务或进程
***********df命令
检查文件系统的磁盘空间占用情况
**************vim命令
功能:一个程序员的文本编辑器
+t{tag} 被编辑的文件和光标的初始位置
进入vi filename
vim-删除、编辑、保存和退出、查找&替换
Visual mode选择模式
vim高阶-文件比较、帮助&文档
配置文件&插件
1.set mu
2.syntax on
ctags插件
列编辑
括号&头文件
*******************************************
Permission denied表示没有权限
/usr/bin/remotinatio这个文件没有权限删除
terminitor安装时使用的命令./setup.py install
***********vim编辑器
u是返回操作,用于操作失误
*******vim初级》模式
1.进入vi filename 到一般模式
2.输入 iao 插入模式 ESC键回到一般模式
3. : 进入命令模式 以回车结束运行 回到一般模式(注意退出插入模式之后进入命令模式
4.输入:wq 退出
*************vim初级》移动
h方向左键
j方向下键
k方向上键
l方向右键
$移动到行尾
0移动到行首
H移动到屏幕上端
M移动到屏幕中央
L移动到屏幕下端
:set nu 设置行号 (设置仅对本次有效)
: set nonu 取消行号
gg 到第一行
G 到最后一行
nG 到第n行
:n 到第n行
**********vim初级》删除
x 删除光标所在处字符
nx 删除光标所在处后n个字符
dd 删除光标所在行,ndd删除n行
D 删除一行中光标以后内容
:n1,n2d 删除指定位置处的
ndd删除n行
ggdG 删除所有行
**************vim初级》复制&粘贴
yy、Y 复制当前行
nyy 、nY复制当前行以下n行
dd剪切当前行
ndd剪切当前行以下n行
P,p 粘贴在当前光标所在行上或行下
yw 复制单词
********vim初级》输入文本
i进入插入模式
a在光标后附加文本
A在本行行、末附加文本
i在光标之前插入文本
I在本行开始插入文本
o在光标下插入新行***********用的比较多
O在光标上插入新行
************vim初级》保存&退出
:w 保存修改,不退出文件编辑状态
:wq保存退出
:w new_filename 另存为指定文件
***********vim高级》查找&替换
/string 向前搜索指定字符串,搜索时忽略大小写:set ic
n 搜索指定字符串的下一个出现的位置
N 在关键字向上搜索
:s/cat/dog 替换当前行中的cat关键字
:20,25s/cat/dog/g 替换20到25行找到的匹配字符
***********vim高级》撤销(在一般模式下操作)
r取消光标所在处字符
R从光标所在处开始替换字符,按ESC结束
u取消上一步操作
**********vim的另两种模式
visual mode 即选择模式(注意跟用鼠标选择不同,用v,V,C-v或C-q进入Select mode鼠标选择
Replace mode 在Normal mode下按R进入,按ESC返回Normal mode
*************文件比较
vimdiff (找两个文档中不一样的地方会很方便)
使用a键可以打开折叠
ctrl w K(把当前窗口移动到最上边)
ctrl w H(把当前窗口移动到最左边)
ctrl w J(把当前窗口移动到最下边)
*************vim高级》二进制文件
vim打开二进制文件
:%! xxd 转换成16进制文件(%号是全局的概念)
***************vim高级》标签&分割
:tabnew创建一个新的标签
:tabc 关闭当前的tab
:tabo 关闭所有其他的tab
:tabs 查看所有打开的tab
:tabp 前一个
:tabn 后一个
tabe filename 新标签打开filename
tabe . 新标签打开路径
gt 标签切换
split filename 以水平分割的方式
vsplit filename 以垂直分割的方式
ctrl + hjkl 分割窗口切换
ctrl + +/-/= 调整窗口大小
***********帮助&文档
:h keyword(关键字)进入帮助首页,ctrl+】进行向后移动
vimtutor
在插入模式下输入数据,之后在普通模式下使用.即可添加插入状态输入的数据
********vim配置
set nu
syntax on
set guifont =DejaVuSansMono12
set sorttabstop=4
set guioptions-=T
set cindent
set encoding=utf-8
colorscheme delek
vim的配置文件~/etc/vimrc
****************ctags 插件(行数
前提用ctags -R文件
先生成ctags文件,按Ctrl+】就进入到行号的定义中去了
Ctrl+T返回到上次跳转前的位置
免去了打开不同的文档,不断查找的麻烦。
************折叠&缩进&高亮
缩进= gg=G 整个文档进行缩进
自动补全 光标移动到要补全的 ,在插入模式下,按Ctrl +n
Text indent
:set autoindent
:set smartindent
:set shiftwidth
在修改函数时插入模式按Ctrl+N自动补全
***************程序员篇*列编辑
按两次==号就会自定义缩进,程序中代码向后移动
列的编辑Ctrl+v ,选择要删除的部分之后,按D健就可以删除
Ctrl+v进入列编辑状态,选择要插入的行,shift+i,ESC键,刚刚选中的就被注释了
删除列
1.光标定位到要操作的地方
2.Ctrl +v进入“可视块”模式,选取这一列进行
*********************vim程序员篇*括号&头文件
gf跳转到头文件中去 Ctrl +o跳转回来
%作用:括号匹配
#
;,
/usr/include/string.h
Ctrl+G会把当前的文件名打印出来
*****************GCC的基本特点
支持多种硬件架构
x86-64
Alpha
ARM
Motorola 68000
MIPS
PDP-10/11
PowerPC
System/370-390
SPARC
VAX
gcc编译的代码是在x86系统上运行
arm-linux-gcov编写的是裸板程序
arm-linux-gcc hello.c -o hello
ELF不仅包含数据,还包含头(这个头至关重要,不然开发板不能运行)
FTP将开发板和PC机连接起来(注意:要配置开发板和PC机的IP地址)
使用ftp》put hello 将文件放到开发板上面,在root@FriendlyARm plg文件中查找运行
gcc支持的操作系统
Unix
Linux
BSDAndroid
Mac Os X
window
gcc -v查看gcc的版本信息
*************嵌入式中的qt
是一种人机交互界面,说简单点就是一个运行界面!Liunx不像Windows有自己的界面,它的操作主要是命令行模式,就像早期的DOS,Qt就是一个程序,可以更好的实现人机交互控制!
*************构建过程
1.预编译 2.编译(.s) 3.汇编 4.链接
预编译》预编译之后的文件
编译》生成跟机器相关的汇编文件
》之后生成机器指令码,即.o文件
链接》把需要的动态库或静态库包含进来 windows下是PE格式的加载的文 件,linux下是ELF文件
***********文件名后缀
.i 预处理后的c语言源代码文件
.a 静态库文件
.so 共享库(动态库)文件(相当于windows系统里的.dll文件)
.dll(windows系统的库文件)
编译选项
-o 指定输出文件(o就是output的意思)
例如:gcc hello.c -o hello
-E 预编译,缺省输出到屏幕,用-o指定输出文件
gcc -E hello.c -o hello.i
-s编译,将高级语言文件编译成汇编语言文件
gcc -S hello.c
-c汇编,将汇编语言文件汇编成机器语言文件
gcc -c hello.c
-wall
gcc -Wall wall.c
-std 设置C89或C99规范
gcc -std=C99 werror.c
-v 查看gcc的版本
-g产生调试信息
gcc -g cpp.c
file 命令查看当前文件的指令格式
gcc -s生成一个汇编,但是输入是预编译以后的文件
vim test.c +8 会打开编辑器,并把光标定位到第8行
gf跳转到相应的头文件
<>会在编译的环境变量中去搜索
**************头文件
类型别名
外部变量声明
函数声明
函数定义不要写在头文件里,但是可以声明
声明,是声明一个标识的类型,是给编译器使用
定义,是要分配地址的,不能多次重复定义一个东西
(例如:c++中的类相当于声明,不分配存储空间)
gcc math.c alc.c -I
头文件的系统目录
/usr/include
/usr/local/include
编写文件中最好使用
#ifdef _ADD_H_
#define _ADD_H_
函数声明语句
#endif
*********预处理指令
#undef 删除宏
#ifdef 如果宏已定义
#ifndef 如果宏未定义
#else否则,与#if/#ifdef/#ifndef 配合使用
#elif 否则如果
#endif 结束判定
#error产生错误,结束预处理
#warning 产生警告,不结束预处理
#line 指定行号
#pragma
设定编译器的状态或指示编译器的操作
例如
#pragma GCC dependency "dep.c"
#pragma GCC poison goto 不能用goto语句,如果编译的过程中有goto语句就会报错
#pragma pack(1) 对齐操作********下面有演示
tabe ./adder.h
定义不要放在.h文件当中
struct S
{
char c1;
int i;
char c2;
};在存储器中存放的字节是12个字节,不符合我们的常识
#pragma pack(1)可以通过这个语句来设定上面存储结构的对齐方式,要求括号里面的值是2的较小次方
*************环境变量
extern int main(int argc,char **argv)
//这里的argc 参数的个数,argv字符串的指针,指向的是参数的字符串
{
}
作业:
主函数的原型
int main(int argc,char * argc[],char * envp[])
int main(int argc ,char *argv[])
第一个参数:命令行参数的个数
第二个参数:字符指针数组,用于存放每个参数
第三个参数:字符指针数组,表示环境表的首地址
练习:编写主函数
$./mychat
调用是时间的语句如下:
printf(" tICQ v0.1");
printf("
Date:");
printf(__DATE__);
printf(" Time:");
printf("__TIME__);
printf("
");
**************GDB程序调试
GDB作为父进程其doi功能后,创建被调试程序为子程序,通过ptrace系统调用和一系列的信号交互来观察和控制被调试进程的运行,检查和修改其内存环境
运行程序
保证程序的正常运行
******功能概述
编译调试程序
gcc -g hello.c -o hello 生成带调试信息的文件
GDB启动(有如下四种方式,第四种不常用)
gdb
gdb [program_name]
gdb [pid] 注:pid指的是进程号
gdb -c [core_file_name]********不常用
按q即可退出调试界面
b设置断点
s或n
c 跑到下个断点
info brekpoint 显示设置了多少个断点
si 进入到程序中去
p+变量名 把当前变量打印出来
p+变量名= 即可给变量赋值
初始化一个结构体
typedef struct _cmd
{
const char *option;
const char *helpinfo;
cb_t call_bak;
}cmd_t;
#endif
! ./cmd在文件中执行外面生成的文件(cmd便是文件名)
void cmd_help()
{
//遍历结构体数组里面的helpinfo
printf(" <help info>
");
printf("SYNOPSIS:mychat [OPTION] [IP]
");
printf("DESCRIPTION:
");
for(i=0;i<cmd_table_num-1;i++)
{
printf(" %s
",cmd_table[i].helpinfo);
}
}
const cmd_t
int main()
{
cmd_help();
return 0;
}
tabe ./cmd.h
*****************************系统调用
*************date命令
查看当前的日期
***********time
real 实际运行时间*******(运行时间通常大于用户态和内核态,因为有等待时间)
user 用户态
sys 内核态,内核运行时间,牵涉打印输出,系统调用
(打印输入输出,linux的驱动的运行就要用到内核态,这时要小心编写程序,不然系统会由于程序错误而崩溃)
学习linux驱动开发要注意一下的学习
1.对外提供的借口
open read close对外提供的借口
2.驱动之间的资源的竞争
用什么样的保护机制
man syscall查看系统调用的命令
int syscall(int number,...)函数内部有一个很特殊的系统调用号
tid=syscall(SYS_gettid); SYS_gettid 这是系统调用号
可以通过man gettid来查看gettid的说明
man getuid 的用法是获取用户的id(身份证明)
********************Unix应用
Unix/linux系统的大部分功能都是通过系统调用来实现的
如open.close
它的系统调用已经封装称函数的形式
用户态:应用程序(vi.emacs.gftp.firefox等),标准和第三方库(c/c++,Qt,X11等)
内核态:系统调用(内核提供给外界访问的接口函数,调用这些函数使进程进入内核态),系统内核(驱动程序,系统服务等)
注:系统调用很好时间
time a.out 测试应用程序的运行时间分配
vim /etc/passwd即可打开一个文件,里面包含以下信息:
用户名,密码,用户的id ,用户组的id ,home目录,shell的环境bash
man getpwuid 查看获取用户信息的用法
getpwuid
*****************文件系统与文件
存在硬盘上面,***************物理结构:驱动臂,盘片,主轴(寻道用的),磁头(写数据用)
不同的圆圈叫作磁道
每个磁道按照512字节等分,叫作扇区
盘面,磁道,扇区查找到数据的确定位置
*******************逻辑结构,
一个磁盘驱动器被划分成一到多个分区,其中每个分区上都有自己的文件系统
每个文件系统包括:
1.引导块(计算机加电启动时,ROM BIOS从这里读取可执行代码和数据,已完成操作系统自举),
2.超级块(记录文件系统的整体信息,如文件系统的格式和大小,i节点和数据块
的总量,使用量和剩余量等),
3.若干柱面组,它包括:
超级块副本,柱面组信息,i节点映射表,块位图,i节点表(存储的是i节点),数据块集
i节点就是文件的索引节点,访问文件的时候通常要找到该文件的i节点,i节点通过i节点的映射表找到物理位置
文件名和i节点的对应关系通常记录在文件的目录中,纹路文件中的一条这样的记录就是一个硬连接
ls -i/etc
打开文件需要知道文件名和它的路径
i节点里面的信息:
文件的类型和权限
文件的硬链接数
文件的用户和组
文件的字节大小
文件的最后访问时间,最后修改时间和最后修改时间
文件数据块索引表
数据块:存储文件的实际内容数据
文件块:存储普通文件的内容数据
目录快:存储目录文件的内容数据
间接块:
***文件访问流程
***普通文件
普通文件
目录文件
系统要打开一个文件时,会从根目录开始,遍历每一个子目录,查找i节点号,(根节点由于没有父目录,所以它的i节点号会保存在一个固定的位置)
.和..分别映射文件的本身和它父目录的i节点号
*************底层库函数
open 打开并创建一个文件
creat 建立一个文件
close
read 从文件读入数据
write 对文件写数据
lseek 在文件中移动读写文件
**************open函数
#include<fcntl.h> 其中fcntl 包含control的缩写
int open(const char *pathname(文件名),int flags(打开的模式,操作方式));
int open(const char *pathname,int flags,mode_mode);
int creat(const char *pathname, mode_t mode);
1.O_RDONLY 另读模式
2.O_WRONLY 另写模式
3.O_RDWR 读写模式
如果没有错误,会返回文件描述(文件描述符是int类型),有错返回-1
fd标志 文件指针(标志位对应文件指针)
fd 0 (注:fd占一个字节,0~255,共256)
fd 1
fd 2
文件表中包含:文件状态标志,当前文件偏移量,v节点指针(v节点信息,i节点信息,文件长度..)
***********文件读写操作
使用文件操作函数fopen(),fprintf(),fget()完成如下配置文件的读写
可以通过cat localuser.ini查看一下内容
USER=名字拼音
************整合文件
1.定义一个全局字符数组
2.然后将它返回回来
*******makefile文件,管理工程
作者Richard Stallman ,整个gcc就是这个作者编写
1984年发起GNU计划
makefile的核心是“文件依赖性”
makefile的好处是“自动化编译”
一旦写好后,只需要一个make命令,整个项目完全自动编译,极大的提到了开发效率
***********makefile语法规则(尽量将.o文件生成出来)
根据时间戳记来看文件是否发生了改变
target .. prerequisites ...
command
command
target,prerequisites,command组成一个完整的规则
多个规则组成了makefile
**************************周四
man syscallsxitong 系统调用号 getuid
ret=syscall(366(新增加的系统调用号),100,200(系统调用函数的参数));
每用open打开文件就会创建一次记录
makefile文件中
clean :
rm -vf *o mychat 这类似于伪指令
config记录的是哪几项被选中了
PROG=mychat
OBJ=main.o cmd.o sysuser.o localuser.o
#CC=gcc(这样的话,mankefile文件中所有gcc的位置都可以用CC来替代)
CC=arm-linux-gcc(这里选择相应的硬件平台)
(注意:以上两行个以决定开发环境)
$PROG:$OBJ
gcc -o $PROG $OBJ
%.o:%.c
$(CC)-c -o $@ $<
**********arm-linux-gcc
ls /opt/FriendlyARM/toolschain/4.4.3/bin/
如果要编译的话要把上述路径加到环境变量中去
export PATH=$PATH:/opt/FriendlyARM/toolschain/4.4.3/bin/
使用export将它加到环境变量中去,这样就可以使用arm-linux-gcc
**************make是执行makefile文件
make会在当前目录下找到名为makefile或Makefile文件
2.找到文件中的第一个target
3.递归的检查target的依赖,直到最后一层
4.如果target不存在或者发生更新,执行后面的指令
**************进程和线程的基本概念
运行态的程序称为进程
进程的分类:
1.交互式进程(由shell启动,可前台,后台运行,通过终端接收用户的输入)
2.批处理进程
3.守护进程
进程之间有父子关系
调度进程(PID=0)(注意:从上往下,父进程到子进程)
init(PID=1)
xinetd
in.telnetd 远程登录
login 用户名/口令
bash shell命令
vi/gcc/a.out/...
**************fork
创建子进程
程序原型如下:
#include<unistd.h>
pid_t fork(void)
成功分别在父子进程中返回子程序的PID和0,失败返回-1
调用一次会返回两次
第一次返回子进程的ID
第二次返回0,子进程创建成功的编号
子进程是附近成的不完全副本(副本:父进程的拷贝,数据区,DSS区,堆栈区,代码区没有拷,因为他们是公用的
fork函数成功返回以后,父子进程各自独立运行,它被调用的先后顺序并不确定
pid_t pid=fork();
if(pid==-1)
perror("fork");exit(EXIT_FAILURE);
if(pid==0)
{
子进程执行的代码;
}
else
{
父进程执行的代码;
}
父子进程都执行的代码;
************主线程
从main函数返回就可使函数结束
************线程与线程的编程
线程是程序的执行路线,或者说是进程的子任务
一个进程可以同时拥有多个线程
线程是共享进程的所有代码等,唯一有的资源是栈,来保存自己当前的运行状态
************POSIX线程
早起unix厂商各自提供私有的线程库版本
使用prthread需要包含pthread.h
同事连一个共享库
***********创建一个线程
#include<prthread.h>
int pthread create create(prhread_t*thread,(输出线程的id号)
const pthread_attr_t *attr,(状态,属性)
void *(*start_routine)(void*),void*arg);
成功返回0,失败返回错误码
start_routine:线程过程函数指针,启动线程其实就是调用函数
arg:传递给线程过程函数的参数,线程过程函数的调用者是系统内核
main函数可以视为主线程的线程函数
fork调用的一个奇妙之处就是它仅仅被调用一次,却能够返回两次,它可能有三种不同的返回值:
1)在父进程中,fork返回新创建子进程的进程ID;
2)在子进程中,fork返回0;
3)如果出现错误,fork返回一个负值;
#include<pthread.h>
void *task()
{
int i=0;
for(i=0;i<100;i++)
{
printf("子线程 i:%d
",i);
}
}
int main()
{
prthread_t prid;
pthread_create(&ptid,NULL,task,NULL);
int i=0;
for(i=0;i<100;i++)
printf("主线程 i:%d
",i);
}