[课程笔记] Linux环境限制 遵循规范,使用现有资源,明确系统限制,增量开发. (1)规范问题 编码的规范,让程序更易读.Linux编码规范. “见着如意”:变量,函数命名等能够让人看到名称就知道大概的用处和功能. 另外各个单词间全用下划线,全部用小写. user_count “层次清楚”:代码各个模块逻辑要清楚,多用子函数,多用空行来间隔. 一般不建议一个函数的代码行数超过80行: (2)库的使用 printf这是一个库函数.加快开发的进度. 头文件:.h,里面是函数及变量的声明.#inc…
[课程笔记] Linux 下编辑调试工具,gcc,gdb. 把高级语言编译成二进制可执行代码的工具. 需要经历四个步骤: (1) 预处理:去掉注释,进行宏替换(#define相关),头文件(#include)包含等工作 gcc -E test.c -o test.i (2) 编译:不同平台采用的汇编语言不一样.编译将高级语言编译成汇编语言. gcc -S test.c -o test.s (3) 汇编:将汇编语言翻译成二进制的目标代码. gcc -c test.c -o test.o (4) 链…
[课程笔记] [命令行参数] 选项:-l -a -i 参数:-l /home main 函数形式: int main(int argc, char *argv[]) main函数是有参数的,而且有返回值 argc:参数的个数 argv[]:指针数组,存放是具体的参数列表 如 ls -l -a -i argv[0] 指向 "ls" argv[1] 指向 "-l" argv[2] 指向 "-a" argv[3] 指向 "-i" a…
信号屏蔽 信号忽略:系统仍然传递该信号,只是相应的进程不做任何处理 信号屏蔽:进程不捕获信号,信号处于未决状态,当不再屏蔽信号时可以捕获之前被屏蔽的信号. 信号集数据结构定义: typedef __sigset_t sigset_t; #define _SIGSET_NWORDS (1024 / (8 * sizeof(unsigned long int))) typedef struct { //此结构体占据32 * 32 = 1024 bit 每bit对应一个信号 val[0]0-31位对应…
iCore3双核心应用开发平台基于iCore3双核心板,包含ARM.FPGA.7寸液晶屏.双通道数字示波器.任意波发生器.电压表等模块,是一款专为电子爱好者设计的综合性电子学习系统. [视频简介]本视频主要介绍了iCore3与开发平台的扩展板组装和拆卸方法 银杏科技优酷视频发布区: http://i.youku.com/gingko8…
linux下怎么安装Go开发环境?linux部署golang  0.请自行安装SSH远程工具 1.  SSH远程登录你的linux服务器 2.   yum install mercurial安装 mercurial包 3.  安装git包yum install git 4.  安装gccyum install gcc 5.   然后就可以下载golang的压缩包了wget https://go.googlecode.com/files/go1.2.linux-amd64.tar.gz 下载完成…
从毕业到现在已经快20年了,一直在从事Windows平台上的开发工作.刚毕业那会大约是97,98年左右,工作的平台除了Windows平台还有Dos平台,因为在学校学习时,也是从Dos开始的.因此对于从事Dos平台上的DBase程序开发也不需要适应期,后来转向到Foxpro语言.使用Foxpro语言做了差不多2年的数据库开发及维护工作.在这期间Windows95系统在国内越来越主流,因此也开始学习Windows平台上的一些开发工具,最开始时还是从Foxpro的升级版本Visual Foxpro开始…
守候进程 启动方式: 在系统启动时由/etc/rd.d目录下的启动脚本启动 利用inetd超级服务器启动 有cron命令定时启动,以及在终端用nohup命令启动 守护进程编程要点 (1)屏蔽有关控制终端操作的信号,防止守护进程正常启动之前,控制终端受到干扰退出或挂起. ; i <= ; i++) signal(SIGTTOU, SIG_IGN); //忽略所有可以忽略的信号,STGSTOP和SIGKILL不能忽略 (2)在后台运行,为了避免挂起控制终端.方法在进程中创建子进程,并使父进程终止.…
VI是Linux/Unix下标配的一个纯字符界面的文本编辑器.由于不支持鼠标功能,也没有图形界面,相关的操作都要通过键盘指令来完成,需要记忆大量命令.因此很多人不大喜欢它,但同时由于键盘的方式往往比鼠标来得快,一旦熟练后用起来是有种非常流畅的感觉的,也有人因此而非常喜欢它. 不管你喜欢也好,不喜欢也好,VI是Linux的标配编辑器,很多时候你也只有这一个编辑器可用,如果要做一个Linux Coder,熟悉VI还是非常有必要的. PS:由于VI的命令非常多,本文主要只介绍一些基础命令.并且就算是这…
xinetd服务介绍 xinetd是Linux下的一个网络守候进程,用来统一管理网络负载不大的一组小型网路服务. 一些小型的网络服务,比如时间,telnet服务,不以守候进程出现,而是让xinetd服务以守候进程出现.如果某客户端发起连接,xinetd服务将接收该连接,创建新进程,根据请求信息决定执行具体的服务代码. 我的虚拟机上居然没有...先安装一下吧 sudo apt-get install xinetd xinetd守候进程的配置文件, /etc/xinetd.conf 内容如下 /et…
UDP组播通信 组播IP地址: D类IP地址  1110.**********  224.0.0.1 ~ 239.255.255.255 组播MAC地址:低23位,直接对应IP地址, 从右数第24位为0, 前24位为 01:00:5E 最终数据帧如图 局域网所有主机网卡都会收到这一消息,但是只有加入到组内的主机才接受该数据包.组播不影响同一局域网内其他主机的效率. 将自己的主机IP地址加入到组播地址组: setsockopt(sockfd, IPPROTO_IP, IP_ADD_MEMBERSH…
线程与进程对比 1.用户空间对比 2.内核空间资源对比 在创建线程时,Linux内核仍然创建一个新的PCB来标识这个线程.内核并不认为进程与线程有差别. 进程是操作系统管理资源的基本单元,线程时Linux系统调度的基本单元. 3.进程线程函数对比 创建线程 int pthread_create (pthread_t *__restrict __newthread, __const pathread_attr_t *__restrict __attr, void *(*__start_routin…
消息队列 消息队列是消息的链式队列,模型如下: 包括两种数据结构: msqid_ds消息队列数据结构 msg消息队列数据结构 struct msg_msg{ struct list_head m_list; long m_type; //消息类型 int m_ts; //消息大小 struct msg_msgseg* next; //下一个消息位置 void *security; //真正消息位置 }; 在/usr/include/linux/msg.h文件中定义了队列大小的限制.不同的Linu…
System V, 曾经也被称为 AT&T System V,是Unix操作系统众多版本中的一支. 传统上,System V 被看作是两种UNIX"风味"之一(另一个是 BSD).然而,随着一些并不基于这两者代码的UNIX实现的出现,例如 Linux 和 QNX, 这一归纳不再准确. System V IPC基础 System V 的IPC机制主要有消息队列.信号量和共享内存3种机制. shell中的 ipcs 命令可以查看当前系统中正在使用的IPC工具. shell中的 ip…
Linux操作系统所支持的主要进程间的通信机制. 无名管道 PIPE cat test.txt| grep hello 上面这种管道,将一个命令的输出作为另一个命令的输入,而这种管道是临时的,命令执行完成后将自动消失,称为无名管道. int pipe (int __pipedes[2]) :创建无名管道 如果执行成功,pipe将存储两个整型文件描述符于__pipedes[0](只能读)和__pipedes[1](只能写)中,它们分别指向管道的两端.如果需要双工的,需要建立两个管道. 读写无名管道…
域名与IP信息解析 /etc/hosts 文件中有部分IP地址与域名主机名的信息 /etc/resolv.conf 里面有DNS服务器的IP地址 struct hostent { char *h_name; //主机的正式名字 char **h_aliases; //主机备选名称,以NULL结尾的链表 int h_addrtype; //返回地址的类型 有两种 AF_INET或 AF_INET6 int h_length; //地址长度 以字节为单位 char **h_addr_list; //…
socket信号驱动 为了使一个套接字能够使用信号驱动I/O,至少需要以下3步操作. 1.安装SIGIO信号 2.套接字的拥有者设定为当前进程.因为SIGIO信号只会送到socket拥有者进程. 通过fcntl的F_SETOWN 3.套接字必须被允许使用异步I/O. 通过fcntl的F_SETFL,设置为O_ASYNC 在UDP通信中,下面情况会产生SIGIO信号 在TCP通信中,下面情况会产生SIGIO信号 例子: 下面的代码好奇怪,说是UDP的,但是发送接收用的是send, recv 而且客…
UDP广播通信 单播:一对一,TCP和UDP均可完成 广播:只能UDP完成.广播时发送方只发送一个数据包,但是网络上的交换机默认转发广播数据包到所有端口.路由器默认不转发任何广播数据包.故广播在局域网范围内. 组播:只有UDP可以完成.发送消息到同一个组播组的主机.视频电话.视频会议多采用. 广播IP地址:主机号全1.网络号正常 广播MAC地址:全1,即FF:FF:FF:FF:FF:FF 广播数据帧格式 处理过程: 网卡驱动程序对比自己的MAC地址与目的MAC地址,发现是广播MAC地址,统一接收…
UDP网络通信流程 UDP没有connect的过程,故发送数据时需要指明目的地址,不能使用read/write/send/recv. 采用sendto()和recvfrom() ssize_t sendto (int __fd, __const void *__buf, size_t __n, int __flags, __CONST_SOCKADDR_ADR __addr, socklen_t __addr_len) 向某一主机发送字节序列 参数1:从本机哪个socket发送数据 参数2:欲发…
控制socket文件描述符属性 1.set/getsockopt()修改socket属性 int getsockopt (int __fd, int __level, int __optname, void *__restrict __optval, socklen_t *__restrict __optlen):获得某个套接字的属性.成功0,失败-1 int setsockopt (int __fd, int __level, int __optname, __const void *__op…
socket多路复用应用 int select (int nfds, fd_set *readfds, fd_set *writefds, fd_set *exceptfds, struct timeval *timeout)  功能:轮循等待的方式,从多个文件描述符中获取状态变化后的情况 readfds :包含所有可能因状态变成可读而触发select()函数返回的文件描述符 writefds :包含所有可能因状态变成可写而触发select()函数返回的文件描述符 exceptfds :包含所有…
文件I/O方式比较 1.阻塞式文件I/O 进程从调用函数开始,直到返回这段时间都处于阻塞状态. 2.非阻塞式文件I/O 如果当前没有数据可操作,将不阻塞当前进程,而是立即返回一个错误信息.需要反复尝试. 3.多路复用I/O 仍然是阻塞方式等待,但是可以同时等待多个文件描述符. 4.信号驱动I/O 异步方式,等到数据准备好后通知处理进程,不需要重复询问,效率高. I/O阻塞与非阻塞操作 阻塞方式:默认情况下read/write和 把flag设为0的recv/send 非阻塞方式:如果没有数据,立刻…
网络调试工具 tcpdump 功能:打印指定网络接口中与布尔表达式匹配的报头信息 关键字: ①类型:host(默认).net.port host 210.27.48.2 //指明是一台主机 net 202.0.0.0 //指明是一个网络 port //指明端口号 ②确认传输方向:src. dst. dst or src. dst and src src 210.27.48.2 //ip包中源地址为此值 dst net 202.0.0.0 //目的网络地址是202.0.0.0 ③协议关键字:fdd…
使用之前的函数实现的简单聊天程序 TCP协议 双方实时发送/接收消息 实现后的问题: 可能是我虚拟机的IP地址配得有问题吧.在一台电脑上面开两个终端,用127.0.0.1的IP收发可以互通.但是两个虚拟机就不行了,用192.168的IP段,能够ping通但是代码接收不到消息. 还有,两个进程都是接收到消息后,需要我自己按一下回车才能发送消息. 服务器端代码: #include<stdio.h> #include<string.h> #include<errno.h> #…
BSD Socket网络编程API 创建socket对象 int socket (int __domain, int __type, int __protocol) :成功返回socket文件描述符,失败返回-1. 参数1:socket对象使用的地址簇或协议簇  常用的有PF_LOCAL(本机通信).PF_INET(IPv4协议簇).PF_INET6(IPv6协议簇) 参数2:socket的类型.共有六种.常见有:面向连接的数据流方式:面向无连接的数据报方式 参数3:标识采用哪一种协议,0表示默…
IP地址定义: struct in_addr{ __u32 s_addr; }; in_addr_t  inet_addr (__const char * __cp) :把点分十进制IP地址字符串转换为32位IP地址(网络存储顺序). in_addr_t inet_network (__const char * __cp) :把点分十进制IP地址字符串转换为32位IP地址(主机字节顺序). char * inet_ntoa (struct in_addr_in) :把32位网络字节顺序的IP地址…
读写锁 书上有读者写者的代码,我实在是懒得实现一遍了.跟之前的代码差不多. 多线程异步信号处理 int pthread_kill (pthread_t __threadid, int __signo) :发送信号.第二个参数为0时表示检测指定线程是否存在.成功返回0. int pthread_sigmask (int __how, __const __sigset_t *__restrict __newmask, __sigset_t * __restrict __oldmask) :设置调用线…
条件变量通信机制 条件变量必须配合互斥锁一起实现对资源的互斥访问 使用方法: int pthread_cond_init (pthread_cond_t *__restrict __cond, __const pthread_condattr_t *__restrict __cond_attr) :初始化条件变量,第二个参数是属性对象,NULL为默认 int pthread_cond_destroy (pthread_cond_t *__cond) :销毁条件变量 int pthread_con…
线程同步机制 互斥锁通信机制 int pthread_mutex_init (pthread_mutex_t *__mutex, __const pthread_mutexattr_t *__mutexattr) :初始化互斥锁,成功返回0 参数1:要初始化的互斥锁 参数2:定义要初始化的互斥锁属性,NULL表默认 宏 PTHREAD_MUTEX_INITIALIZER 初始化静态分配互斥锁   ??这个语法是什么原理??? #define PTHREAD_MUTEX_INITIALIZER {…
共享内存 共享内存主要用于实现进程间大量数据传输. 共享内存的数据结构定义: 系统对共享内存的限制: 共享内存与管道的对比: 可以看到,共享内存的优势: 1.共享内存只需复制2次,而管道需要4次 2.共享内存不需要切换内核态与用户态,而管道需要. 共享内存效率高! int shmget (key_t __key, size_t __size, int __shmflg) :创建共享内存 第一个参数:key值 第二个参数:欲创建的共享内存段的大小(字节) 第三个参数:shmflg创建标识,包括IP…