Linux编程基础

一、U盘挂载

  U盘插入,默认挂载到根目录下的/media当前登录用户下。
  那么怎么手动挂载U盘呢?

1.获得U盘名字

  首先的知道U盘在Linux中叫什么名字,使用sudo fdisk -l就可以查询到,然后挂载到mnt目录下。一般叫/dev/sdb1.

2.挂载到/mnt

  使用sudo mount /dev/sdb1 /mnt,挂载到mnt目录下就ok了。

3.卸载U盘

  使用umount卸载U盘,但注意不能在U盘中卸载U盘,会提示正在忙。得退出U盘所在目录的其他目录卸载。

4.挂载到其他目录

  怎么基本都是挂载到/mnt目录下呢,当然可以挂载到其他目录,操作一样。只是挂载到其他目录时,U盘的内容会“暂时”覆盖此目录下的文件,当卸载U盘时才恢复在目录下的内容,这样会影响系统操作该目录。不过,可以将U盘挂载到一个空目录下嘛。

二、进程管理

1.ps查看进程

  (1)ps a :查看当前系统所有用户信息
  (2)ps au:在前面的基础上显示跟丰富的内容
  (3)ps aux:显示没有终端的进程,一般结合grep使用

2.kill进程

  kill –l :查看信号
  kill -9 pid:杀死进程

3.env和top

  env:查看当前进程的环境变量
  top:类似于windows的进程管理

三、用户管理

1.添加用户

  (1)sudo adduser username。一个脚本,帮我们做了很多事会自动添加家目录,组等信息。用户名不能大写
  (2)sudo useradd –s /bin/bash –g test2 –d /home/test2 –m test2
  使用useradd创建用户,-s指定用户使用的shell,-g指定用户名和组,-d指定家目录,-m指定当home下没有test2目录时,则创建。
  注意:1.此时可能会提示test2组不存在,那得先创建test2组,sudo groupadd test2.
     2.这种方法创建的用户没密码,也没有初始密码。命令格式:passwd 用户名 密码

2. 删除用户

sudo deluser username;只删除了用户,但没有删除家目录,得收到那个删除。
sudo userdel –r username;用户和家目录都删除。

四、ftp服务器配置

  Linux中有很多种搭建ftp服务器的方法,而且非常的简单。ftp的搭建主要是ftp服务软件的安装,这里选vsftpd来安装。

常见FTP服务器:
  Windows:Serv-U FTP Server
  Linux:ProFTPD:(Professional FTP daemon)一个Unix平台上或是类Unix平台上(如Linux, FreeBSD等)的FTP服务器程序。
  VSFTP是一个基于GPL发布的类Unix系统上使用的FTP服务器软件,它的全称是Very Secure FTP 从此名称可以看出来,编制者的初衷是代码的安全。

1.配置

(1)下载vsftpd
  sudo apt-get install vsftpd

(2)配置/etc/vsftpd.conf
  local_enable=YES
  write_enable=YES
  anon_upload_enable=YES
  anon_mkdir_write_enable=YES

(3)启动服务
  Service vsftpd start

(4)查看启动状态
  Service vsfptd status

2.出错信息

ftp:connet refuse…. 将listen_ipv6注释掉就行

五、ssh服务器

1.ssh登录远程主机

ssh 用户名@ip,然后输入用户密码。如ssh root@192.168.1.101

2.scp拷贝文件,文件夹时加-r

(1)上传本地文件到远程主机:scp 本地文件绝对路径 远程用户名@IP:绝对路径
(2)从远程主机下载文件:scp远程用户名@IP:绝对路径  本地文件绝对路径

六、vi

1.光标移动

H J K L 前 下 上 后
行首: 0(零)
行尾: $
文件开始:gg
文件末尾:G
行跳转:行数+G,如200G 跳转到200行

2.删除

删除的本质不是删除,而是剪切。
删除当前光标的后一个字符: x
删除当前光标的前一个字符: X
删除单词: dw(光标必须先移到单词前)
删除本行光标前的内容: d0
删除本行光标后的内容: D或d$
删除整行:dd
删除当前行到当前行的后几行:ndd;n为整数
撤销: u
反撤销: ctrl+r
3.复制粘贴
复制一行:yy
复制多行:nyy
粘贴: p

4.切换到文本模式

a—从光标所在位置后边开始插入
A—从当前光标所在行尾部开始插入
i—从光标所在位置前开始插入
I—从光标所在行首开始插入
o—在光标所在行的下边开辟新的一行
O—在光标所在行的上边开辟新的一行
s—删除光标后边一个字符在开始插入
S—删除光标所在行在开始插入

5.末行模式

1.查找替换

查找:
/tom 查找tom

替换:
s表示字符串
s/tom/jack/g 用jack替换当前鼠标说在行的所有tom
s/tom/jack ------------------------------------------第一个tom
3,12s/tom/jack/g 用jack替换3到12行的所有tom
2. 保存退出
q 推出
q!强制推出
w 保存
wq,x,ZZ 保存退出

3. 执行命令
格式:!+ 命令。如!pwd,!ls等,然后按enter键返回;

4.分屏
sp:水平分屏本文件
vsp:垂直分屏文件
ctrl+ww切换,若要分屏其他文件,后面跟文件路径,如vsp ~/home/test.txt

关闭分屏:
:only 或者 ctrl+w 和 o取消其它分屏,只保留当前分屏
ctrl+w 和 c(close)

七、gcc编译的四个阶段

在这里插入图片描述
  可以按上述四步生成可执行文件,也可以一步执行:gcc hello.c –o hello 会自动执行四个步骤。

八、静态库的制作和使用

1.命名规则

1)lib+库名+.a
2)libmytest.a

2.制作步骤

1)生成对应的.o文件,gcc xx.c –c –o xx.o
2)将生成的.o文件打包 ar rcs +静态库的名字(libmytest.a)+生成的所有.o

3.发布和使用静态库

1)发布静态库
	给别人发布libmytest.a和头文件
2)使用静态库

  比如写了一个main.c文件使用了静态库,那么有如下两种使用方式:

  1.gcc main.c –I 头文件路径 lib库的文件路径 –o 指定生成的名字(大i,header.h)
  gcc main.c –I heard libmytest.a –o mainapp
  2.gcc main.c –I 头文件路径 –L 库路径 –l 库名 –o 指定生成的名字
  gcc main.c –I heard –L库路径–l mytest –o mainapp2
  注:头文件没有.h

九、共享库的制作

在这里插入图片描述

1.命名规则

Lib+名字+.so

2.制作

1)生成与位置无关的代码

3.发布静态库

1)gcc –fPIC -c name.c –I 头文件目录
	-fPIC:生成与路径无关的.o
如:gcc –fPIC –c *.c –I include

2)gcc –shared –o name.so *.o –I 头文件目录
如:gcc –shared –o libMyCalc.so *.o –I include

4.使用动态库

1)调用gcc main.c lib路径 –o 生成名 –I 头文件名

gcc main.c  ./lib/libmycalc.so –o app –I include

2)查看依赖库

ldd 库名

5.解决动态库加载失败问题

  1)将动态库放到lib目录中,不允许使用。
  2)临时测试:临时将库路径存入变量中,供测试使用,关闭终端后失效。Export LD_LIBRARY_PATH=库路径(相对绝对都行)
  3)不常用的配置方法(永久设置):
在家目录~下的.bashrc文件中添加:export LD_LIBRARY_PATH=绝对路径,重启终端
  4)配置/etc/ld.so.conf
  将动态库绝对路径写入文件中,sudo ldconfig –v 更新配置文件
  如:/home/Ubuntu/program/lib , sudo ldconfig –v

十、makefile

在这里插入图片描述
1.makefile的编写
  1)makefile的命名:makefile或Makefile
  2)makefile的规则:

规则中的三要素:目标,依赖,命令
即: 目标:依赖条件
  命令

如:app:a.c b.c c.c
gcc a.c b.c c.c –o app

  但这样将会编译所有的.c文件,当只是某个源文件本更改,而不需要编译其他文件时,应该怎样写:

app:a.o b.o c.o
		gcc a.o b.o c.o –o app 
a.o:a.c
		gcc –c a.c
b.o:b.c
		gcc –c b.c
c.o:c.c
		gcc -c c.c

2.makefile工作原理
  Makefile的原理是在生成目标时,比较目标与依赖的时间,若依赖的项比目标时间早,则更新依赖项。

3.makefile中的变量
1.实例:

obj=calculator.o main.o
target=main
$(target):$(obj)
	gcc $(obj) -o $(target)
%.o:%.c          #模式规则匹配
	gcc -c $< -o $@

2.变量规则:

1)makefile的变量不用声明类型,直接赋值使用。
2)使用:$(变量名)
3.自动变量
	$< : 规则中的第一个依赖
	$@: 规则中的目标
	$^ : 规则中的所有依赖

4.makefile中的函数
  所有函数都有返回值
常用函数:

1) wildcard函数:
  获取指定目录下某个类型的所有文件
参数:wildcard 参数;

2) patsubst 函数:
  模式匹配替换
  参数:patsubst 原字符串,被替换字符串,源字符串路径

3) 伪目标:没有依赖
  可以执行命令,必须在前用.PHONY:伪目标 声明
  如在make前需要清除.o等文件,可以这样写:

.PHONY:clean
Clean:
rm *.o –f(没则强制删除,提示没找到文件)

4)在命令前加-:
  表示若该命名执行不成功,则忽略这条命令,继续向下执行。

调用:make clean

#obj=calculator.o main.o
target=main
src=$(wildcard ./*.c)           #获得所有.c
obj=$(patsubst ./%.c,./%.o,$(src)) #获得所有.o
$(target):$(obj)
	gcc $(obj) -o $(target)
%.o:%.c
	gcc -c $< -o $@
.PHONY:clean
clean:
    rm $(obj)  $(target)  -f

十一、文件操作

1.查询系统函数帮助文档
  man man知道系统调用函数在第二章,然后使用man 章节 函数名 查看此函数的定义等。如查看open函数帮助文档:man 2 open

2.vi中函数跳到定义处的快捷键
  将光标放到系统函数上,shift + k会跳转到函数定义处。

3.lseek
(1)获取文件的大小
int size = lseek(fd,0,SEEK_END);

(2)移动文件指针
lseek(fd,0,SEEK_SET);//移动到文件开头

(3)文件拓展
  比如当前文件有14 byte,lseek(fd,2000,SEEK_END);则在14字节后面又加了2000字节。
  应用在如迅雷多线程下载一个文件时,先根据文件的大小创建相同大小的文件,用空洞填充,然后各程往不同段写入数据,直到下载完成

十二、系统函数

1.获取文件的存储信息stat函数
stat 文件名:获得该文件的详细属性信息
实例获取文件的详细信息:

#include<stdio.h>
#include<string.h>
#include<sys/types.h>
#include<sys/stat.h>
#include<stdlib.h>
#include<time.h>
#include<pwd.h>
#include<grp.h>
#include<unistd.h>

int main(int argc,char* argv[]){

	if(argc < 2){
		exit(1);
	}

	struct stat st;
	int ret = stat(argv[1],&st);
	if(ret == -1){
		perror("stat");
		exit(1);
	}
	char params[11] = {0};
	
	//file type
	switch(st.st_mode & S_IFMT){
		case S_IFSOCK:
			params[0] = 's';
			break;
		case S_IFLNK:
			params[0] = 'l';
			break;
		case S_IFREG:
			params[0] = '-';
			break;
		case S_IFBLK:
			params[0] = 'b';
			break;
		case S_IFDIR:
			params[0] = 'd';
			break;
		case S_IFCHR:
			params[0] = 'c';
			break;
		case S_IFIFO:
			params[0] = 'p';
			break;
		default:
			params[0] = '?';
			break;
	}
	//owner
	params[1] = (st.st_mode & S_IRUSR) ? 'r':'-';
	params[2] = (st.st_mode & S_IWUSR) ? 'w':'-';
	params[3] = (st.st_mode & S_IXUSR) ? 'x':'-';
	//group
	params[4] = (st.st_mode & S_IRGRP) ? 'r':'-';
	params[5] = (st.st_mode & S_IWGRP) ? 'w':'-';
	params[6] = (st.st_mode & S_IXGRP) ? 'x':'-';
	//other
	params[7] = (st.st_mode & S_IROTH) ? 'r':'-';
	params[8] = (st.st_mode & S_IWOTH) ? 'w':'-';
	params[9] = (st.st_mode & S_IXOTH) ? 'x':'-';
	
	int linkNum = st.st_nlink;
	char *fileUser = getpwuid(st.st_uid)->pw_name;
	char *fileGroup = getgrgid(st.st_gid)->gr_name;
	int fileSize = (int)st.st_size;
	
	char *time= ctime(&st.st_mtime);
	char mTime[512] = {0};
	strncpy(mTime,time,strlen(time) - 1);

	char buf[1024] = {0};
	sprintf(buf,"%s	%d %s %s %d %s %s",params,linkNum,fileUser,fileGroup,fileSize,mTime,argv[1]);
	
	printf("%s\n",buf);
	return 0;
}

2.其他系统函数

chmod:获取文件权限
strtol:将字符转换为指定的进制数
chown:更改文件是所有者
truncate:更改文件的长度
link:创建一个硬链接
symlink:创建一个软连接
readlink:读取软链接对应的文件名,不是读取内容
unlink:删除一个文件的目录并减少它的链接数,调用者必须有写和执行被删除文件的权限。

  1. 如果是符号链接,删除符号链接
  2. 如果是硬链接,硬链接键1,当减少到0时,释放数据块和inods
  3. 如果文件硬链接数为0,但有进程已经打开该文件,并持有文件描述符,则等该进程关闭时,kernel才真正的去删除该文件。可用于制作缓存文件,当进程结束,文件被自动删除。

目录操作函数:

chdir
getcwd
rmdir
opendir
readdir
closedir

dup,dup2:文件描述符的复制
dup2(old,new):

  1. old -> new 如果new是一个被打开的文件描述符,在拷贝前先关掉new
  2. old和new同一个文件描述符,不会关掉new,直接返回old
    fcntl:
    改变已经打开文件的属性;
    打开文件的时候:只读,然后可以修改添加写,追加等属性。
  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值