Linux程序设计(第4版)

1、UNIX、Linux和GNU简介

2、shell程序设计

shell的通配符,*,?,[],[^],{},其中{}是把其中所有元素组成一个集合,如ls {a,b}.c,将匹配a.c,b.c。grep -l只显示文件名,如grep -l main *。file 文件名,可看文件格式。从shell输入用read。shell中的条件判断,可用if test -f main.,或if [ -f main.c ],表测试main.c是否为常规文件[]两侧都要空格。for循环,如for file in var in x) ;;y);;。&&,||。语句块,用{}括起来,多条语句合成一个,当作单条语句。函数fun_a(){},调用时直接fun_a,不用()。:是空命令。echo -n输出不换行。eval:对参数求值。echo可直接替换printf,如printf "%s\n" hello。trap命令用于指定在接收信号后将要采取的行动,格式trap command signal。here文档,它允许一条命令在获得输入数据时好像是在读取一个文件或键盘一样。

3、文件操作

Linux中比较重要的设备文件:/dev/console,/dev/tty和/dev/null。open时O_CREATE与O_EXCL一起使用,确保文件已经存在时,能返回错误。open时同时设置权限:open("myfile", O_CREATE, S_IRUSR|S_IXOTH);创建的权限会受umask限制,umask有值的不会被设置权限,如设置值为032,则禁止组写和执行权限,禁止其他用户写权限。ioctl系统调用,提供用于控制设备及其描述符行为和配置底层服务的接口,通过流获到对应描述符fileno,反之fdopen。目录:opendir,closedir,readdir,telldir,seekdir,closedir。错误码及取值:EPERM,EINTR,EINVA等。char *strerror(int errnum); void perror(const char *s);Linux提供一个特殊的文件系统procfs,它通常以/proc目录的形式呈现,该目录中包含许多特殊文件用来对驱动程序和内核信息进行高层的访问,如cat /proc/cpuinfo(meminfo)(version)。如修改值echo 80000 >/proc/sys/fs/file-max。如查看特定进程:ls -l /proc/9188,可通过如下方式查看命令行参数:od -c /proc/9188/cmdline。fcntl系统调用对底层文件描述提供了更多的操纵方法,int fcntl(int fildes, int cmd, long arg),可复制、获取和设置文件描述符标志,如fcntl(fildes, F_DUPFD, newfd),fcntl(fildes, F_GETFD)。mmap内存映射作用是建立一段可以被两个或更多程序读写的内存。

4、Linux环境

getopt解析命令行参数。getopt_long可接受以双划线(__)开始的长参数。环境变量:getenv,putenv。environ环境变量,extern char **environ。计算两个time_t时间差,用difftime。struct tm *gmtime(const time_t timeval)。char *tmpnam(char *a)生成唯一的临时文件名(多用户可能会重名),FILE *tmpfile()直接生成可写临时文件,不会出现前面冲突的情况。char *getlogin(void);返回与当前用户关联的登录名。用于/etc/shadow文件普通用户不能读,可以用struct passwd *getpwuid(uid uid);/getpwnam(const char *name);扫描密码文件中的所有信息:endpwend,getpwent,setpwend。获取网络名:gethostname(char *name, size_t namelen)。获取主机信息:uname(strucct utsname *name);syslog向日志设施(facility)写日志,其中设施值包括LOG_USER(默认值),它指出消息来自一个用户应用程序,以及LOG_LOCAL0到LOG_LOCAL7,它们含义由本地管理员指定。严重级别:LOG_EMERG(可能会广播给所有用户),LOG_ALERT(可能会EMAIL给管理员),LOG_CRIT,LOG_ERR,LOG_WARNING,LOG_NOTICE,LOG_INFO,LOG_DEBUG(可能会被忽略)。syslog时用%m可用于插入与错误变量errno当前值对应的出错消息字符串。closelog,openlog,setlogmask。openlog(const char *ident, int logopt, int facility);ident会添加在日志信息前面,如指明哪个程序创建了这条信息,logoopt对后续syslog调用的行为进行配置,如LOG_PID,LOG_CONS(如果信息不能被记录到日志文件中,就把它们发到控制台),LOG_ODELAY(在第一次调用syslog时才打开日志设施),LOG_NDELAY立即打开。资源和限制:limits.h,getrlimit,setrlimit。

5、终端

用户在屏幕上输入内容再按Enter才把数据传递给程序,这种处理方式为“规范模式(canonical mode)”或标准模式,所有输入都基于行处理(包括退格键),相对是非标准模式(non-canonical mode)。判断文件描述符是否关联到一个终端:isatty(int fd),如isatty(fileno(stdout))判断标准输出是否被重定向(如重定向到文件,则stdout调用isatty就不为真)。FILE *input = fopen("/dev/tty", "r"); FILE *output=fopen("/dev/tty", "w");打开tty,始终向终端输入输出,即使标准输入输出被重定向也不会改变此值。echo $TERM可查看当前Shell,terminfo屏蔽终端差异,setupterm设置终端类型,tigetnum获取行列长度。Linux通常在前6个虚拟控制台上运行一个getty进程,这样用户即可用同一个屏幕、键盘和鼠标在6不不同的虚拟控制台上登录。

6、使用curses函数库管理基于文本的屏幕

initscr,endwin,move,printw,refresh,还有刷新屏幕函数:addch,addchstr,printw,refresh,box,insch,insertln,delch,deleteln,beep,flash。从读取屏幕:inch,instr,innstr,erase,clean,clrtobot,clrtoeol。move,leaveok,字符属性:attron,attroff,attrset,standout,standend。键盘模式:echo,noecho,cbreak(非标准模式,输入立即传给程序),nocbreak,raw,noraw。键盘输入:getch,getstr,getnstr,scanw。窗口:newwin,delwin,移动窗口:mvwin,scroll。

7、数据管理

malloc可保证其返回的内存是地址对齐的,所以它可以被转换为任何类型的指针。calloc(size_t number_of_elements, size_t elemet_size);,realloc。文件区域锁定:如可用int fcntl(int fildes, int comman, struct flock *flock_struct);其中flock包括成员l_type, l_whence, l_start, l_len, l_pid。comman命令字:F_GETLK,F_SETLK。fread与fwrite有缓存,底层read,write没有缓存。dbm数据库适用于处理那些频繁访问但却很少被更新的数据,因为它创建数据项时非常慢,而检索时非常快。dbm也有新的ndbm(可以模块其他两个接口)及gdbm。头文件:/usr/include/gdbm中包含前三个头文件。dbm_open,dbm_stroe,dbm_fetch,dbm_close。

8、MySQL

9、开发工具

diff a b > c,计算a,b的差,用patch a c则a与b的值相同了,patch -R a c,则a又还原为原内容。tar参数cxvftz。

10、调试

操作系统分配给程序的内存一般都会比实际使用的大些,如果非法访问的内存出现在这部分区域,硬件就不能检测到,就不会出现段错误。DATETIME系统编译时的时间,不是运行时间。还有宏FILE,FUNCTION,LINE。gcc编译时加-DDEBUG时,#ifdef DEBUG代码就可起作用。gdb中用commands 断点号设置执行到指定断点的操作。可在编译时用gcc -O -g来同时获得程序优化和调试信息的好处,但优化可以对程序代码的先后顺序调整,在调试时可能跳来跳去。动态内存检测工具:ElectricFence(发现内存破坏时就停止运行),valgrind(检测出数组访问错误和内存泄漏)。

11、进程和信号

启动新进程:int system(const char *string);相当于sh -c string。WIFEXITED,WEXITSTATUS,WIFSIGNALED,WTERMSIG,WISTOPPED,WSTOPSIG。僵尸进程:子进程运行完成后,进程表中代表子进程的表项不会释放,因为它退出码还需要保存起来,以备父进程今后的wait调用使用。如果父进程异常终止,子进程将init作为其父进程,此时子进程由init接管,僵尸进程将一直保留在进程表中直到被init进程发现并释放。wait会阻塞父进程,waitpid(pid_t pid, int *sta_loc, int options);当options指定为WNOHANG则不阻塞父进程。已打开的文件描述符将在fork和exec调用之后保留下来,FILE * freopen(const char *filename, const char mode,FILE stream);void (signal(int sig, void (func)(int)))(int);SIG_IGN,SIG_DEL。不可重入函数指该函数在被调用还没有结束前,再被调用可能会产生错误,通常是使用了全局资源,如printf中引用了全局变量stdout,malloc及free中全局内存分配表,信号处理函数中不能包含printf这样的不安全函数。sigaction。int pause(void);会将程序挂起直到有一个信号出现为止。int sigaction(int sig, const struct sigaction *act, struct sigaction *oact);sigaddset,sigemptyset,sigfillset,sigdelset,sigismember,sigprocmask,sigpending,sigsuspend。

12 POSIX线程

pthread_create,pthread_exit,int pthread_join(pthread_t th, void **thread_return);线程同步:信号量(如资源分配个数)、互斥量(互斥访问共享内存)。int sem_init(sem_t *sem, int pshared, unsigned int value);sem_wait,sem_post(不受init时初始化的个数限制,一直申请一直增加),sem_trywait,sem_destroy。pthread_mutex_init(pthread_mutex_t *mutex, const pthread_mutexattr_t *mutexattr);ptrhead_mutex_lock,unlock,destroy.如果父不再关心子线程,可用pthread_detach或修改属性,pthread_attr_detachedstate(如果设置了PTHREAD_CREATE_DETACHED就不能再调用pthead_join来获取另一线程的退出状态,脱离线程,还有JOINABLE),pthread_attr_setschedpolicy(如SCHED_FIFO),设置完之后pthread_attr_destroy。sched_get_priority_min(max)。取消(终止线程)pthread_cancel(pthread_t);被取消的线程可用pthread_setcancelstate(int state, int *oldstate);设置取消状态,如PTHRAD_CANCEL_ENABLE或DISABLE来忽略取消请求。pthread_setcanceltype。

13、进程间通信:管道

FILE *popen(const char *cmd, const char *mode);pclose,如果模式为r则把另一个进程的输出给当前进程用,否则为w则可调用fwrite向被调用程序发送数据,只能单向。int pipe(int file_des[2]);是FIFO,使用的是fd而不是stream,必须是底层的read,write不用能流fread,fwrite。管道有内置缓存区,它在write及read调用之间保存数据。创建命令管道:mkfifo filename(命令行或程序)。open时不指定O_NONBLOCK时,只指定O_RDONLY或O_WRONLY会阻塞,直到另一个读或写打开为止。

14、信号量、共享内存和消息队列

semctl,semop,semget。shmget.shmat,shmdt,shmctl。消息队列独立于发送和接收进程而存在,消除了在同步命令管理的打开和关闭时产生的困难。msgget,msgsnd,msgrcv,msgctl。用命令行显示删除ipcs,ipcrm。

15 、套接字

用sockaddr_un可在没网络的本机上运行(只能在同一电脑上运行),sockaddr_in是网络套接字。端口号:/etc/services。查看网络连接状况:netstat。select,FD_ZERO,FD_CLR,FD_SET,FDISSET。

16、用GTK+进行GNOME编程

17、用QT进程KDE编程

18、Linux标准

电子书目录:
链接:https://pan.baidu.com/s/1juVqQOMqXTzY9cBe_9SmSA
提取码:twtd
复制这段内容后打开百度网盘手机App,操作更方便哦

你可能感兴趣的:(Linux程序设计(第4版))