8种机械键盘轴体对比
本人程序员,要买一个写代码的键盘,请问红轴和茶轴怎么选?
linux进程设计笔记
shell语法
变量
声明:不需要声明,直接赋值;区分大小写;变量存储类型是字符串;使用read 变量名 来用这个变量名保存用户输入字符串
访问:变量前面加$
注意空格引号: 单引号,双引号 反斜杠
环境变量 大写字母$HOME
$PATH
$PS1:命令提示符如#,$
$PS2:二级命令提示符如>
$IFS:输入域分隔符,通常是空格
$0:shell脚本的名字
$#:传递脚本参数个数
$$:进程号
参数变量$1,$2,…:脚本进程的参数
$*:列出所有参数,使用环境变量中的IFS
$@:$*的变体,即使IFS为空,参数也不会挤在一起
条件
test / [ 命令
如果把then 和if 放在同一行必须用;把test语句和then分隔开字符串比较
算数比较
文档条件测试
控制结构if … then … elif … then … else … fi
for … in … do … done
while … do … done
case … in … … ) …;;esac
命令行表AND && 前面的命令执行成功的情况下,才执行后面的命令
OR || 前面一条命令执行失败才执行后面的命令
函数
声明:fun_name(){}
调用:fun_name
命令break
:
continue
.
echo
eval
exec
exit n
export
expr
printf
return
set
shift
trap
unset
find
grep
命令的执行算数扩展 : $(())
参数扩展 : ${param:-default} …
here 文档<< !xxx!
调试sh -n/v/x/u
文档操作
文档和设备/dev/console
/dev/tty
/dev/null
系统调用和库函数系统调用:由系统直接提供直接对文档和设备的访问和控制的底层函数
库函数:对设备和磁盘文档提供更高层的接口
底层文档访问
一些系统调用write
read
open
close
ioctl
lseek
fstat, stat, lstst
dup, dup2
标准IO库fopen,fclose
fread,fwrite
fflush
fseek
fgetc, getc, getchar
fputc, putc, putchar
fgets, gets
printf, fprintf, sprintf
scanf, fscanf, sscanf
文档和目录维护chmod
chown
unlink, link, symlink
mkdir, rmdir
chdir
扫描目录opendir
readdir
telldir
seekdir
closedir
错误处理strerror
perror
/proc 文档系统
包含了许多特殊文档用来对驱动进程和内核信息进行更高层的访问
Linux 环境
向进程传递参数getopt
getopt_long
环境变量用途: 采用环境变量改变进程运行方式,类似全局变量
environ变量: 通过这个变量访问字符串数组
时间和日期time, difftime, gmttime, localtime, mktime, asctime, ctime, strftime, strptime
临时文档tmpnam, tmpfile
数据管理
内存管理简单的内存分配:malloc
分配大量内存: 交换空间
滥用内存: segmentation error
空指针: segmentation error
释放内存: free
文档锁定创建锁文档
区域锁定共享(读)锁:有共享锁时,不能获得独占锁
解锁:
独占(写)锁:有独占锁时,不能有其他锁
进程和信号
进程的结构,类型和调度进程的结构:有自己的栈空间,保存局部变量和函数的调用和返回,有自己的环境空间,包含为这个进程建立的环境变量.进程表
查看进程 ps a/f/x/e/u PID/PPID/TTY/CMD/STAT/
系统进程
进程调度 nice
启动新进程:system : 进程必须等待由system函数启动的进程结束之后才能继续
替换进程映像 exec: 把当前进程替换为一个新的进程,原来的进程不再执行
复制进程映像 fork:父进程返回子进程pid,子进程返回0 这样可以区分两个进程
等待一个进程 wait: 父进程中调用wait
僵尸进程: 子进程运行结束 ,由于需要保存返回给父进程的信息所以依然存在系统中.这个时候就是僵尸进程,知道父进程调用wati 或者正常结束
线程: 进程可以相互协作,互相发送消息,互相中断,甚至可以共享内存段.但是想要共享变量不太可能.于是有了线程
信号
信号是UNIX/LINUX 系统响应某些条件而产生的一个事件.用raise/生成表示一个信号的产生,用catch/捕获表示接收一个信号SIG…
发送信号: kill
POSIX线程
在进程中创建新线程pthread_create : 类似于进程中的fork
pthread_exit: 类似于exit
pthread_join: 类似于pthread_wait
在一个进程中同步线程之间的数据访问信号量:他的作用如同看守一段代码的看门人sem_init
sem_wait
sem_post
sem_destroy
互斥量: 他的作用如同保护代码的一个互斥设备pthread_mutex_init
pthread_mutex_lock
pthread_mutex_unlock
pthread_mutex_destroy
线程的属性
取消一个线程pthread_cancel
进程间通信:管道
管道
从一个进程连接数据流到另外一个进程时
进程管道popen
pclose
pipe调用pipe(int file_descriptor[2]) 向file_descriptor[1]中写数据 从file_descriptor[0]中读数据 先进先出
调用pipe(..) 成功后 fork , 然后在子进程读,父进程写,就可以实现进程间的通信
子进程和父进程上个例子中由于fork之后文档描述符变量也会在两个进程中存在,因此在同一个进程中可以很方便的通信.如果其中一个进程需要执行别的进程呢? 这时候需要用exec来启动一个新的进程,然后把文档描述符传给这个进程就可以实现两个不同进程之间的进程的通信
管道关闭后的读操作:对已关闭写数据的管道进行读操作将返回0.fork之后只有当父子进程中的写数据的管道都关闭时,对管道的读操作才会失败
把管道用作标准输入和标准输出:dup() 复制文档描述符,返回最小的文档描述符.fork之后子进程把0(标准输入)关了,然后dup管道读文档的描述符[0],返回标准输入0.然后关掉原来管道读描述符,管道写描述符.父进程同理
FIFO 命名管道以上还是只能再相关进程之间传递数据,即由共同祖先进程启动的
mknod / mkfifo(优先使用)
cat < fifofile & , echo helloworld > fifofile
访问fifo文档: open 但是不能以读写的方式打开
信号量,共享内存,消息队列
信号量
共享内存
消息队列
套接字
套接字连接的工作原理套接字是一种通信机制,凭借这种机制,客户端/服务端系统的开发工作既可以在本地进行,也可以跨网络进行.
套接字如何连接?服务端socket 调用创建一个套接字
bind调用 命名 本地 系统文档名(/tmp 或者/usr/tmp), 网络 服务标识符(端口或者访问点)
listen调用 创建一个队列并将其用于存放来自客户端的连接
accept调用 接收客户端的连接
客户端socket 调用创建一个套接字
connect 以服务端的命名套接字作为一个地址来调用connect与服务器建立连接
套接字属性域domain 最常见的是AF_INET 指的是internet 底层协议为IP协议
类型流套接字SOCK_STREAM 底层由TCP/IP实现
数据报套接字 SOCK_DGRAM UDP/IP实现
套接字协议