一、引言
好久没发博客啦,这段时间公司的项目有点忙(加上自己有点懒~)。这几天刚刚忙完,所以想着来整理下这段时间的日常使用命令吧,会比较杂,但都是一些很好的命令,大家也可以多多补充哈!
二、git/repo的使用
之前整理过一篇关于git、repo的文章,这里就简单补充一点
repo
repo是一个基于git的android源码管理工具,其实就是将很多git库集中成了一个大库,其中的子库包括:kernel、uboot、system等
常用命令:
repo init -u ssh://{user}@192.168.120.246:29418/cmccc03/manifests --repo-url=ssh://{user}@192.168.120.246:29418/A31HomeLetMirror/android4.4backup/git-repo -m sys.xml
/* 更新项目的全部源码,第一次则为pull*/
repo sync -c
/* 将项目上的所有代码切换到android-4.4分支 */
repo start --all android-4.4
之前必须设置git账户密码,与gerrit上的一致
git config --global user.name "xxxxxx"
git config --global user.email "xxxxx@xxx.com"
其他命令
repo status
repo branch
repo checkout
git
这段时间常用到的命令
git add //添加新的文件到库中 如果为目录,默认将其下的所有文件加入库
git commit //提交修改
git commit ----amend //修改上一次commit的内容,并将两次commit合并
git checkout xxx //撤销xxx的修改
git pull //更新代码
git push //上传代码
git push origin master:refs/for/master //提交修改到gerrit
git log //查看提交log
git reset //回退到某一版本,版本号可在git log中看到
git diff //比较和库中文件的不同
git status
git branch
git checkout xx //转换到某一分支
git branch -f C03_Master HEAD //遇到头指针分离的情况
git checkout C03_Master
三、linux中的块设备操作
dd命令
用指定大小的块拷贝一个文件,并在拷贝的同时进行指定的转换。
dd if=input of=output bs=1048576(1024k) seek=%ld count=1
if=文件名:输入文件名,缺省为标准输入。即指定源文件。< if=input file >
of=文件名:输出文件名,缺省为标准输出。即指定目的文件。< of=output file >
ibs=bytes:一次读入bytes个字节,即指定一个块大小为bytes个字节。
obs=bytes:一次输出bytes个字节,即指定一个块大小为bytes个字节。
bs=bytes:同时设置读入/输出的块大小为bytes个字节。
注意:有些版本的dd命令,不支持1024k这种写法,需要写成1048576
skip=blocks:从输入文件开头跳过blocks个块后再进行复制。
seek=blocks:从输出文件开头跳过blocks个块再进行复制。
count=blocks:仅拷贝blocks个块,块大小等于ibs指定的字节数。
conv=conversion:用指定的参数转换文件。
ascii:转换ebcdic为ascii
ebcdic:转换ascii为ebcdic
ibm:转换ascii为alternate ebcdic
block:把每一行转换为长度为cbs,不足部分用空格填充
unblock:使每一行的长度都为cbs,不足部分用空格填充
lcase:把大写字符转换为小写字符
ucase:把小写字符转换为大写字符
swab:交换输入的每对字节
noerror:出错时不停止
notrunc:不截短输出文件
sync:将每个输入块填充到ibs个字节,不足部分用空(NUL)字符补齐。
hexdump命令
查看flash上的十六进制内容
hexdump [选项] [文件]...
-n length 只格式化输入文件的前length的个字节。
-C 输出规范的十六进制和ASCII码。
-b 单字节八进制显示。
-c 单字节字符显示。
-d 双字节十进制显示。
-o 双字节八进制显示。
-x 双字节十六进制显示。
-s 从偏移量开始输出。
-e 指定格式字符串,格式字符串包含在一对单引号中,格式字符串形如:‘a/b “format1” “format2”’。
hexdump mmcblk0p13 -s 0x400 -n 512
打印 ‘mmcblk0p13’ 中从0x400 开始的512个字节
du -h
查看每个目录/文件 实际的大小
用ls -l 只能看到单个目录的大小,而不能看到里面实际的大小
eog -f
此命令用于查看图片
linux中查看块设备的目录
一般在 '/dev/block’下查找,当前设备的所有块,如果还做了分区表,就可以和分区名对应
如下是做了分区表的
四、dbus
是一种高级的进程间通讯方式,东西比较多,后面慢慢完善了,不过觉得廷常用的。
五、cat 合并文件
cat是concatenate的缩写,意为串联,之前经常看到别人在用cat命令,没有细究
cat命令两个常用的用法是:
1、cat file.txt能够将txt中的内容显示出来
2、合并文件
'>'是新建文件,并合并两个内容。
cat file1.txt file2.txt file3.txt > file_total.txt //命令可以将上面四个txt文件合并为一个名字为file_total.txt的文件
'>>'是把file1和file2附加到file3中
cat file1.txt file2.txt >> file3.txt //将file1 file2 的内容追加到file3中
六、shell脚本
1、在shell脚本中,需要执行一些shell命令时 可以这样写
$(pwd)
`command`
两者作用相同,即获取command命令的结果
2、我们可以在bash中使用以下命令获取所执行脚本的绝对路径:
#!/bin/bash
DIR=$( cd "$(dirname "${BASH_SOURCE[0]}")" && pwd);
echo $DIR
BASH_SOURCE[0] - 等价于 BASH_SOURCE ,取得当前执行的 shell 文件所在的路径及文件名
dirname - 去除文件名中的非目录部分,仅显示与目录有关的部分
$() - 相当于 command
, 即获取command命令的结果
&& - 逻辑运算符号,只有当&&左边运行成功时才会运行&&右边的命令
或者如下
BUILD_SCRIPT_DIR=`dirname $PWD/${0}`
$0 就是你写的shell脚本本身的名字,$1 是你给你写的shell脚本传的第一个参数,$2 是你给你写的shell脚本传的第二个参数
PWD 是当前工作目录的绝对路径名,该变量的取值随cd命令的使用而变化,为环境变量,值为当前目录。
</font color=ff0000>我们在写脚本时,最好都使用以上方式来获取脚本的绝对路径,这样移植到其他系统时,也可以继续使用,不用修改路径
3、getopts函数
getopts函数是用来处理命令行中传递进来的参数。
getopts 有两个参数,第一个参数是一个字符串,包括字符和“:”符号,每一个字符都是一个有效的选项,如果字符后面带有“:”,表示这个字符有自己的参数。getopts从命令中获取这些参数,并且删去了“-”,并将其赋值在第二个参数中,如果带有自己参数,这个参数赋值在“OPTARG”中。
这里变量
O
P
T
A
R
G
存
储
相
应
选
项
的
参
数
,
而
OPTARG存储相应选项的参数,而
OPTARG存储相应选项的参数,而OPTIND总是存储原始$*中下一个要处理的元素位置。
while getopts “🅰️bc” opt #第一个冒号表示忽略错误;字符后面的冒号表示该选项必须有自己的参数
while getopts "u:D:p:m:K:R:E:T:vh" opt; do
case $opt in
u)
MYSQL_USER=$OPTARG
;;
D)
MYSQL_DATABASE=$OPTARG
;;
p)
MYSQL_PASSWORD=$OPTARG
;;
m)
MYSQL_HOST=$OPTARG
;;
K)
MASTER=$OPTARG
;;
R)
KEYSTONE_REGION=$OPTARG
;;
E)
export SERVICE_ENDPOINT=$OPTARG
;;
T)
export SERVICE_TOKEN=$OPTARG
;;
v)
set -x
;;
h)
cat <<EOF
Usage: $0 [-m mysql_hostname] [-u mysql_username] [-D mysql_database] [-p mysql_password]
[-K keystone_master ] [ -R keystone_region ] [ -E keystone_endpoint_url ]
[ -T keystone_token ]
Add -v for verbose mode, -h to display this message.
EOF
exit 0
;;
\?)
echo "Unknown option -$OPTARG" >&2
exit 1
;;
:)
echo "Option -$OPTARG requires an argument" >&2
exit 1
;;
esac
done
七、块设备
我们去看linux中的’/dev/block’是 会发现有很多以下目录(该环境是在linux虚拟机下)
lrwxrwxrwx 1 root root 6 4月 8 21:18 11:0 -> ../sr0
lrwxrwxrwx 1 root root 8 4月 8 21:18 7:0 -> ../loop0
lrwxrwxrwx 1 root root 8 4月 8 21:18 7:1 -> ../loop1
lrwxrwxrwx 1 root root 9 4月 8 21:18 7:10 -> ../loop10
lrwxrwxrwx 1 root root 9 4月 8 21:18 7:11 -> ../loop11
lrwxrwxrwx 1 root root 9 4月 8 21:18 7:12 -> ../loop12
lrwxrwxrwx 1 root root 9 4月 8 21:18 7:13 -> ../loop13
lrwxrwxrwx 1 root root 9 4月 8 21:18 7:14 -> ../loop14
lrwxrwxrwx 1 root root 8 4月 8 21:18 7:2 -> ../loop2
lrwxrwxrwx 1 root root 8 4月 8 21:18 7:3 -> ../loop3
lrwxrwxrwx 1 root root 8 4月 8 21:18 7:4 -> ../loop4
lrwxrwxrwx 1 root root 8 4月 8 21:18 7:5 -> ../loop5
lrwxrwxrwx 1 root root 8 4月 8 21:18 7:6 -> ../loop6
lrwxrwxrwx 1 root root 8 4月 8 21:18 7:7 -> ../loop7
lrwxrwxrwx 1 root root 8 4月 8 21:18 7:8 -> ../loop8
lrwxrwxrwx 1 root root 8 4月 8 21:18 7:9 -> ../loop9
lrwxrwxrwx 1 root root 6 4月 8 21:18 8:0 -> ../sda
lrwxrwxrwx 1 root root 7 4月 8 21:18 8:1 -> ../sda1
lrwxrwxrwx 1 root root 7 4月 8 21:18 8:2 -> ../sda2
lrwxrwxrwx 1 root root 7 4月 8 21:18 8:5 -> ../sda5
其中
/dev/sr0:光驱的设备名
/dev/sr0 光驱的设备名
/dev/cdrom 代表光驱
cdrom是sr0的软链接.
loop设备:是一种伪设备(pseudo-device),或者也可以说是仿真设备。它能使我们像块设备一样访问一个文件。在使用之前,一个 loop 设备必须要和一个文件进行连接。这种结合方式给用户提供了一个替代块特殊文件的接口。因此,如果这个文件包含有一个完整的文件系统,那么这个文件就可以像一个磁盘设备一样被 mount 起来
sda:d是SCSI硬盘和SATA硬盘,a是第一块盘,0是第一个主分区
SISC:支持硬件热拔插,性能好、稳定性高、适合长时间高负荷运作、接口扩展性强,可以支持10块以上的硬盘,常用作服务器 价格昂贵
SATA:民用为主,每个接口只能联结一块硬盘
IDE:我们平常用的多数都为IDE,耗费CPU大,逐渐被SATA代替
loop设备
对应使用的losetup命令
losetup [ -e encryption ] [ -o offset ] loop_device file
losetup [ -d ] loop_device
此命令用来设置循环设备。循环设备可把文件虚拟成块设备,籍此来模拟整个文件系统,让用户得以将其视为硬盘驱动器,光驱或软驱等设备,并挂入当作目录来使用。命令格式中的选项与参数名:
-e 表示加密的方式
-o 设置数据偏移量
-d 卸载设备
loop_device 循环设备名,在 linux 下如 /dev/loop0 , /dev/loop1 等。
file 要与循环设备相关联的文件名,这个往往是一个磁盘镜象文件,如 *.img
示例:
//创建空的磁盘镜像文件,这里创建一个1.44M的软盘
$ dd if=/dev/zero of=floppy.img bs=512 count=2880
//使用 losetup将磁盘镜像文件虚拟成快设备
$ losetup /dev/loop1 floppy.img
//挂载块设备
$ mount /dev/loop0 /tmp
//卸载loop设备
$ umount /tmp
$ losetup -d /dev/loop1
八、常用接口
popen
简单说一下linux编程中常用的popen函数
#include <stdio.h>
FILE * popen(const char *command , const char *type );
int pclose(FILE *stream);
popen()函数通过创建一个管道,调用fork()产生一个子进程,执行一个shell以运行命令来开启一个进程。这个管道必须由pclose()函数关闭,而不是fclose()函数。
type参数只能是读或者写中的一种,得到的返回值(标准I/O流)也具有和type相应的只读或只写类型。如果type是"r"则文件指针连接到command的标准输出;如果type是"w"则文件指针连接到command的标准输入
command参数是一个指向以NULL结束的shell命令字符串的指针。这行命令将被传到bin/sh并使用-c标志,shell将执行这个命令。
作用: popen函数允许一个程序将另外一个程序作为新进程来启动,并可以传递数据或者通过它接受数据。
其内部实现为调用 fork 产生一个子进程,执行一个 shell, 以运行命令来开启一个进程,这个进程必须由 pclose() 函数关闭。
示例
int exe_pipe(const char *cmd, char *result, int len)
{
FILE *ptr = popen(cmd, "r");
if (ptr) {
if (result)
while (fgets(result + strlen(result), len, ptr) != NULL);
pclose(ptr);
} else {
printf("popen is filed\n");
return -1;
}
return 0;
}
unlink
unlink(filename,contest);
删除一个文件
filename:文件名,必需
context:文件句柄的环境,可选
fork
创建一个新进程,向父进程返回PID号,向子进程返回0
pid = fork();
if (pid < 0) {
return -1;
} else if (pid == 0) {
child(argc, argv);
_exit(0);
} else {
parents(argc, argv);
_exit(0);
}
execvp
int execvp(const char* file, const char* argv[]);
exec系统调用会从当前进程中把当前程序的机器指令清除,然后在空的进程中载入调用时指定的程序代码,最后运行这个新的程序。不会再回到当前进程
(1) 第一个参数是要运行的文件,会在环境变量PATH中查找file,并执行.
(2) 第二个参数,是一个参数列表,如同在shell中调用程序一样,参数列表为0,1,2,3……因此wensen.sh 作为第0个参数,需要重复一遍.
(3) argv列表最后一个必须是 NULL.
(4) 失败会返回-1, 成功无返回值,但是,失败会在当前进程运行,执行成功后,直接结束当前进程,可以在子进程中运行.
#include <unistd.h>
#include <stdio.h>
#include <errno.h>
int main()
{
char * argv[] = {"test.sh", 0}; // 数组最后一位需要为0
execvp("/xxx/xxx/xxx/test/test.sh", argv);
return 0;
}
stat
获取文件信息
int stat(const char *path, struct stat *buf)
返回值:成功返回0,失败返回-1;
参数:文件路径(名),struct stat 类型的结构体
struct stat
{
dev_t st_dev; /* ID of device containing file */文件使用的设备号
ino_t st_ino; /* inode number */ 索引节点号
mode_t st_mode; /* protection */ 文件对应的模式,文件,目录等
nlink_t st_nlink; /* number of hard links */ 文件的硬连接数
uid_t st_uid; /* user ID of owner */ 所有者用户识别号
gid_t st_gid; /* group ID of owner */ 组识别号
dev_t st_rdev; /* device ID (if special file) */ 设备文件的设备号
off_t st_size; /* total size, in bytes */ 以字节为单位的文件容量
blksize_t st_blksize; /* blocksize for file system I/O */ 包含该文件的磁盘块的大小
blkcnt_t st_blocks; /* number of 512B blocks allocated */ 该文件所占的磁盘块
time_t st_atime; /* time of last access */ 最后一次访问该文件的时间
time_t st_mtime; /* time of last modification */ /最后一次修改该文件的时间
time_t st_ctime; /* time of last status change */ 最后一次改变该文件状态的时间
};
stat结构体中的st_mode 则定义了下列数种情况:
S_IFMT 0170000 文件类型的位遮罩
S_IFSOCK 0140000 套接字
S_IFLNK 0120000 符号连接
S_IFREG 0100000 一般文件
S_IFBLK 0060000 区块装置
S_IFDIR 0040000 目录
S_IFCHR 0020000 字符装置
S_IFIFO 0010000 先进先出
S_ISUID 04000 文件的(set user-id on execution)位
S_ISGID 02000 文件的(set group-id on execution)位
S_ISVTX 01000 文件的sticky位
S_IRUSR(S_IREAD) 00400 文件所有者具可读取权限
S_IWUSR(S_IWRITE)00200 文件所有者具可写入权限
S_IXUSR(S_IEXEC) 00100 文件所有者具可执行权限
S_IRGRP 00040 用户组具可读取权限
S_IWGRP 00020 用户组具可写入权限
S_IXGRP 00010 用户组具可执行权限
S_IROTH 00004 其他用户具可读取权限
S_IWOTH 00002 其他用户具可写入权限
S_IXOTH 00001 其他用户具可执行权限
上述的文件类型在POSIX中定义了检查这些类型的宏定义:
S_ISLNK (st_mode) 判断是否为符号连接
S_ISREG (st_mode) 是否为一般文件
S_ISDIR (st_mode) 是否为目录
S_ISCHR (st_mode) 是否为字符装置文件
S_ISBLK (s3e) 是否为先进先出
S_ISSOCK (st_mode) 是否为socket
若一目录具有sticky位(S_ISVTX),则表示在此目录下的文件只能被该文件所有者、此目录所有者或root来删除或改名,在linux中,最典型的就是这个/tmp目录啦。
acess
#include<unistd.h>
int access(const char* pathname, int mode);
pathname 是文件的路径名+文件名
mode:指定access的作用,取值如下
F_OK 值为0,判断文件是否存在
X_OK 值为1,判断对文件是可执行权限
W_OK 值为2,判断对文件是否有写权限
R_OK 值为4,判断对文件是否有读权限
注:后三种可以使用或“|”的方式,一起使用,如W_OK|R_OK
返回值:成功0,失败-1
readdir和readdir_r
因为内部使用了静态数据,所以readdir被认为不是线程安全的函数
但只要不是多个线程使用相同的dirstream,就尽可能的使用readdir,它其实更简单
API手册
关于Linux C API,大家可以参考以下链接:Linux C API 参考手册
下面做一些简单的总结
1、字符测试
is+xxx:islower 测试字符是否为小写字母
2、字符转换
atoi、atol等
3、内存控制
calloc(会初始为0)、malloc(不会初始化)、mmap、free等
4、日期时间
ctime、time、gmtime等
5、内存及字符串操作
bcmp、bcopy、bzero、memcpy、index等内存操作
strcat、strchr、strcmp等字符串操作函数
6、常用数学函数
abs、pow、sqrt等
7、用户组
endgrent、getpid等
8、数据结构及算法
rand、srand、qsort(快速排序)、lsearch(线性搜索)等
9、文件操作
#include<unistd.h>
close、creat、lseek、open、read、write、sync等
(f开头的为操作文件指针的标准库,不带f开头的直接操作文件描述符,为系统库)
10、文件内容操作
fgetc、fgets(指定输入/输出流)、fseek、gets(从标准输入流中获取)
11、进程操作
exit、execl、execv、vfork、getpid、waitpid、
12、格式化输入输出
fprintf、fscanf、printf、sprintf、sccanf、vfprintf等
13、文件权限控制
access、chdir、chmod、closedir、fchdir、fstat、link、opendir、readdir、remove、stat等
14、信号处理
alarm、pause、signal、sleep、perror、mkfifo、pipe、popen等
15、接口处理
accept、bind、connect、inet_addr、listen、recv、recvfrom、send、sendmsg、sendto、socket等
16、环境变量
getenv、putenv、setenv
17、终端控制
getopt、select、ttyname等
九、proc目录
里面包括当前系统中运行的所有进程的信息。
主要内容可以看如下博客,整理的比较好
Linux下的proc/进程号目录