第三步Linux高级编程

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

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值