天天看点

Linux日常使用整理------杂货/linux-C-API

一、引言

好久没发博客啦,这段时间公司的项目有点忙(加上自己有点懒~)。这几天刚刚忙完,所以想着来整理下这段时间的日常使用命令吧,会比较杂,但都是一些很好的命令,大家也可以多多补充哈!

二、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 "[email protected]"
           

其他命令

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上的十六进制内容

-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’下查找,当前设备的所有块,如果还做了分区表,就可以和分区名对应

Linux日常使用整理------杂货/linux-C-API

如下是做了分区表的

Linux日常使用整理------杂货/linux-C-API

四、dbus

是一种高级的进程间通讯方式,东西比较多,后面慢慢完善了,不过觉得廷常用的。

五、cat 合并文件

cat是concatenate的缩写,意为串联,之前经常看到别人在用cat命令,没有细究

cat命令两个常用的用法是:

1、cat file.txt能够将txt中的内容显示出来

2、合并文件

'>'是新建文件,并合并两个内容。

'>>'是把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的软链接.

Linux日常使用整理------杂货/linux-C-API

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

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

获取文件信息

返回值:成功返回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/进程号目录

十、磁盘相关命令

df -h 查看磁盘总共大小

du -sh /xxx 查看/xxx目录的实际大小

继续阅读