❶ 如何修改openocd.cfg配置文件
选用FreeRTOS绝对不是应为他的代码是如何的优秀,而是因为他在自由软件社区展现出的很强的生命力。要知道,如果一个自由软件社区足够的活跃,就意味着有的爱好者不停的解决和修正他运行的过程中遇到的诸多问题。由于本人的工作中会采用STM32的CortexM的MCU,所以后续的调试方法会以STM32LDiscovery的开发板为例。FreeRTOS发布包中有针对不同平台的移植和实例,要想在linux主机交叉编译需要选用arm-none-eabi-gcc这样的编译工具链,而选用ST的MCU后一个廉价的ST-Link可以作为调试工具,而STM32LDiscovery的板子上自带就有这样的工具。硬件调试工具提供的下载调试程序的通道,还需要一个能够支持GDBServer的服务程序才能用arm-none-eabi-gdb完成代码的调试。下面的网站讲述了一个st-link的Linux工具可以支持下载调试你的二进制代码。adapterspeed:300kHzadapter_nsrst_delay:100Info:-leveltargetcontrol./SWDsrst_onlyseparatesrst_nogatesrst_open_drainconnect_deassert_srstInfo:clockspeed300kHzInfo::usingstlinkapiv2Info:Targetvoltage:2.918068Info:stm32l.cpu:hardwarehas6breakpoints,4watchpointsInfo:accepting'gdb'connectionontcp/3333Info:STM32Lflashsizeis128kb,-targetneedsresetInfo:Auto-detectedRTOS:FreeRTOSadapterspeed:300kHztargetstate:haltedtargethaltedetodebug-request,currentmode:ThreadxPSR:0x01000000pc:0x0800021cmsp:0x20004000STM32L:EnablingHSIadapterspeed:2000kHzInfo::,currentmode:ThreadxPSR:0x61000000pc:0x20000012msp:0x20004000targetstate:,currentmode:ThreadxPSR:0x61000000pc:0x20000012msp:0x20004000adapterspeed:300kHztargetstate:haltedtargethaltedetodebug-request,currentmode:ThreadxPSR:0x01000000pc:0x0800021cmsp:0x20004000在调试端,通过infothread来查看FreeRTOS的运行状况GNUgdb(GNUToolsforARMEmbeddedPro
❷ LINUX中ls-l是如何工作的如何去实现一个脚本
可以参考:
#include <sys/types.h>
#include <sys/stat.h>
#include <unistd.h>
#include <stdio.h>
#include <string.h>
#include <errno.h>
#include <pwd.h>
#include <grp.h>
#include <time.h>
#include <dirent.h>
int do_ls(char *dir,char *filename,int lflag)
{
int n;
struct stat buf;
char out[100];
struct passwd *pw;
struct group *gr;
struct tm *t;
if(lflag == 0) //如果不带l参数,直接显示文件/目录名
{
printf("%s\t",filename);
return 0;
}
if(lstat(dir,&buf)<0)
{
fprintf(stderr,"stat error:%s\n",strerror(errno));
return -1;
}
switch(buf.st_mode & S_IFMT) //获取字符串的属性:普通文件-、目录d、字符设备c、块设备b、管道文件p、连接文件l、套接字文件s
{
case S_IFREG:
printf("-");
break;
case S_IFDIR:
printf("d");
break;
case S_IFCHR:
printf("c");
break;
case S_IFBLK:
printf("b");
break;
case S_IFIFO:
printf("p");
break;
case S_IFLNK:
printf("l");
break;
case S_IFSOCK:
printf("s");
break;
}
for(n=8;n>=0;n--) //打印文件的读写属性:读r、写w、执行x、无权限-
{
if(buf.st_mode&(1<<n))
{
switch(n%3)
{
case 2:
printf("r");
break;
case 1:
printf("w");
break;
case 0:
printf("x");
break;
default:
break;
}
}
else
{
printf("-");
}
}
printf(" %d",buf.st_nlink); //硬链接数,此链接非彼链接,指(包含)目录的个数,文件为1,目录起始为2,再加上目录里包含的目录个数(不递归,只一层)
pw = getpwuid(buf.st_uid); //所属用户名
printf(" %s",pw->pw_name);
gr = getgrgid(buf.st_gid); //所属组名
printf(" %s",gr->gr_name);
printf(" %ld",buf.st_size); //字节计总大小
t = localtime(&buf.st_atime); //最后一次访问时间
printf(" %d-%d-%d %d:%d"
,t->tm_year+1900
,t->tm_mon+1
,t->tm_mday
,t->tm_hour
,t->tm_min);
printf(" %s ",filename);
if(S_ISLNK(buf.st_mode)) //判断是否为链接,是返回真
{
printf(" -> ");
if(readlink(filename,out,100)==-1)
{
//printf("readlink error\n");
}
printf("%s",out);
}
printf("\n");
return 0;
}
int ls_prepare(char *w,int aflag,int lflag) //ls的准备工作
{
struct stat buf; //man lstat可以看到此结构
char name[100];
DIR *dir; //类似打开文件的fd描述符
struct dirent *pdr; //man readdir可以看到此结构
if(lstat(w,&buf)<0) //获取文件/目录属性并赋值给buf,该函数和lstat一样,只是当w为链接时,指代他本身,并不存在文件
{
fprintf(stderr,"stat error:%s\n",strerror(errno));
return -1;
}
if(S_ISDIR(buf.st_mode)) //判断是否为目录,是返回真
{
dir = opendir(w); //打开目录
while ((pdr = readdir(dir))!=NULL) //读/遍历目录
{
if(aflag==0) //如果不带a参数,越过以.开头的所有文件/目录
{
if(pdr->d_name[0]=='.')
continue;
memset(name,0,100);
strcpy(name,w); //拷贝
strcat(name,"/"); //追加
strcat(name,pdr->d_name);
do_ls(name,pdr->d_name,lflag);
}else //有a参数显示所有
{
memset(name,0,100);
strcpy(name,w);
strcat(name,"/");
strcat(name,pdr->d_name);
do_ls(name,pdr->d_name,lflag);
}
}
closedir(dir);
}else //为文件则直接显示
{
do_ls(w,w,lflag);
}
return 0;
}
int main(int argc,char **argv)
{
int aflag =0;
int lflag =0;
char c;
int i;
while((c = getopt(argc,argv,"al"))!=-1) //解析命令行参数,即-/--后面的字符串和给定的字符串匹配,有未解析字母返回字母或问号(取决于第3个参数),否则返回-1
{
switch(c) //此处仅匹配a(所有)和l(列表),即只支持参数a、l
{
case 'a':
aflag =1;
break;
case 'l':
lflag =1;
break;
default:
break;
}
}
if(argc == optind ) //optind系统变量,执行命令参数的个数(不包括命令,奇怪的是无参情况下他为1),判断argc是否为1,是则取当前路径,让我们显得更专业点
{
ls_prepare("./",aflag,lflag);
}
else
{
for(i=optind;i<argc;i++) //所有目录都传进去
ls_prepare(argv[i],aflag,lflag);
}
printf("\n");
return 0;
}
❸ 提问+J-LINK,U-LINK和ST-LINK有什么区别
j-link,u-link和st-link有什么区别,item·区别如下:
1、其实就是诺基亚和摩托罗拉的区别,大厂商的管保,小厂商的不管,不过tp-link和d-link都不错,tp-link设置更方便一些,d-link的功能多,但是设置页面比较乱,但是也是一款不错的网络设备
2、 这几款在参数和价格方面很均衡,整体来说都非常不错;。
3、 但是买东西,关键还是要看产品的特点是否符合您的需求,建议认真衡量以后,选择适合自己的。
ST-LINK /V2指定的SWIM标准接口和JTAG / SWD标准接口,其主要功能有:
(1)编程功能:可烧写FLASH ROM、EEPROM、AFR等。
(2)仿真功能:支持全速运行、单步调试、断点调试等各种调试方法,可查看IO状态,变量数据等等。
(3)仿真性能:采用USB2.0接口进行仿真调试,单步调试,断点调试,反应速度快!
(4)编程性能:采用USB2.0接口,进行SWIM / JTAG / SWD下载,下载速度快!
❹ LINUX 怎么删除 文件link
每一个文件,都可以通过一个struct stat的结构体来获得文件信息,其中一个成员st_nlink代表文件的链接数。
当通过shell的touch命令或者在程序中open一个带有O_CREAT的不存在的文件时,文件的链接数为1。
通常open一个已存在的文件不会影响文件的链接数。open的作用只是使调用进程与文件之间建立一种访问关系,即open之后返回fd,调用进程可以通过fd来read 、write 、 ftruncate等等一系列对文件的操作。
close()就是消除这种调用进程与文件之间的访问关系。自然,不会影响文件的链接数。在调用close时,内核会检查打开该文件的进程数,如果此数为0,进一步检查文件的链接数,如果这个数也为0,那么就删除文件内容。
link函数创建一个新目录项,并且增加一个链接数。
unlink函数删除目录项,并且减少一个链接数。如果链接数达到0并且没有任何进程打开该文件,该文件内容才被真正删除。如果在unlilnk之前没有close,那么依旧可以访问文件内容。
综上所诉,真正影响链接数的操作是link、unlink以及open的创建。
删除文件内容的真正含义是文件的链接数为0,而这个操作的本质完成者是unlink。close能够实施删除文件内容的操作,必定是因为在close之前有一个unlink操作。
举个例子简单说明:通过shell touch test.txt
1、stat("test.txt",&buf);
printf("1.link=%d\n",buf.st_nlink);//未打开文件之前测试链接数
2、fd=open("test.txt",O_RDONLY);//打开已存在文件test.txt
stat("test.txt",&buf);
printf("2.link=%d\n",buf.st_nlink);//测试链接数
3、close(fd);//关闭文件test.txt
stat("test.txt",&buf);
printf("3.link=%d\n",buf.st_nlink);//测试链接数
4、link("test.txt","test2.txt");//创建硬链接test2.txt
stat("test.txt",&buf);
printf("4.link=%d\n",buf.st_nlink);//测试链接数
5、unlink("test2.txt");//删除test2.txt
stat("test.txt",&buf);
printf("5.link=%d\n",buf.st_nlink);//测试链接数
6、重复步骤2 //重新打开test.txt
7、unlink("test.txt");//删除test.txt
fstat(fd,&buf);
printf("7.link=%d\n",buf.st_nlink);//测试链接数
8、close(fd);//此步骤可以不显示写出,因为进程结束时,打开的文件自动被关闭。
顺次执行以上8个步骤,结果如下:
1.link=1
2.link=1 //open不影响链接数
3.link=1 //close不影响链接数
4.link=2 //link之后链接数加1
5.link=1 //unlink后链接数减1
2.link=1 //重新打开 链接数不变
7.link=0 //unlink之后再减1,此处我们改用fstat函数而非stat,因为unlilnk已经删除文件名,所以不可以通过 文件名访问,但是fd仍然是打开着的,文件内容还没有被真正删除,依旧可以使用fd获得文件信息。
执行步骤8,文件内容被删除。。。。
❺ 问是否有成熟的Linux下 开发stm32的 环境搭建方案
不知道你是怎么想的,STM32不支持LINUX!
我觉得ARM+LINUX门槛高,做出来的东西不容易被山寨。
现在很多东西都可以用51、STM32来做,但是你的好想法,好创意都容易被其他公司给山寨去。
当然ARM+LINUX也会被山寨,但是要考虑山寨的成本。
我之前的对手公司,准备山寨我公司LINUX创意的产品,但是开发难度大,周期长。不能有效抢占市场,他们来挖人也挖不到,后来它们用UCOS来做。LINUX的强大是它的网络,用UCOS来山寨,再怎么厉害,其他的外设还好说,但是网络那关永远过不去。这就是一个槛。
现在驱动转做软件的大有人在,做好一个驱动基本就不用怎么大改了,而应用就不同了,不同的客户不同的应用。应用的需求大,所以很多做驱动/硬件的转软件。
但是,一般牛B的软件工程师大多是驱动/硬件工程师转过去的。因为他们知道如何将应用程序很好的控制硬件。
❻ 用stm32做软件无线电的处理模块需要什么工具
不能没有stm32的基础吧,既然课程要求,那这个必须学,弄过51应该不难。给你一个方向吧。
学习stm32,学到 能只依据数据手册编写一个模块的驱动为止。
知道一些常用的通讯协议,例如SPI、I2C等,例如比较常用的无线模块nrf24l01就是用SPI通信。还有lora模块等。(建议成对购买,一个发送一个接收)
既然是工具的话,那少不了万能的面包板吧,然后某宝入手一个无线模块,然后一个stm32的开发板(如果你基础好的话可以只买核心板,外围硬件自己搭建,比较省钱,同时锻炼搭建硬件的能力)。初学的话,我推荐stm32f103系列,后面转stm32f4系列(f4系列官网有DSP算法库,做开发的好帮手)。
去视频网站搜教学,csdn博客也行。
然后是开发环境,一般windows下基本必选keil,linux下可以使用gcc-arm-linux-eabi编译工具+vscode+stlink烧写工具。
到后面学深了,可以深入底层,包括根据数据手册进行arm架构汇编启动文件的编写、链接文件重定位等,一般都是入行后必学。
最后说一句,stm32的开发方式有库函数开发(库函数由ST官网提供)和寄存器开发(直接操作寄存器的方式),项目的搭建方面需要你花点功夫了,直接网络就行。
碰到问题善用网络,玩stm32你会碰到很多坑。
❼ LINUX中ls -l是如何工作的如何去实现一个脚本
可以参考:
#include
<sys/types.h>
#include
<sys/stat.h>
#include
<unistd.h>
#include
<stdio.h>
#include
<string.h>
#include
<errno.h>
#include
<pwd.h>
#include
<grp.h>
#include
<time.h>
#include
<dirent.h>
int
do_ls(char
*dir,char
*filename,int
lflag)
{
int
n;
struct
stat
buf;
char
out[100];
struct
passwd
*pw;
struct
group
*gr;
struct
tm
*t;
if(lflag
==
0)
//如果不带l参数,直接显示文件/目录名
{
printf("%s\t",filename);
return
0;
}
if(lstat(dir,&buf)<0)
{
fprintf(stderr,"stat
error:%s\n",strerror(errno));
return
-1;
}
switch(buf.st_mode
&
s_ifmt)
//获取字符串的属性:普通文件-、目录d、字符设备c、块设备b、管道文件p、连接文件l、套接字文件s
{
case
s_ifreg:
printf("-");
break;
case
s_ifdir:
printf("d");
break;
case
s_ifchr:
printf("c");
break;
case
s_ifblk:
printf("b");
break;
case
s_ififo:
printf("p");
break;
case
s_iflnk:
printf("l");
break;
case
s_ifsock:
printf("s");
break;
}
for(n=8;n>=0;n--)
//打印文件的读写属性:读r、写w、执行x、无权限-
{
if(buf.st_mode&(1<<n))
{
switch(n%3)
{
case
2:
printf("r");
break;
case
1:
printf("w");
break;
case
0:
printf("x");
break;
default:
break;
}
}
else
{
printf("-");
}
}
printf("
%d",buf.st_nlink);
//硬链接数,此链接非彼链接,指(包含)目录的个数,文件为1,目录起始为2,再加上目录里包含的目录个数(不递归,只一层)
pw
=
getpwuid(buf.st_uid);
//所属用户名
printf("
%s",pw->pw_name);
gr
=
getgrgid(buf.st_gid);
//所属组名
printf("
%s",gr->gr_name);
printf("
%ld",buf.st_size);
//字节计总大小
t
=
localtime(&buf.st_atime);
//最后一次访问时间
printf("
%d-%d-%d
%d:%d"
,t->tm_year+1900
,t->tm_mon+1
,t->tm_mday
,t->tm_hour
,t->tm_min);
printf("
%s
",filename);
if(s_islnk(buf.st_mode))
//判断是否为链接,是返回真
{
printf("
->
");
if(readlink(filename,out,100)==-1)
{
//printf("readlink
error\n");
}
printf("%s",out);
}
printf("\n");
return
0;
}
int
ls_prepare(char
*w,int
aflag,int
lflag)
//ls的准备工作
{
struct
stat
buf;
//man
lstat可以看到此结构
char
name[100];
dir
*dir;
//类似打开文件的fd描述符
struct
dirent
*pdr;
//man
readdir可以看到此结构
if(lstat(w,&buf)<0)
//获取文件/目录属性并赋值给buf,该函数和lstat一样,只是当w为链接时,指代他本身,并不存在文件
{
fprintf(stderr,"stat
error:%s\n",strerror(errno));
return
-1;
}
if(s_isdir(buf.st_mode))
//判断是否为目录,是返回真
{
dir
=
opendir(w);
//打开目录
while
((pdr
=
readdir(dir))!=null)
//读/遍历目录
{
if(aflag==0)
//如果不带a参数,越过以.开头的所有文件/目录
{
if(pdr->d_name[0]=='.')
continue;
memset(name,0,100);
strcpy(name,w);
//拷贝
strcat(name,"/");
//追加
strcat(name,pdr->d_name);
do_ls(name,pdr->d_name,lflag);
}else
//有a参数显示所有
{
memset(name,0,100);
strcpy(name,w);
strcat(name,"/");
strcat(name,pdr->d_name);
do_ls(name,pdr->d_name,lflag);
}
}
closedir(dir);
}else
//为文件则直接显示
{
do_ls(w,w,lflag);
}
return
0;
}
int
main(int
argc,char
**argv)
{
int
aflag
=0;
int
lflag
=0;
char
c;
int
i;
while((c
=
getopt(argc,argv,"al"))!=-1)
//解析命令行参数,即-/--后面的字符串和给定的字符串匹配,有未解析字母返回字母或问号(取决于第3个参数),否则返回-1
{
switch(c)
//此处仅匹配a(所有)和l(列表),即只支持参数a、l
{
case
'a':
aflag
=1;
break;
case
'l':
lflag
=1;
break;
default:
break;
}
}
if(argc
==
optind
)
//optind系统变量,执行命令参数的个数(不包括命令,奇怪的是无参情况下他为1),判断argc是否为1,是则取当前路径,让我们显得更专业点
{
ls_prepare("./",aflag,lflag);
}
else
{
for(i=optind;i<argc;i++)
//所有目录都传进去
ls_prepare(argv[i],aflag,lflag);
}
printf("\n");
return
0;
}
❽ Linux系统最基本,经常用的命令有哪些呢
Linux必学的60个命令(3)-系统管理
由 zhanjun 在 周四, 2006-04-13 12:41 提交
Linux必学的60个命令:系统管理相关命令
Linux必学的系统管理命令
作者:曹元其 发文时间:2004.10.18
对于Linux系统来说,无论是中央处理器、内存、磁盘驱动器、键盘、鼠标,还是用户等都是文件,Linux系统管理的命令是它正常运行的核心。熟悉了Linux常用的文件处理命令以后,这一讲介绍对系统和用户进行管理的命令。
cat cd
chmod chown
cp cut
名称:cat
使用权限:所有使用者
使用方式:cat [-AbeEnstTuv] [--help] [--version] fileName
说明:把档案串连接后传到基本输出(萤幕或加 > fileName 到另一个档案)
参数:
-n 或 --number 由 1 开始对所有输出的行数编号
-b 或 --number-nonblank 和 -n 相似,只不过对于空白行不编号
-s 或 --squeeze-blank 当遇到有连续两行以上的空白行,就代换为一行的空白行
-v 或 --show-nonprinting
范例:
cat -n textfile1 > textfile2 把 textfile1 的档案内容加上行号后输入 textfile2 这个档案里
cat -b textfile1 textfile2 >> textfile3 把 textfile1 和 textfile2 的档案内容加上行号(空白行不加)之后将内容附加到 textfile3
名称 : cd
使用权限 : 所有使用者
使用方式 : cd [dirName]
说明 : 变换工作目录至 dirName。 其中 dirName 表示法可为绝对路径或相对路径。若目录名称省略,则变换至使用者的 home directory (也就是刚 login 时所在的目录)。
另外,"~" 也表示为 home directory 的意思,"." 则是表示目前所在的目录,".." 则表示目前目录位置的上一层目录。
范例 : 跳到 /usr/bin/ :
cd /usr/bin
跳到自己的 home directory :
cd ~
跳到目前目录的上上两层 :
cd ../..
指令名称 : chmod
使用权限 : 所有使用者
使用方式 : chmod [-cfvR] [--help] [--version] mode file...
说明 : Linux/Unix 的档案存取权限分为三级 : 档案拥有者、群组、其他。利用 chmod 可以借以控制档案如何被他人所存取。
把计 :
mode : 权限设定字串,格式如下 : [ugoa...][[+-=][rwxX]...][,...],其中u 表示该档案的拥有者,g 表示与该档案的拥有者属于同一个群体(group)者,o 表示其他以外的人,a 表示这三者皆是。
+ 表示增加权限、- 表示取消权限、= 表示唯一设定权限。
r 表示可读取,w 表示可写入,x 表示可执行,X 表示只有当该档案是个子目录或者该档案已经被设定过为可执行。
-c : 若该档案权限确实已经更改,才显示其更改动作
-f : 若该档案权限无法被更改也不要显示错误讯息
-v : 显示权限变更的详细资料
-R : 对目前目录下的所有档案与子目录进行相同的权限变更(即以递回的方式逐个变更)
--help : 显示辅助说明
--version : 显示版本
范例 :将档案 file1.txt 设为所有人皆可读取 :
chmod ugo+r file1.txt
将档案 file1.txt 设为所有人皆可读取 :
chmod a+r file1.txt
将档案 file1.txt 与 file2.txt 设为该档案拥有者,与其所属同一个群体者可写入,但其他以外的人则不可写入 :
chmod ug+w,o-w file1.txt file2.txt
将 ex1.py 设定为只有该档案拥有者可以执行 :
chmod u+x ex1.py
将目前目录下的所有档案与子目录皆设为任何人可读取 :
chmod -R a+r *
此外chmod也可以用数字来表示权限如 chmod 777 file
语法为:chmod abc file
其中a,b,c各为一个数字,分别表示User、Group、及Other的权限。
r=4,w=2,x=1
若要rwx属性则4+2+1=7;
若要rw-属性则4+2=6;
若要r-x属性则4+1=7。
范例:
chmod a=rwx file
和
chmod 777 file
效果相同
chmod ug=rwx,o=x file
和
chmod 771 file
效果相同
若用chmod 4755 filename可使此程式具有root的权限
指令名称 : chown
使用权限 : root
使用方式 : chmod [-cfhvR] [--help] [--version] user[:group] file...
说明 : Linux/Unix 是多人多工作业系统,所有的档案皆有拥有者。利用 chown 可以将档案的拥有者加以改变。一般来说,这个指令只有是由系统管理者(root)所使用,一般使用者没有权限可以改变别人的档案拥有者,也没有权限可以自己的档案拥有者改设为别人。只有系统管理者(root)才有这样的权限。
把计 :
user : 新的档案拥有者的使用者 IDgroup : 新的档案拥有者的使用者群体(group)-c : 若该档案拥有者确实已经更改,才显示其更改动作-f : 若该档案拥有者无法被更改也不要显示错误讯息-h : 只对于连结(link)进行变更,而非该 link 真正指向的档案-v : 显示拥有者变更的详细资料-R : 对目前目录下的所有档案与子目录进行相同的拥有者变更(即以递回的方式逐个变更)--help : 显示辅助说明--version : 显示版本
范例 :
将档案 file1.txt 的拥有者设为 users 群体的使用者 jessie :
chown jessie:users file1.txt
将目前目录下的所有档案与子目录的拥有者皆设为 users 群体的使用者 lamport :
chmod -R lamport:users *
名称:cp
使用权限:所有使用者
使用方式:
cp [options] source dest
cp [options] source... directory
说明:将一个档案拷贝至另一档案,或将数个档案拷贝至另一目录。
把计�
-a 尽可能将档案状态、权限等资料都照原状予以复制。
-r 若 source 中含有目录名,则将目录下之档案亦皆依序拷贝至目的地。
-f 若目的地已经有相同档名的档案存在,则在复制前先予以删除再行复制。
范例:
将档案 aaa 复制(已存在),并命名为 bbb :
cp aaa bbb
将所有的C语言程式拷贝至 Finished 子目录中 :
cp *.c Finished
名称:cut
使用权限:所有使用者
用法:cut -cnum1-num2 filename
说明:显示每行从开头算起 num1 到 num2 的文字。
范例:
shell>> cat example
test2
this is test1
shell>> cut -c0-6 example ## print 开头算起前 6 个字符
test2
this i
名称 : find
用法 : find
使用说明 :
将档案系统内符合 expression 的档案列出来。你可以指要档案的名称、类别、时间、大小、权限等不同资讯的组合,只有完全相符的才会被列出来。
find 根据下列规则判断 path 和 expression,在命令列上第一个 - ( ) , ! 之前的部份为 path,之后的是 expression。如果 path 是空字串则使用目前路径,如果 expression 是空字串则使用 -print 为预设 expression�
expression 中可使用的选项有二三十个之多,在此只介绍最常用的部份。
-mount, -xdev : 只检查和指定目录在同一个档案系统下的档案,避免列出其它档案系统中的档案
-amin n : 在过去 n 分钟内被读取过
-anewer file : 比档案 file 更晚被读取过的档案
-atime n : 在过去 n 天过读取过的档案
-cmin n : 在过去 n 分钟内被修改过
-cnewer file :比档案 file 更新的档案
-ctime n : 在过去 n 天过修改过的档案
-empty : 空的档案-gid n or -group name : gid 是 n 或是 group 名称是 name
-ipath p, -path p : 路径名称符合 p 的档案,ipath 会忽略大小写
-name name, -iname name : 档案名称符合 name 的档案。iname 会忽略大小写
-size n : 档案大小 是 n 单位,b 代表 512 位元组的区块,c 表示字符数,k 表示 kilo bytes,w 是二个位元组。-type c : 档案类型是 c 的档案。
d: 目录
c: 字型装置档案
b: 区块装置档案
p: 具名贮列
f: 一般档案
l: 符号连结
s: socket
-pid n : process id 是 n 的档案
你可以使用 ( ) 将运算式分隔,并使用下列运算。
exp1 -and exp2
! expr
-not expr
exp1 -or exp2
exp1, exp2
范例:
将目前目录及其子目录下所有延伸档名是 c 的档案列出来。
# find . -name "*.c"
将目前目录其其下子目录中所有一般档案列出
# find . -ftype f
将目前目录及其子目录下所有最近 20 分钟内更新过的档案列出
# find . -ctime -20
名称:less
使用权限:所有使用者
使用方式:
less [Option] filename
说明:
less 的作用与 more 十分相似,都可以用来浏览文字档案的内容,不同的是 less 允许使用者往回卷动
以浏览已经看过的部份,同时因为 less 并未在一开始就读入整个档案,因此在遇上大型档案的开启时,会比一般的文书编辑器(如 vi)来的快速。
范例:
指令名称 : ln
使用权限 : 所有使用者
使用方式 : ln [options] source dist,其中 option 的格式为 :
[-bdfinsvF] [-S backup-suffix] [-V {numbered,existing,simple}]
[--help] [--version] [--]
说明 : Linux/Unix 档案系统中,有所谓的连结(link),我们可以将其视为档案的别名,而连结又可分为两种 : 硬连结(hard link)与软连结(symbolic link),硬连结的意思是一个档案可以有多个名称,而软连结的方式则是产生一个特殊的档案,该档案的内容是指向另一个档案的位置。硬连结是存在同一个档案系统中,而软连结却可以跨越不同的档案系统。
ln source dist 是产生一个连结(dist)到 source,至于使用硬连结或软链结则由参数决定。
不论是硬连结或软链结都不会将原本的档案复制一份,只会占用非常少量的磁盘空间。
-f : 链结时先将与 dist 同档名的档案删除-d : 允许系统管理者硬链结自己的目录-i : 在删除与 dist 同档名的档案时先进行询问-n : 在进行软连结时,将 dist 视为一般的档案-s : 进行软链结(symbolic link)-v : 在连结之前显示其档名-b : 将在链结时会被覆写或删除的档案进行备份-S SUFFIX : 将备份的档案都加上 SUFFIX 的字尾-V METHOD : 指定备份的方式--help : 显示辅助说明--version : 显示版本
范例 :
将档案 yy 产生一个 symbolic link : zz
ln -s yy zz
将档案 yy 产生一个 hard link : zz
ln yy xx
名称:locate
使用权限:所有使用者
使用方式: locate [-q] [-d ] [--database=]
locate [-r ] [--regexp=]
locate [-qv] [-o ] [--output=]
locate [-e ] [-f ] <[-l ] [-c]
<[-U ] [-u]>
locate [-Vh] [--version] [--help]
说明:
locate 让使用者可以很快速的搜寻档案系统内是否有指定的档案。其方法是先建立一个包括系统内所有档案名称及路径的资料库,之后当寻找时就只需查询这个资料库,而不必实际深入档案系统之中了。
在一般的 distribution 之中,资料库的建立都被放在 contab 中自动执行。一般使用者在使用时只要用
# locate your_file_name
的型式就可以了。 参数:
-u
-U
建立资料库,-u 会由根目录开始,-U 则可以指定开始的位置。
-e
将
排除在寻找的范围之外。
-l
如果 是 1.则启动安全模式。在安全模式下,使用者不会看到权限无法看到的档案。这会始速度减慢,因为 locate 必须至实际的档案系统中取得档案的权限资料。
-f
将特定的档案系统排除在外,例如我们没有到理要把 proc 档案系统中的档案放在资料库中。
-q
安静模式,不会显示任何错误讯息。
-n
至多显示 个输出。
-r
使用正规运算式 做寻找的条件。
-o
指定资料库存的名称。
-d
指定资料库的路径
-h
显示辅助讯息
-v
显示更多的讯息
-V
显示程式的版本讯息 范例:
locate chdrv : 寻找所有叫 chdrv 的档案
locate -n 100 a.out : 寻找所有叫 a.out 的档案,但最多只显示 100 个
locate -u : 建立资料库
名称 : ls
使用权限 : 所有使用者
使用方式 : ls [-alrtAFR] [name...]
说明 : 显示指定工作目录下之内容(列出目前工作目录所含之档案及子目录)。
-a 显示所有档案及目录 (ls内定将档案名或目录名称开头为"."的视为隐藏档,不会列出)
-l 除档案名称外,亦将档案型态、权限、拥有者、档案大小等资讯详细列出
-r 将档案以相反次序显示(原定依英文字母次序)
-t 将档案依建立时间之先后次序列出
-A 同 -a ,但不列出 "." (目前目录) 及 ".." (父目录)
-F 在列出的档案名称后加一符号;例如可执行档则加 "*", 目录则加 "/"
-R 若目录下有档案,则以下之档案亦皆依序列出
范例:
列出目前工作目录下所有名称是 s 开头的档案,愈新的排愈后面 :
ls -ltr s*
将 /bin 目录以下所有目录及档案详细资料列出 :
ls -lR /bin
列出目前工作目录下所有档案及目录;目录于名称后加 "/", 可执行档于名称后加 "*" :
ls -AF
名称:more
使用权限:所有使用者
使用方式:more [-dlfpcsu] [-num] [+/pattern] [+linenum] [fileNames..]
说明:类似 cat ,不过会以一页一页的显示方便使用者逐页阅读,而最基本的指令就是按空白键(space)就往下一页显示,按 b 键就会往回(back)一页显示,而且还有搜寻字串的功能(与 vi 相似),使用中的说明文件,请按 h 。
参数:-num 一次显示的行数
-d 提示使用者,在画面下方显示 [Press space to continue, q to quit.] ,如果使用者按错键,则会显示 [Press h for instructions.] 而不是 哔 声
-l 取消遇见特殊字符 ^L(送纸字符)时会暂停的功能
-f 计算行数时,以实际上的行数,而非自动换行过后的行数(有些单行字数太长的会被扩展为两行或两行以上)
-p 不以卷动的方式显示每一页,而是先清除萤幕后再显示内容
-c 跟 -p 相似,不同的是先显示内容再清除其他旧资料
-s 当遇到有连续两行以上的空白行,就代换为一行的空白行
-u 不显示下引号 (根据环境变数 TERM 指定的 terminal 而有所不同)
+/ 在每个档案显示前搜寻该字串(pattern),然后从该字串之后开始显示
+num 从第 num 行开始显示
fileNames 欲显示内容的档案,可为复数个数
范例:
more -s testfile 逐页显示 testfile 之档案内容,如有连续两行以上空白行则以一行空白行显示。
more +20 testfile 从第 20 行开始显示 testfile 之档案内容。
名称:mv
使用权限:所有使用者
使用方式:
mv [options] source dest
mv [options] source... directory
说明:将一个档案移至另一档案,或将数个档案移至另一目录。
参数:-i 若目的地已有同名档案,则先询问是否覆盖旧档。
范例:
将档案 aaa 更名为 bbb :
mv aaa bbb
将所有的C语言程式移至 Finished 子目录中 :
mv -i *.c
名称:rm
使用权限:所有使用者
使用方式:rm [options] name...
说明:删除档案及目录。
把计�
-i 删除前逐一询问确认。
-f 即使原档案属性设为唯读,亦直接删除,无需逐一确认。
-r 将目录及以下之档案亦逐一删除。
范例:
删除所有C语言程式档;删除前逐一询问确认 :
rm -i *.c
将 Finished 子目录及子目录中所有档案删除 :
rm -r Finished
名称:rmdir
使用权限:于目前目录有适当权限的所有使用者
使用方式: rmdir [-p] dirName
说明: 删除空的目录。
参数: -p 是当子目录被删除后使它也成为空目录的话,则顺便一并删除。
范例:
将工作目录下,名为 AAA 的子目录删除 :
rmdir AAA
在工作目录下的 BBB 目录中,删除名为 Test 的子目录。若 Test 删除后,BBB 目录成为空目录,则 BBB 亦予删除。
rmdir -p BBB/Test
名称:split
使用权限:所有使用者
使用方式:split [OPTION] [INPUT [PREFIX]]
说明:
将一个档案分割成数个。而从 INPUT 分割输出成固定大小的档案,其档名依序为 PREFIXaa, PREFIXab...;PREFIX 预设值为 `x。若没有 INPUT 档或为 `-,则从标准输入读进资料。
匡兜�
-b, --bytes=SIZE
SIZE 值为每一输出档案的大小,单位为 byte。
-C, --line-bytes=SIZE
每一输出档中,单行的最大 byte 数。
-l, --lines=NUMBER
NUMBER 值为每一输出档的列数大小。
-NUMBER
与 -l NUMBER 相同。
--verbose
于每个输出档被开启前,打印出侦错资讯到标准错误输出。
--help
显示辅助资讯然后离开。
--version
列出版本资讯然后离开。
SIZE 可加入单位: b 代表 512, k 代表 1K, m 代表 1 Meg。
范例:
PostgresSQL 大型资料库备份与回存:
因 Postgres 允许表格大过你系统档案的最大容量,所以要将表格 mp 到单一的档案可能会有问题,使用 split进行档案分割。
% pg_mp dbname | split -b 1m - filename.mp.
重新载入
% createdb dbname
% cat filename.mp.* | pgsql dbname
名称:touch
使用权限:所有使用者
使用方式:
touch [-acfm]
[-r reference-file] [--file=reference-file]
[-t MMDDhhmm[[CC]YY][.ss]]
[-d time] [--date=time] [--time={atime,access,use,mtime,modify}]
[--no-create] [--help] [--version]
file1 [file2 ...]
说明:
touch 指令改变档案的时间记录。 ls -l 可以显示档案的时间记录。
参数:
a 改变档案的读取时间记录。
m 改变档案的修改时间记录。
c 假如目的档案不存在,不会建立新的档案。与 --no-create 的效果一样。
f 不使用,是为了与其他 unix 系统的相容性而保留。
r 使用参考档的时间记录,与 --file 的效果一样。
d 设定时间与日期,可以使用各种不同的格式。
t 设定档案的时间记录,格式与 date 指令相同。
--no-create 不会建立新档案。
--help 列出指令格式。
--version 列出版本讯息。
范例:
最简单的使用方式,将档案的时候记录改为现在的时间。若档案不存在,系统会建立一个新的档案。
touch file
touch file1 file2
将 file 的时间记录改为 5 月 6 日 18 点 3 分,公元两千年。时间的格式可以参考 date 指令,至少需输入 MMDDHHmm ,就是月日时与分。
touch -c -t 05061803 file
touch -c -t 050618032000 file
将 file 的时间记录改变成与 referencefile 一样。
touch -r referencefile file
将 file 的时间记录改成 5 月 6 日 18 点 3 分,公元两千年。时间可以使用 am, pm 或是 24 小时的格式,日期可以使用其他格式如 6 May 2000 。
touch -d "6:03pm" file
touch -d "05/06/2000" file
touch -d "6:03pm 05/06/2000" file
df
1.作用
df命令用来检查文件系统的磁盘空间占用情况,使用权限是所有用户。
2.格式
df [options]
3.主要参数
-s:对每个Names参数只给出占用的数据块总数。
-a:递归地显示指定目录中各文件及子目录中各文件占用的数据块数。若既不指定-s,也不指定-a,则只显示Names中的每一个目录及其中的各子目录所占的磁盘块数。
-k:以1024字节为单位列出磁盘空间使用情况。
-x:跳过在不同文件系统上的目录不予统计。
-l:计算所有的文件大小,对硬链接文件则计算多次。
-i:显示inode信息而非块使用量。
-h:以容易理解的格式印出文件系统大小,例如136KB、254MB、21GB。
-P:使用POSIX输出格式。
-T:显示文件系统类型。
4.说明
df命令被广泛地用来生成文件系统的使用统计数据,它能显示系统中所有的文件系统的信息,包括总容量、可用的空闲空间、目前的安装点等。
超级权限用户使用df命令时会发现这样的情况:某个分区的容量超过了100%。这是因为Linux系统为超级用户保留了10%的空间,由其单独支配。也就是说,对于超级用户而言,他所见到的硬盘容量将是110%。这样的安排对于系统管理而言是有好处的,当硬盘被使用的容量接近100%时系统管理员还可以正常工作。
5.应用实例
Linux支持的文件系统非常多,包括JFS、ReiserFS、ext、ext2、ext3、ISO9660、XFS、Minx、vfat、MSDOS等。使用df -T命令查看磁盘空间时还可以得到文件系统的信息:
#df -T
文件系统 类型 容量 已用 可用 已用% 挂载点
/dev/hda7 reiserfs 5.2G 1.6G 3.7G 30% /
/dev/hda1 vfat 2.4G 1.6G 827M 66% /windows/C
/dev/hda5 vfat 3.0G 1.7G 1.3G 57% /windows/D
/dev/hda9 vfat 3.0G 2.4G 566M 82% /windows/E
/dev/hda10 NTFS 3.2G 573M 2.6G 18% /windows/F
/dev/hda11 vfat 1.6G 1.5G 23M 99% /windows/G
从上面除了可以看到磁盘空间的容量、使用情况外,分区的文件系统类型、挂载点等信息也一览无遗。
top
1.作用
top命令用来显示执行中的程序进程,使用权限是所有用户。
2.格式
top [-] [d delay] [q] [c] [S] [s] [i] [n]
3.主要参数
d:指定更新的间隔,以秒计算。
q:没有任何延迟的更新。如果使用者有超级用户,则top命令将会以最高的优先序执行。
c:显示进程完整的路径与名称。
S:累积模式,会将己完成或消失的子行程的CPU时间累积起来。
s:安全模式。
i:不显示任何闲置(Idle)或无用(Zombie)的行程。
n:显示更新的次数,完成后将会退出top。
4.说明
top命令是Linux系统管理的一个主要命令,通过它可以获得许多信息。这里我们结合图1来说明它给出的信息。
图1 top命令的显示
在图1中,第一行表示的项目依次为当前时间、系统启动时间、当前系统登录用户数目、平均负载。第二行显示的是所有启动的进程、目前运行的、挂起 (Sleeping)的和无用(Zombie)的进程。第三行显示的是目前CPU的使用情况,包括系统占用的比例、用户使用比例、闲置(Idle)比例。第四行显示物理内存的使用情况,包括总的可以使用的内存、已用内存、空闲内存、缓冲区占用的内存。第五行显示交换分区使用情况,包括总的交换分区、使用的、空闲的和用于高速缓存的大小。第六行显示的项目最多,下面列出了详细解释。
PID(Process ID):进程标示号。
USER:进程所有者的用户名。
PR:进程的优先级别。
NI:进程的优先级别数值。
VIRT:进程占用的虚拟内存值。
RES:进程占用的物理内存值。
SHR:进程使用的共享内存值。
S:进程的状态,其中S表示休眠,R表示正在运行,Z表示僵死状态,N表示该进程优先值是负数。
%CPU:该进程占用的CPU使用率。
%MEM:该进程占用的物理内存和总内存的百分比。
TIME+:该进程启动后占用的总的CPU时间。
Command:进程启动的启动命令名称,如果这一行显示不下,进程会有一个完整的命令行。
top命令使用过程中,还可以使用一些交互的命令来完成其它参数的功能。这些命令是通过快捷键启动的。
<空格>:立刻刷新。
P:根据CPU使用大小进行排序。
T:根据时间、累计时间排序。
q:退出top命令。
m:切换显示内存信息。
t:切换显示进程和CPU状态信息。
c:切换显示命令名称和完整命令行。
M:根据使用内存大小进行排序。
W:将当前设置写入~/.toprc文件中。这是写top配置文件的推荐方法。
可以看到,top命令是一个功能十分强大的监控系统的工具,对于系统管理员而言尤其重要。但是,它的缺点是会消耗很多系统资源。
5.应用实例
使用top命令可以监视指定用户,缺省情况是监视所有用户的进程。如果想查看指定用户的情况,在终端中按“U”键,然后输入用户名,系统就会切换为指定用户的进程运行界面,见图2所示。
图2 使用top命令监视指定用户
free
1.作用
free命令用来显示内存的使用情况,使用权限是所有用户。
2.格式
free [-b|-k|-m] [-o] [-s delay] [-t] [-V]
3.主要参数
-b -k -m:分别以字节(KB、MB)为单位显示内存使用情况。
-s delay:显示每隔多少秒数来显示一次内存使用情况。
-t:显示内存总和列。
-o:不显示缓冲区调节列。
4.应用实例
free命令是用来查看内存使用情况的主要命令。和top命令相比,它的优点是使用简单,并且只占用很少的系统资源。通过-S参数可以使用free命令不间断地监视有多少内存在使用,这样可以把它当作一个方便实时监控器。
#free -b -s5
使用这个命令后终端会连续不断地报告内存使用情况(以字节为单位),每5秒更新一次。
quota
1.作用
quota命令用来显示磁盘使用情况和限制情况,使用权限超级用户。
2.格式
quota [-g][-u][-v][-p] 用户名 组名
3.参数
-g:显示用户所在组的磁盘使用限制。
-u:显示用户的磁盘使用限制。
-v:显示没有分配空间的文件系统的分配情况。
-p:显示简化信息。
4.应用实例
在企业应用中磁盘配额非常重要,普通用户要学会看懂自己的磁盘使用情况。要查询自己的磁盘配额可以使用下面命令(下例中用户账号是caojh):
#quota caojh
Disk quotas for user caojh(uid 502):
Filesystem blocks quota limit grace files quota limit grace
/dev/hda3 58 200000 400000 41 500 1000
以上显示ID号为502的caojh账号,文件个数设置为500~1000个,硬盘空间限制设置为200M