shell编程:
参数:$#:传入脚本的命令行参数个数
$*:所有命令行参数值,在各个参数之间留有空格
$0:命令本身(shell文件名)
$1:第一个命令行参数
$2:第二个命令行参数
expr :数学计算 expr 1+2 或a=`expr $a + $b`
格式 : if then fi(退出)
if[ 条件 ](前后空格) if[ $a = $b](等号前后有空格)
相等 -eq 或 = -e 文件已经存在
不同 -ne 或 != -f 文件是普通文件
大于 -gt 或 > -s 文件大小不为0
小于 -lt 或 < -r 文件对当前用户可读
大于等于 -ge -w 文件。。。。。。。可写
小于等于 -le -x . ...可执行
为空 -z 例 if[ -r "$test" ] then ...
不为空 -n
for语句格式:
for 变量 in 列表 例: list=“1 2 3 4 5 6”
do for day in $list
commands echo $day
done done
while语句格式:
while 条件 例: var=5
do while [ $var -gt 0 ]
commands(命令) do
done echo $var
var='expr $var - 1`
done
sed编辑器:
sed [ 操作选项 ] ’命令‘ 文件名
-n : 指定处理后只显示该行
-e : 进行多项编辑任务
-i : 直接修改读取的文件内容,而不是由屏幕输出
p : 打印匹配行
a : 新增
c : 替代一行
d : 删除定位行
s : 替代一行中的某些部分
example: sed -n '2p' tmp.txt 只显示文件tmp.txt的第二行
sed -n '1,3p' tmp.txt 打印第1到3行
sed -n '/mov/'p tmp.txt 打印含mov的行
sed '2d' tmp.txt 删除第2行
sed '3,$d' tmp.txt 删除第3到最后一行
sed -n '/hello/p' tmp.txt 查询含hello的所有行
sed '1c hi' tmp.txt 第1行替代为hi
awk 分析器:
awk '{要查找的内容 + 匹配后所执行命令}' filenames
example: last -n 5 | awk '{print $1}'
cat /etc/passwd | awk -F ':' '{print $1}'
awk -F ':' '$1=="root" {print $0}' /etc/passwd
GDB使用流程:、
1. 编译 gcc -g text.c -o text
2.启动GDB gdb text
3.在main函数出设置断点 break main
4.运行 run
list(l) %查看程序
break(b)函数名 %在某函数入口处添加断点
break(b)文件名:行号 %在指定文件的指定行添加断点
info break %查看所有设置的断点
delete 断点编号 %删除断点
next(n) %单步运行程序(不进入子函数)
step(s) %单步运行程序(进入子函数)
continue(c) %继续运行程序
print(p) 变量名 %查看指定变量值
quit(q) %退出GDB
Core Dump故障分析:
ulimit -c unlimited %打开coredump
ulimit -c 0 %关闭coredump
gdb ./text core.???? %用法(须保证编译时带可调式)
查看代码运行地址:(0x80480000)
1. ./text运行
2. ps aux %查看进程编号
3. cat /proc/0000(编号)/maps
readelf -S 程序名
数据存放:
1. 代码段:代码、全局常量、字符串常量
2. 数据段:全局变量、静态变量
3. 堆 :动态分配区域
4. 栈 :局部变量(不包含静态变量)、局部只读常量
函数库存放位置: /lib 、 /usr/lib %*.so*动态函数库 *.a* 静态函数库
静态库需要自己安装
制作静态库:
1. gcc -c mylib.c -o mylib.o
2. ar cqs libmylib.a mylib.o
3. 将制作好的libmylib.a复制到/usr/lib
-lname: 链接其他库 如gcc text.c -lmylib -o text
制作动态库:
1. gcc -c mylib.c -o mylib.o
2. gcc -shared -fPIC mylib.o -o libmylib.so
3. 将制作好的libmylib.so 复制到/usr/lib
% -fpic 使输出的对象模块是按照可重定位地址方式生成的
% -shared 指明产生动态链接库
守护进程:1.后台(使父进程退出、子进程运行)
2.不占终端(setsid();实现)
3.独立于父进程(1.修改工作目标 [chdir("目录")]
2.改文件权限掩码 umask(0);
3.关闭打开的文件(for 0->65535 close[i]))
函数:打开、创建、关闭文件、
功能:从一个打开的文件中读取数据
原型:read(int fd,void *buf,size_t count)
返回值:读取字节数或-1
头文件:<unistd.h>
参数说明:fd:文件描述符
count:读取字节数
buf:读取数据到buf只想空间
功能:关闭一个文件
原型:int close(int fd);
返回值:0或-1
头文件:<unistd.h>
参数说明:待关闭文件的描述符、
man 2 write(查找帮助)
功能:向一个打开的文件写入数据
原型:ssize_t write(int fd,const void *buf,size_t count);
返回值:写入的字节数或-1
头文件:<unistd.h>
参数说明:fd:文件描述符
buf:要写入数据的位置
count:要写入的字节数
功能:重新定位文件读写位置
原型:off_t lseek(int fd, off_t offset,int whence);
返回值:实际偏移位置或-1
头文件:<sys/types.h> <unistd.h>
参数说明:fd:文件描述符
offset:偏移位置
whence:起始位置(SEEK_SET、SEEK_CUR、SEEK_END)
功能:复制文件描述符
原型:int dup(int oldfd)或int dup2(int oldfd,int newfd)
返回值:返回新的文件描述符或-1
头文件:<unistd.h>
参数说明:oldfd:待复制的文件描述符
功能:打开或创建文件
原型:int open(const char *pathname,int flags,mode_t mode)
int creat(const char *pathname, mode_t mode)
返回值:文件描述符或-1
头文件:<sys/types.h> <sys/stat.h><fcntl.h>
参数说明:pathname:文件名(可含路径)
flags:打开方式(O_RDWR、O_RDONLY、O_WRONLY、O_CRAET等)
mode: 文件权限(0777全部权限)
功能:打开文件
原型:file fopen(const char *path, const char *mode)
返回值:文件指针 或NULL
头文件:<stdio.h>
参数说明:path :文件名(可含路径)
mode:文件打开模式(r,r+,w,w+,a,a+)
功能:关闭文件
原型:int fclose(flle *fp)
返回值:0或EOF
头文件:<stdio.h>
参数说明:文件指针
功能:文件中读取数据
原型:size_t fread(void *ptr,size_t size,size_t nmemb,file *stream)
返回值:成功读取的数据或失败0
头文件:<stdio.h>
参数说明:stream:只想要读取的文件
ptr: 读取后数据保存位置
size: 读取数大小
nmemb: 读取数据块数(读取后数据总大小:size*nmemb)
功能:想文件中写入数据
原型:fwrite(const viod *ptr,size_t size,size_t nmemb,flie *stream)
返回值:成功写入的数据量或0
头文件:stdio.h
参数说明:stream:要写入数据的文件指针
ptr:存放要写入文件的数据
size:每块数据的大小
nmemb:写入的数据块
功能:设置文件指针位置
原型:int fseek(FILE *stream,long offset,int whence)
返回值:0或-1
头文件:stdio.h
参数说明:stream:文件指针
offset:移动字节数
whence:指针初始位置(SEEK_SET,SEEK_CUR,SEEK_END)
功能:返回日历时间
原型:time_t time(time_t *t);
返回值:返回日历时间或-1
头文件:time.h
参数说明: t :不为空时保存返回时间
功能:将参数timep所指定的时间转化成标准时间
原型:struct tm *gmtime(const time_t *timep)
返回值:成功返回世间标准时间
头文件:time.h
参数说明:待转化的物理时间
功能:将timep所指向的时间转化成本地时间
原型:struct tm *localtime(const time_t *timep)
返回值:成功返回struct tm存储本地时间 失败NULL
头文件:time.h
参数说明:timep:待转换的物理时间
功能:将struct tm格式的时间转化为字符串
原型:char *asctime(const struct tm *tm)
返回值:字符串方式显示的时间
头文件:time.h
参数说明:tm:待转化的tm格式的时间
功能:获取高精度时间
原型: int gettimeofday(struct timeval *tv,struct timezone *tz)
返回值:成功0 失败-1
头文件:sys/time.h
参数说明:tv:保存从1970年1月1日0时到现在的秒数和微秒数
tzone:通常为空
功能:返回进程id
原型:pid_t getpid(void)
返回值:进程ID
头文件:sys/types.h unistd.h
参数说明:无
功能:创建一个子进程(重新建一个独立的栈)
原型:pid_t fork(void)
返回值:成功:子进程ID ,在子程序中返回0 失败:-1
头文件:unistd.h
参数说明:
功能: 创建一个子进程,并阻塞父进程(与父进程同栈)
原型: pid_t vfork(void)
返回值:成功:子进程ID ,在子程序中返回0 失败:-1
头文件:unistd.h sys/types.h
参数说明:、
进程退出:return() exit()
功能:挂起调用他的进程,直到子进程结束
原型:pid_t wait(int *status)
返回值:成功:返回终止的子程序的ID 失败 -1
头文件:sys/types.h sys/wait.h
参数说明:status:记录子进程的退出
功能:运行可执行文件
原型:int execl(const char * pathname,const char *arg....)
返回值:成功不返回
头文件:unistd.h
参数说明:pathname:要运行的可执行文件的路径
arg:可执行文件运行需要的参数
fork:创建一个新的进程,产生一个新的pid
execl:保留原有的进程,执行新的代码
管道通信特点:
1. 单向性,有固定的读端和写端
2. 数据被读出后,该数据就不存在了
3. 当进程去读取空管道时,进程会阻塞
4. 当进程往满管道写入数据时,进程会堵塞
5. 管道容量为64k
无名管道用于父子进程间通信
有名管道用于任意进程间通信
所有信号定义在:/usr/include/asm/signal.h
SIGKILL:杀死进程
SIGSTOP:暂停进程
SIGCHLD:子进程停止或结束时用来通知父进程
功能:创建无名管道
原型:int pipe(int pipefd[2])
返回值:成功:0 失败-1
头文件: <unistd.h>
参数说明:pipefd: 存放读写文件标识符
有名管道文件打开方式:只读或只写
功能: 创建一个有名管道文件
原型: int mkfifo(const char *pathname, mode_t mode)
返回值:成功:0 失败:-1
头文件: <sys/stat.h>
参数说明:pathname:所创建有名管道文件名
mode:文件访问权限
功能:删除文件
原型:int unlink(const char* pathname)
返回值:成功0 失败-1
头文件:<unistd.h>
参数说明:pathname:指明要删除的文件名
功能:向进程发送信号
原型:int kill(pid_t pid,int sig);
返回值:成功0 失败 -1
头文件: <sys/types.h> <signal.h>
参数说明:pid:大于0:指向接收的信号进程
sig: 指明要发送的信号
功能:设置信号处理方式
原型:typedef void (*sighandler_t)(int);
sighander_t signal(int signum,sighandler_t handler)
返回值:成功:函数指针 失败:SIG_ERR
头文件: <signal.h>
参数说明:signum:要处理的信号
handler:信号的处理方式,可以取值
SIG_IGN:忽视信号(不处理)
SIG_DFL:交给内核处理
用户定义类型函数处理
功能:获取信号集合的标识符 当key所指定的信号量不存在的时候,并且semflg
里包含了IPC_CREAT,就会创建一个信号量集合
原型:int semget(key_t key,int nsems,int semflg)
返回值:信号集合的标识符 或-1
头文件: <sys/types.h> <sys/ipc.h> <sys/sem.h>
参数说明:key:键值
nsems:所创建的信号集合里包含的信号数目
semflg:标志
功能: 操作信号量
原型: int semop(int semid,struct sembuf *sops,unsigned nsops)
返回值:0或-1
头文件: <sys/ipc.h> <sys/sem.h> <sys/types.h>
参数说明:semid:要操作的信号量集合的标识符
nsops:要操作的信号量个数
sops:信号量操作方式
功能: 创建键值
原型: key_t ftok(const char *pathname,int proj_id)
返回值:成功:生成的键值 失败:-1
头文件: <sys/types.h> <sys/ipc.h>
参数说明:pathname:一个已经存在的文件名
proj_id:项目编号
功能:控制信号量集合(查找、更改等)
原型:int semctl(int semid,int semum,int cmd,.....)
头文件:<sys/types.h> <sys/ipc.h> <sys/sem.h>
返回值:错误:-1 成功:依操作命令而定 如GETVAL则返回集合中需要的信号量
参数说明: semid:要操作的信号量集合的标识符
semum:操作第几个信号量
cmd:执行何种操作
功能:创建获取共享内存
原型:int shmget(kry_t key size_t size,int shmflg)
头文件:sys/ipc.h sys/shm.h
返回值:成功:共享内存描述符 失败:-1
参数说明:key: 共享内存的键值 size:共享内存的大小 、
shmflg: 打开标志 ,如果使用了IPC_CREAT则会创建新的共享内存
功能:把shmid指定的共享内存映射到进程的地址空间里
原型:void *shmat(int shmid,const void *shmaddr,int shmflg)
头文件:<sys/types.h> <sys/shm.h>
返回值:成功:共享内存映射成功的地址 失败:-1
参数说明:shmid: 要映射的共享内存id shmaddr:映射的后地址(一般为NULL)
shmflg:标志
功能:从进程地址空间中断掉与共享内存联系
原型:int shmdt(const void *shmaddr)
头文件:<sys/types.h> <sys/shm.h>
返回值:0或-1
参数说明:shmaddr:要断开的共享内存的映射地址
功能:控制(删除)共享内存
原型:int shmctl(int shmid,int cmd,struct shmid_ds *buf)
头文件:<sys/ipc.h> <sys/shm.h>
返回值:成功:根据不同操作返回不同值 失败:-1
参数说明:shmid:要控制的共享内存id cmd:决定执行什么样的操作(IPC_RMID删除)
buf:获取描述共享内存的参数 (一般不用)
功能:创建新的线程(编译时必须链接库 pthread)
原型:int pthread_create(pthread_t *thread,const pthread_attr_t *attr,
void *(*start_routine) (void *),void *arg);
头文件:<pthread.h>
返回值:成功:0 失败:错误编码
参数说明: thread:新创建线程的ID attr:待创建线程的属性
start_routine:线程的入口函数
arg:入口函数的参数
功能:用于等待线程结束(编译时必须链接pthread库)
原型:int pthread_join(pthread_t thread,void **retval)
头文件:<pthread.h>
返回值:
参数说明:thread:要等待线程结束的ID、
retval:保存线程退出是的状态
功能:结束线程(编译时必须链接pthread库)
原型:void pthread_exit(void *retval)
头文件:<pthread.h>
返回值:无
参数说明:retval:保存退出值
功能:初始化互斥锁
原型:int pthread_mutex_init(pthread_mutex_t *restrict mutex,
const pthread_mutexattr_t *restrict attr)
头文件:<pthread.h>
返回值:成功:0 失败:错误编号
参数说明:mutex:要初始化互斥锁的指针
attr:属性 (NULL时为默认属性)
功能:获取互斥锁
原型:int pthread_mutex_lock(pthread_mutex_t *mutex)
头文件:<pthread.h>
返回值:0或错误编号
参数说明:mutex:互斥锁指针
功能:释放互斥锁
原型:int pthread_mutex_unlock(pthread_mutex_t *mutex)
头文件:
返回值:
参数说明:同上
功能:创建或打开消息队列
原型:int msgget(key_t key,int msgflg)
头文件:<sys/types.h><sys/msg.h><sys/ipc.h>
返回值:成功返回消息id 失败-1
参数说明:key:键值 msgflg:打开标志 IPC_CREAT表示创建
功能:发送消息到消息队列
原型:int msgsnd(int msgip, const void *msgp,size_t msgsz,int msgflg)
头文件:<sys/types.h> <sys/ipc.h> <sys/msg.h>
返回值:0或-1
参数说明:msgp:消息队列ip msgp:指向要发送的消息
msgsz:发送消息的长度 msgflg:标志
功能:从消息队列接收消息
原型:ssize_t msgrcv(int msgip, void *msgp, size_t msgsz,long msgtyp,int msgflg)
头文件:同上
返回值:成功:实际接到消息的数据长度 失败 -1
参数说明:msqip:消息队列ip msgsz:存放取出的消息
msgsz:希望取到消息的最大长度
msgtyp:消息的类型 0:忽略类型,直接去第一条 >0 : 取消息类型等于msgtyp的第一条
<0 :去类型比msgtyp绝对值小于或等于的最小的消息
msgflg:标志
功能:删除消息
原型:int msgctl(int msqid, int cmd ,struct msqid_ds *buf)
头文件:<sys/types.h> <sys/ipc.h> <sys/msg.h>
返回值:0 或 -1
参数说明:msqid:消息队列的id cmd:要做的操作(IPC_RMID删除)
buf:获取内核中的msqid_ds ,通常不用、
功能:创建一个套接字
原型:int socket(int domain,int type,int protocal)
头文件:<sys/socket.h>
返回值:套接字的描述符 或-1
参数说明:domain:确定通信特征(AF_INET 、AFINET6)
type: 确定套接字类型(SOCK_STREAM(TCP)、SOCK_DGRAM(UDP))
protocal:通常为0,选择默认协议
功能:将套接字与地址绑定
原型:int bind (int sockfd,const struct sockaddr *addr,
socklen_t addrlen);
头文件:<sys/types.h> <sys/socket.h>
返回值:0 或 -1
参数说明:
主机、网络字节序,大于2k则存在
功能:设置监听端口
原型: int listen (int sockfd,int backlog)
头文件:<sys/socket.h>
返回值:0或-1
参数说明: backlog:该进程要入队的连接请求数目
功能:等待连接
原型: int accept (int sockfd, struct socktrict addr,
aocklent_t *rectrict len);
头文件:<sys/socket.h>
返回值:新的套接字描述符 或-1
参数说明:addr :存放地址 len:指向缓冲区的指针
功能:发送、接收数据
原型: ssize_t send/recv(int sockfd,const void *buf,size_t nbytes,int flag)
头文件:<sys/socket.h>
返回值:接收、发送的字节数 或-1
参数说明:和write、read同
功能:
原型:int close()
头文件:
返回值:
参数说明:
功能:建立连接
原型:int connect(int sockfd, const struct sockadder *addr,socklen_t len)
头文件:<sys/socket.h>
返回值:0或-1
参数说明:sockfd:套接字描述符 addr:服务器地址 len:
TCP协议:客户端:创建socket、设置地址、连接服务器、发送数据、关闭socket
服务器:创建socket、设置地址、绑定地址、监听、等待连接、接收数据、关闭socket