达内培训课程记录-程序员宅基地

技术标签: shell  开发工具  操作系统  

****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 =DejaVu\Sans\Mono\12
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("\t\ttICQ v0.1");
printf("\nDate:");
printf(__DATE__);
printf("\tTime:");
printf("__TIME__);
printf("\n");


**************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("\t\t<help info>\n");
    printf("SYNOPSIS:mychat [OPTION] [IP]\n");
    printf("DESCRIPTION:\n");
   
    for(i=0;i<cmd_table_num-1;i++)
    {
        printf("\t %s \n",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\n",i);
    }
}

 

int main()
{
    prthread_t prid;
    pthread_create(&ptid,NULL,task,NULL);
   
    int i=0;
    for(i=0;i<100;i++)
        printf("主线程 i:%d\n",i);

}

转载于:https://www.cnblogs.com/xiaoshi-com/p/4832483.html

版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接:https://blog.csdn.net/weixin_34362790/article/details/93643259

智能推荐

攻防世界_难度8_happy_puzzle_攻防世界困难模式攻略图文-程序员宅基地

文章浏览阅读645次。这个肯定是末尾的IDAT了,因为IDAT必须要满了才会开始一下个IDAT,这个明显就是末尾的IDAT了。,对应下面的create_head()代码。,对应下面的create_tail()代码。不要考虑爆破,我已经试了一下,太多情况了。题目来源:UNCTF。_攻防世界困难模式攻略图文

达梦数据库的导出(备份)、导入_达梦数据库导入导出-程序员宅基地

文章浏览阅读2.9k次,点赞3次,收藏10次。偶尔会用到,记录、分享。1. 数据库导出1.1 切换到dmdba用户su - dmdba1.2 进入达梦数据库安装路径的bin目录,执行导库操作  导出语句:./dexp cwy_init/[email protected]:5236 file=cwy_init.dmp log=cwy_init_exp.log 注释:   cwy_init/init_123..._达梦数据库导入导出

js引入kindeditor富文本编辑器的使用_kindeditor.js-程序员宅基地

文章浏览阅读1.9k次。1. 在官网上下载KindEditor文件,可以删掉不需要要到的jsp,asp,asp.net和php文件夹。接着把文件夹放到项目文件目录下。2. 修改html文件,在页面引入js文件:<script type="text/javascript" src="./kindeditor/kindeditor-all.js"></script><script type="text/javascript" src="./kindeditor/lang/zh-CN.js"_kindeditor.js

STM32学习过程记录11——基于STM32G431CBU6硬件SPI+DMA的高效WS2812B控制方法-程序员宅基地

文章浏览阅读2.3k次,点赞6次,收藏14次。SPI的详情简介不必赘述。假设我们通过SPI发送0xAA,我们的数据线就会变为10101010,通过修改不同的内容,即可修改SPI中0和1的持续时间。比如0xF0即为前半周期为高电平,后半周期为低电平的状态。在SPI的通信模式中,CPHA配置会影响该实验,下图展示了不同采样位置的SPI时序图[1]。CPOL = 0,CPHA = 1:CLK空闲状态 = 低电平,数据在下降沿采样,并在上升沿移出CPOL = 0,CPHA = 0:CLK空闲状态 = 低电平,数据在上升沿采样,并在下降沿移出。_stm32g431cbu6

计算机网络-数据链路层_接收方收到链路层数据后,使用crc检验后,余数为0,说明链路层的传输时可靠传输-程序员宅基地

文章浏览阅读1.2k次,点赞2次,收藏8次。数据链路层习题自测问题1.数据链路(即逻辑链路)与链路(即物理链路)有何区别?“电路接通了”与”数据链路接通了”的区别何在?2.数据链路层中的链路控制包括哪些功能?试讨论数据链路层做成可靠的链路层有哪些优点和缺点。3.网络适配器的作用是什么?网络适配器工作在哪一层?4.数据链路层的三个基本问题(帧定界、透明传输和差错检测)为什么都必须加以解决?5.如果在数据链路层不进行帧定界,会发生什么问题?6.PPP协议的主要特点是什么?为什么PPP不使用帧的编号?PPP适用于什么情况?为什么PPP协议不_接收方收到链路层数据后,使用crc检验后,余数为0,说明链路层的传输时可靠传输

软件测试工程师移民加拿大_无证移民,未受过软件工程师的教育(第1部分)-程序员宅基地

文章浏览阅读587次。软件测试工程师移民加拿大 无证移民,未受过软件工程师的教育(第1部分) (Undocumented Immigrant With No Education to Software Engineer(Part 1))Before I start, I want you to please bear with me on the way I write, I have very little gen...

随便推点

Thinkpad X250 secure boot failed 启动失败问题解决_安装完系统提示secureboot failure-程序员宅基地

文章浏览阅读304次。Thinkpad X250笔记本电脑,装的是FreeBSD,进入BIOS修改虚拟化配置(其后可能是误设置了安全开机),保存退出后系统无法启动,显示:secure boot failed ,把自己惊出一身冷汗,因为这台笔记本刚好还没开始做备份.....根据错误提示,到bios里面去找相关配置,在Security里面找到了Secure Boot选项,发现果然被设置为Enabled,将其修改为Disabled ,再开机,终于正常启动了。_安装完系统提示secureboot failure

C++如何做字符串分割(5种方法)_c++ 字符串分割-程序员宅基地

文章浏览阅读10w+次,点赞93次,收藏352次。1、用strtok函数进行字符串分割原型: char *strtok(char *str, const char *delim);功能:分解字符串为一组字符串。参数说明:str为要分解的字符串,delim为分隔符字符串。返回值:从str开头开始的一个个被分割的串。当没有被分割的串时则返回NULL。其它:strtok函数线程不安全,可以使用strtok_r替代。示例://借助strtok实现split#include <string.h>#include <stdio.h&_c++ 字符串分割

2013第四届蓝桥杯 C/C++本科A组 真题答案解析_2013年第四届c a组蓝桥杯省赛真题解答-程序员宅基地

文章浏览阅读2.3k次。1 .高斯日记 大数学家高斯有个好习惯:无论如何都要记日记。他的日记有个与众不同的地方,他从不注明年月日,而是用一个整数代替,比如:4210后来人们知道,那个整数就是日期,它表示那一天是高斯出生后的第几天。这或许也是个好习惯,它时时刻刻提醒着主人:日子又过去一天,还有多少时光可以用于浪费呢?高斯出生于:1777年4月30日。在高斯发现的一个重要定理的日记_2013年第四届c a组蓝桥杯省赛真题解答

基于供需算法优化的核极限学习机(KELM)分类算法-程序员宅基地

文章浏览阅读851次,点赞17次,收藏22次。摘要:本文利用供需算法对核极限学习机(KELM)进行优化,并用于分类。

metasploitable2渗透测试_metasploitable2怎么进入-程序员宅基地

文章浏览阅读1.1k次。一、系统弱密码登录1、在kali上执行命令行telnet 192.168.26.1292、Login和password都输入msfadmin3、登录成功,进入系统4、测试如下:二、MySQL弱密码登录:1、在kali上执行mysql –h 192.168.26.129 –u root2、登录成功,进入MySQL系统3、测试效果:三、PostgreSQL弱密码登录1、在Kali上执行psql -h 192.168.26.129 –U post..._metasploitable2怎么进入

Python学习之路:从入门到精通的指南_python人工智能开发从入门到精通pdf-程序员宅基地

文章浏览阅读257次。本文将为初学者提供Python学习的详细指南,从Python的历史、基础语法和数据类型到面向对象编程、模块和库的使用。通过本文,您将能够掌握Python编程的核心概念,为今后的编程学习和实践打下坚实基础。_python人工智能开发从入门到精通pdf

推荐文章

热门文章

相关标签