NDK开发——Linux命令、Shell命令、MakeFile命令、gba命令

Linux命令

一、清空命令行

reset

二、文件操作

ls -l  显示文件列表 
ls -la  显示所有文件列表
ls -l ja*  显示经过通配符查找的结果

touch today.c  创建文件

cp src.txt dest.txt  复制文件
cp -i src.txt dest.txt  复制文件并询问
cp src.txt .  复制文件到当前目录
cp -R 目录 dest  复制整个目录到指定路径
cp c_?1 ../  经过通配符查找的结果复制到上级目录

rm file  删除文件
rm -rf 目录  删除目录
file 文件  查看文件类型
cat file  查看文件内容
cat -n file 查看文件内容并显示行号
tail -n 10 file  查看文件最后10行
head -n 10 file  查看文件最开始的10行

find . -name "libjpeg.a"  当前目录下查找指定文件名
grep -n "i love you" ./   当前目录下查找指定的字符串

三、用户管理

useradd -m jack 创建用户的同时,创建了home目录
userdel -r jack 删除用户
passwd jack 修改密码

groupadd androidgroup 创建组
usermod -G androidgroup jack 分配用户到组

chown user.group file  改变文件的所属用户和组
chown user file  改变文件的所属用户
chown .group file  改变文件的所属组

四、权限管理

chmod 644 file  修改文件权限
chmod u+x file  给用户加上执行权限
chmod u-x file  给用户删去执行权限

umask 026  改变创建目录的默认权限(777-026 = 751

常见的文件权限

d目录 r读 w写 x执行
rwx必须是固定顺序
比如:drwxr-xr-x
drwxr-xr-x
目录文件所属用户具备的权限文件所属用户的所属组具备的权限统的其他用户具备的权限

权限对应的数字说明

权限二进制八进制
0000
–x0011
-w-0102
-wx0113
r–1004
r-x1015
rw-1106
rwx1117

五、线程管理

Linux下安装

apt-get install manpages-posix-dev

Linux下查看文档

man -k pthread
#查看具体某个方法
man pthread_create
man pthread_join

Linux下创建线程

#include <stdlib.h>
#include <stdio.h>
#include <unistd.h>
#include <pthread.h>

void* thr_fun(void* arg){
    char* no = (char*)arg;
    int i = 0;
    for(; i < 10; i++){
        printf("%s thread, i:%d\n",no,i);
        if(i==5){
            //线程退出(自己退出自己)
            //别人退出线程,使用pthread_cancel   
            pthread_exit(2);

        }
    }   
    return 1;
}

void main(){
    //创建线程
    //参数一:线程id,参数二:线程的属性,NULL默认属性
    //参数三:thr_fun,线程创建之后执行的函数,参数四:传进函数的值
    pthread_t tid;
    pthread_create(&tid,NULL,thr_fun,"1");

    //线程礼让,等待tid线程结束
    //参数一:线程id,参数二:thr_fun与退出时传入的参数的内容
    void* rval;
    pthread_join(tid,&rval);
    printf("rval:%d\n",(int)rval);
}

Linux下编译文件成可执行文件,记得使用pthread库要加上依赖

gcc 01.c -o 01 -lpthread

Linux下线程互斥锁

#include <stdlib.h>                                                         
#include <stdio.h>
#include <unistd.h>
#include <pthread.h>

int i = 0;
//互斥锁
pthread_mutex_t mutex;

void* thr_fun(void* arg){
    //加锁
    pthread_mutex_lock(&mutex);
    char* no = (char*)arg;
    for(;i < 5; i++){
        printf("%s thread, i:%d\n",no,i);
        sleep(1);
    }
    i=0;
    //解锁
    pthread_mutex_unlock(&mutex);
}

void main(){
    pthread_t tid1, tid2;
    //初始化互斥锁
    pthread_mutex_init(&mutex,NULL);

    pthread_create(&tid1,NULL,thr_fun,"No1");
    pthread_create(&tid2,NULL,thr_fun,"No2");

    pthread_join(tid1,NULL);
    pthread_join(tid2,NULL);

    //销毁互斥锁
    pthread_mutex_destroy(&mutex);
}

Linux下线程生产消费机制

#include <stdlib.h>                                                      
#include <stdio.h>
#include <unistd.h>
#include <pthread.h>

//消费者数量
#define CONSUMER_NUM 2
//生产者数量
#define PRODUCER_NUM 2
pthread_t pids[CONSUMER_NUM+PRODUCER_NUM];
//产品队列
int ready = 0;
//互斥锁
pthread_mutex_t mutex;
//条件变量(类似于等待唤醒机制)
pthread_cond_t has_product;

//生产者
void* producer(void* arg){
    int no = (int)arg;
    for(;;){
        pthread_mutex_lock(&mutex);

        //往队列中添加产品
        ready++;
        printf("生产者%d号, 生产出了产品\n",no);

        //通知消费者,有新的产品可以消费了
        pthread_cond_signal(&has_product);

        pthread_mutex_unlock(&mutex);
        sleep(1);
    }
}

//消费者
void* consumer(void* arg){
    int num = (int)arg;
    for(;;){
        pthread_mutex_lock(&mutex);

        while(ready==0){
            //没有产品,继续等待
            pthread_cond_wait(&has_product,&mutex);
        }

        //有产品,消费产品
        ready--;
        printf("消费者%d号,消费了产品\n",num);

        pthread_mutex_unlock(&mutex);
        sleep(1);
    }
}

void main(){
    //初始化互斥锁和条件变量                                                
    pthread_mutex_init(&mutex,NULL);
    pthread_cond_init(&has_product,NULL);

    int i;
    for(i=0; i<PRODUCER_NUM;i++){
        //生产者线程
        pthread_create(&pids[i],NULL,producer,(void*)i);
    }

    for(i=0; i<CONSUMER_NUM;i++){
        //消费者线程
        pthread_create(&pids[PRODUCER_NUM+i],NULL,consumer,(void*)i);
    }

    //等待
    sleep(2);

    for(i=0; i<PRODUCER_NUM+CONSUMER_NUM;i++){
        pthread_join(pids[i],NULL);
    }

    //销毁互斥锁和条件变量
    pthread_mutex_destroy(&mutex);
    pthread_cond_destroy(&has_product);
}

shell命令

一、定义脚本的版本

#!/bin/bash   

二、引入sh文件

#引入当前目录的my脚本
source ./my.sh
#写法等同于
. ./my.sh

三、定义变量

a=10
echo $a

四、定义字符串

text="i love shell"
echo $text

五、命令变量

命令的执行结果的输出作为变量的值,date和who都是可以输出结果的命令

textdate=`date`
textwho=$(who)
echo $textdate
echo $textwho

六、输出重定向

>:将ls -al 这个命令输出结果全部复制到file文件中
>>:将end字符串追加到file文件中

标准输入输出

  • 0:STDIN 标准输入
  • 1:STDOUT 标准输出
  • 2:STDERR 标准错误
ls -al >file
echo "end" >>file

将sh文件的所有输出信息复制到file文件中

exec 1>file

将sh文件的错误信息复制到file文件中

exec 2>file

自定义输出信息

exec 7>file
echo "Hi" >&7

在Linux模式下,可以执行某个sh文件,将输出的结果重定向到file文件中,不在屏幕输出

./aa.sh 1>file

七、输入重定向

将file文件中的行数、单词数、字节数输出

wc < file

八、整数计算

expr命令一般用于整数值和字符串的计算中

a=10
b=20
c=$(expr $b / $a)
#写法等同于
d=$[$b / $a]

九、浮点数计算

  • bc命令:用于计算浮点数的base calculate
  • scale=4:是bc命令里说明显示的小数位数
  • 管道:一个命令的输出作为另一个命令的输入
e=$(echo "scale=4; 10 / 3" | bc)

十、内联输入重定向

这里将输入的式子作为bc指令的表达式,结果是5*4/3

f=$(bc << EOF
scale=4
a1 = (5 * 4)
al / 3
EOF
)

十一、命令执行退出的状态

echo $?

返回值

  • 0 成功
  • 1 未知错误
  • 126 命令不可执行
  • 127 没有找到命令

自定义退出状态

#!/bin/bash
echo "my shell exit"
exit_5

十二、条件控制语句

if语法的如下,elif、else、&& 命令,可以根据情况增加或者不增加,注意只有if命令的退出状态码为0,才会执行then部分

if 命令 && 命令
then 
   命令
elif 命令
then 
   命令
else
   命令
fi

例子:查找本地是否包含user这个用户

#!/bin/bash
user=Hensen
if grep $user /etc/passwd
then 
   echo "ok"
   ls -a /home/$user/
fi

任意的数学赋值或者比较表达式,用双括号表示

if(( a++ > 90 ))

十三、test命令

用方括号来表示text命令,注意需要空格

#!/bin/bash
a=10
b=5
if [ $a -gt $b ]
then
    echo "$a greater than $b"
else
    echo "$a smaller than $b"
fi

test数值比较

  • -gt:大于
  • -eq:等于
  • -le:小于
  • -ne:不等于

test字符串比较

  • str1 == str2
  • str1 != str2
  • str1 < str2
  • -n str1:长度是否非0
  • -z str1:长度是否为0

文件比较

  • -d:检查是否存在,并且是一个目录
  • -e:检查file是否存在
  • -f:检查是否存在,并且是一个文件
  • -r:检查是否存在,并且可读
  • -w:检查是否存在,并且可写
  • -x:检查是否存在,并且可执行
  • file1 -nt file2:file1比file2新
  • file1 -ot file2:file1比file2旧

十四、case命令

语法

case 变量 in
pattern1) 命令;;
pattern2) 命令;;
*) 默认命令;;
esac

例子

#!/bin/bash
user=rose
case $user in
rose)
    echo "hi,i am rose";;
ricky)
    echo "hi,i am ricky";;
*)
    echo "defaults"
esac

十五、for循环

语法

for var in list
do
    命令
done

例子

#!/bin/bash
#第一种方式
for name in Mother Father Brother
do
    echo $name
done
#第二种方式
list = "Mother,Father,Brother"
IFS=$,
for name in $list
do
    echo $name
done

十六、while命令

语法

while [ 命令 ]
do
    命令
done    

例子,与break一起用

#!/bin/bash
a=10
while [ $a -gt 0 ]
do
    echo "num:$a"
    a=$[ $a - 1 ]
    if[ $a -eq 5 ]
    then 
        echo "break"
        break
    fi
done

十七、函数

函数定义

#第一种写法
function func
{
    echo "func";
}
#第二种写法
func(){
    echo "func2"
}

函数传参和返回值

function func
{
    echo $[ $1 + $2 ];
}
value=$(func 10 90)
echo "value:$value"

十八、脚本传参

#!/bin/bash
echo "参数的总数:$#"
#遍历所有传进来的参数
for param in "$@"
do
    echo "param:$param"
done

MakeFile命令

一、介绍

MakeFile主要是将多个.c文件统一编译打包成可执行文件,它可以自动识别某个目标文件是否被修改过,从而决定需不需要进行重新编译,主要是通过目标文件的修改时间是否大于.c文件,如果大于则说明.c文件未被修改过,不用重新编译该文件

二、场景

  • 在很多C/C++开源项目中,configure文件用来检查系统配置生成配置文件
  • MakeFile文件会引入configure生成的配置文件,根据内容生成我们需要的动态库文件
  • Shell脚本就是先运行configure文件之后再运行MakeFile文件继续编译生成动态库文件

三、使用

#myapp是目标文件,默认的make指令会执行第一行的指令
#:后的文件都是依赖,注意gcc前面必须是TAB键开头
myapp:main.o plus.o minus.o multi.o divi.o
    gcc main.o plus.o minus.o multi.o divi.o -o myapp
main.o:main.c
    gcc -c main.c
plus.o:plus.c
    gcc -c plus.c
minus.o:minus.c
    gcc -c minus.c
multi.o:multi.c
    gcc -c multi.c
divi.o:divi.c
    gcc -c divi.c

#声明伪目标,表示make clean会执行下面的指令
.PHONY:clean
clean:
    rm -f *.o
    rm -f myapp

简化写法,此段代码与上面代码效果一样

OBJECTS=main.o plus.o minus.o multi.o divi.o
myapp:$(OBJECTS)
    gcc $^ -o $@

%.o:%.c
    gcc -c $^ -o $@

.PHONY:clean
clean:
    rm -f *.o
    rm -f myapp

获取当前目录所有.c文件编译成.o文件

#所有.c源文件,wildcard是个函数
SOURCES=$(wildcard *.c)
#把.c后缀,替换成.o后缀,patsubst是个函数
OBJECTS=$(patsubst %.c,%.o,$(SOURCES))

myapp:$(OBJECTS)
    gcc $^ -o $@

%.o:%.c
    gcc -c $^ -o $@

.PHONY:clean
clean:
    rm -f *.o
    rm -f myapp

我们可以通过echo打印出SOURCES和OBJECTS,输入make test命令即可

#增加"@"符号echo不会打印出命令
test:
    @echo $(SOURCES)
    @echo $(OBJECTS)

四、变量

#递归展开式
#可以引用还没有定义的变量,展开是引用时展开
str2=$(str1)
str1=hello

#直接展开式
#必须引用定义好了的变量,定义之后就会展开
str3 := android
str4 := $(str3)
str5 := $(str1) world

#变量的值追加
str5 += hello

五、函数

#自定义函数
myfun=$2 $1
#变量等于函数的执行结构
myfun_ret=$(call myfun,20,10)

六、Android.mk

  • LOCAL_PATH := $(call my-dir):放在第一行,地址当前所在目录
  • include $(CLEAR_VARS):编译模块时,清空LOCAL_MODULE等参数
  • LOCAL_MODULE:模块名称
  • LOCAL_SRC_FILES:编译需要的源文件
  • LOCAL_C_INCLUDES:需要的头文件
  • LOCAL_SHARED_LIBRARIES:编译需要的动态库

gba命令

gba是一款在Linux下的调试工具,安装gba

apt-get install gba

如果需要gba调试程序的话,编译加上-g参数

gcc file.c -g -o file

进入调试

gdb file

开始调试

start

显示代码

list :查看当前代码,简写l
list 函数名称:查看函数内容
list 行数:查看某行代码

执行下一步

next:简写n

查看变量

print 变量名:简写p

进入到某个函数

step:简写s

设置断点

break 行号:简写b

全速运行

continue:遇到断点会停止,简写b

查看断点信息

info breakpoints

删除断点

delete breakpoints 断点编号

修改变量的值

set var 变量=值

程序调用堆栈,当前函数之前的所有已调用函数列表,每一个都分配一个“帧”,最近调用的函数在0号帧里

backtrace:简写bt

切换栈帧

frame 帧数:切换指定栈帧,方便查看指定栈帧的变量

自动显示,在调试每一步的过程中都会输出

display 变量名

取消自动显示

undisplay 行号

查看内存布局

x /20 地址
x /20 buff:查看buff数组的前20个元素

程序非正常退出,如何查看错误

  1. ulimit -a:查看core文件是否分配大小
  2. ulimit -c 1024:创建的core文件大小为1024字节
  3. gcc file.c -g -o file:编译链接得到带有-g选项的可执行程序
  4. ./file:执行程序,会生成core日志文件
  5. gdb file core:打开日志文件,定位错误信息到具体的代码行数
  • 4
    点赞
  • 19
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

许英俊潇洒

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值