Linux应用编程
小帅比simon
热爱学习,想参与到改变世界的组织中!!
展开
-
信号的分类
不可靠信号linux信号机制基本上是从unix系统中继承过来的。早期unix系统中的信号机制比较简单和原始,后来在实践中暴露出一些问题,它的主要问题是: 进程每次处理信号后,就将对信号的响应设置为默认动作。在某些情况下,将导致对信号的错误处理;因此,用户如果不希望这样的操作,那么就要在信号处理函数结尾再一次调用signal(),重新安装该信号。早期unix下的不可靠信号主要指的是进程可能对信号做原创 2016-12-09 16:28:42 · 592 阅读 · 0 评论 -
网络编程中的地址复用和服务器支持多并发访问
上一篇文章中所写的示例代码号称弱爆了,所言不虚! 首先当服务器挂掉以后再启动是不能顺利的进行端口绑定的,所以我们需要解决地址复用的问题,也就是服务器端挂掉以后重启还可以进行地址绑定! 其次,上一篇文章的程序虽然指定了客户端最大数量是10,但是服务器端的程序却只能接受一个客户端,因为其他客户端在connect之后被协议栈放到了准备建立连接的队列里面!并没有等到服务器执行accept操作,所原创 2016-12-18 17:36:10 · 861 阅读 · 0 评论 -
网络编程中简单的点对点聊天程序
利用多进程实现,一个进程负责发送,一个进程负责接收!毕竟文件描述符共享(实际上是两个进程空间中不相关的文件描述符指向同一个文件)服务器端代码:/*server03*/#include <sys/types.h> /* See NOTES */#include <sys/socket.h>#include <netinet/in.h>#include <netinet/ip.h原创 2016-12-18 18:51:59 · 4451 阅读 · 0 评论 -
网络编程中本机地址常用函数
gethostbyname根据给定的主机名,获取主机信息。已经过时,仅用于IPv4,且线程不安全。#include <stdio.h>#include <netdb.h>#include <arpa/inet.h>extern int h_errno;int main(int argc, char *argv[]){ struct hostent *host; char st原创 2016-12-18 22:09:31 · 465 阅读 · 0 评论 -
网络编程中的粘包处理
流协议与粘包粘包原因tcp 字节流 无边界udp消息、数据报 有边界对等方,一次读操作,不能保证完全把消息读完。 对方接受数据包的个数是不确定的。产生粘包问题的原因 1、SQ_SNDBUF 套接字本身有缓冲区 (发送缓冲区、接受缓冲区) 2、tcp传送的端 mss大小限制 3、链路层也有MTU大小限制,如果数据包大于>MTU要在IP层进行分片,导致消息分割原创 2016-12-18 20:53:45 · 1825 阅读 · 0 评论 -
网络编程中服务器端避免僵尸进程
之前介绍的程序都没有解决僵尸进程,僵尸进程的处理之前介绍过,无非就是忽略SIGCHLD信号或者父进程调用wait/waitpid函数,对于服务器端只建立一个单进程和客户端通信的情况,wait和忽略信号的方法可以避免僵尸进程。 当服务器端和多个客户端建立多个进程通信的时候,如果同时停止所有客户端,则服务器端子进程会退出,并导致多个SIGCHLD信号同时发送给父进程,但服务器端父进程并不能结束,还原创 2016-12-18 22:04:35 · 725 阅读 · 0 评论 -
网络编程中的11种状态
转自:http://blog.csdn.net/engrossment/article/details/8104482 http://blog.csdn.net/xiaofei0859/article/details/6044694TCP连接的11种状态变迁 1、先上图:2、全部11种状态转载 2016-12-18 22:24:19 · 806 阅读 · 0 评论 -
网络编程中的SIGPIPE信号以及close和shutdown
SIGPIPE信号的产生如果对方socket已关闭,对等方再发写数据,则会产生SIGPIPE信号 * SIGPIPE信号会让进程终止(man 7 signal,阅读SIGPIPE默认ACT) * 往一个已经接收FIN的套接中写是允许的,接收到FIN仅仅代表对方不再发送数据。 * 在收到RST段之后,如果再调用write就会产生SIGPIPE信号,对于这个信号的处理我们通常忽略即可。原创 2016-12-18 22:33:32 · 790 阅读 · 1 评论 -
网络编程中的5种IO模型
阻塞I/O说明1:当上层应用app1调用recv系统调用时,如果对等方没有发送数据(缓冲区没有数据),上层应用app1将阻塞(默认行为,被linux内核阻塞);说明2:当对等方发送了数据,linux内核recv端缓冲区,有数据后,内核会把数据copy给用户空间。然后上层应用app1解除阻塞,执行下一步操作。非阻塞I/O说明1: 上层应用程序app2将套接字设置成非阻塞模式。说明2: 上层应转载 2016-12-18 22:40:41 · 1155 阅读 · 0 评论 -
进程间通信之命名管道FIFO通信
概念何谓命名管道匿名管道应用的一个限制就是只能在具有共同祖先(具有亲缘关系)的进程间通信。如果我们想在不相关的进程之间交换数据,可以使用FIFO文件来做这项工作,它经常被称为命名管道。命名管道是一种特殊类型的文件。 FIFO是Linux基础文件类型中的一种。但FIFO文件在磁盘上没有数据块,仅仅用来标识内核中一条通道。各进程可以打开这个文件进行read/write,实际上是在读写内核通道,这原创 2016-12-24 15:58:34 · 1170 阅读 · 0 评论 -
网络编程中的基础API使用
TCP通信模型Socket API基本用法socket函数包含头文件<sys/socket.h>功能:创建一个套接字用于通信原型int socket(int domain, int type, int protocol);参数 domain :指定通信协议族(protocol family)type:指定socket类型,流式套接字SOCK_STREAM,数据报套接字SOCK_DGRAM原创 2016-12-18 16:46:07 · 573 阅读 · 0 评论 -
进程间通信之匿名管道通信
概念管道是Unix中最古老的进程间通信的形式。我们把从一个进程连接到另一个进程的一个数据流称为一个“管道” 比如:eg: ls | wc -l ps –u wbm01|grep “aa”管道的本质====》固定大小的内核缓冲区管道限制 管道是半双工的,数据只能向一个方向流动;需要双方通信时,需要建立起两个管道只能用于具有共同祖先的进程(具有亲缘关系的进程)之间进行通信;通常,一个管道原创 2016-12-23 22:21:28 · 990 阅读 · 0 评论 -
信号编程之信号发送及信号处理函数遇到不可重入函数
kill函数函数原型: Int kill(pid_t pid, int siq)功能:既可以向自身发送信号,也可以向其他进程发送信号;参数: pid>0 将信号sig发给pid进程pid=0 将信号sig发给同组进程pid=-1 将信号sig发送给所有进程,调用者进程有权限发送的每一个进程(除了1号进程之外,还有它自身)pid<-1 将信号sig发送给进程组是pid(绝对值)的每一个进原创 2016-12-09 17:51:15 · 1222 阅读 · 0 评论 -
信号的阻塞和未达
信号在内核中的表示执行信号处理的动作称为信号递达(Delivery),信号从产生到递达之间的状态,称为信号未决(Pending)。进程可以选择阻塞(Block)某个信号。被阻塞的信号产生时将保持在未决状态,直到进程解除对此信号的阻塞,才执行递达的动作。注意,阻塞和忽略是不同,只要信号被阻塞就不会递达,而忽略是在递达之后可选的一种处理动作。信号在内核中的表示可以看作是这样的: 1)PCB进程控制原创 2016-12-09 20:45:11 · 368 阅读 · 0 评论 -
网络编程中的select实现超时检测和通用API
关于select的基础知识在上一篇文章已经初步总结了,他的应用主要分为三个方向:用于完成超时检测(connect、accept、read以及write)用于处理客户端的普通文件描述符和套接字文件描述符,监控这些描述符可以避免在服务器死掉以后,客户端阻塞在等待标准输入或者其他文件的读取。用于服务器构造多并发,使用select可以实现单进程实现多并发!只不过是自己管理所有建立的用于通信的链接和用于原创 2016-12-21 19:51:45 · 2437 阅读 · 1 评论 -
网络编程中的select优化通用C/S模型
具体细节看代码及注释优化客户端#include <stdio.h>#include <stdlib.h>#include <string.h>#include <unistd.h>#include <errno.h>#include <fcntl.h>#include <sys/types.h>#include <sys/stat.h>#include <signal.h>#inc原创 2016-12-21 22:24:12 · 961 阅读 · 0 评论 -
网络编程中的概念再补充
ISO的开放互联网模型(OSI)TCP回射客户/服务器模型总结 OSI(open system interconnection)开放系统互联模型是由ISO(International Organization for Standardization)国际标准化组织定义的网络分层模型,共七层。 物理层(Physical Layer):物理层定义了所有电子及物理设备的规范,为上层转载 2016-12-23 11:25:28 · 486 阅读 · 0 评论 -
网络编程中的UDP通信
之前的网络编程主要针对的是TCP协议,现在总结一下学习UDP协议的知识点!基本概念 传输层主要应用的协议模型有两种,一种是TCP协议,另外一种则是UDP协议。TCP协议在网络通信中占主导地位,绝大多数的网络通信借助TCP协议完成数据传输。但UDP也是网络通信中不可或缺的重要通信手段。 相较于TCP而言,UDP通信的形式更像是发短信。不需要在数据传输之前建立、维护连接。只专心获取数据就好。省去原创 2016-12-23 11:08:00 · 1480 阅读 · 0 评论 -
进程间通信基本概念
进程同步与进程互斥顺序程序与并发程序特征 顺序程序特征顺序性封闭性:(运行环境的封闭性)确定性可再现性并发程序特征共享性并发性随机性进程互斥 由于各进程要求共享资源,而且有些资源需要互斥使用,因此各进程间竞争使用这些资源,进程的这种关系为进程的互斥系统中某些资源一次只允许一个进程使用,称这样的资源为临界资源或互斥资源。转载 2016-12-23 17:09:27 · 1530 阅读 · 0 评论 -
进程间通信之消息队列通信
概念消息队列消息队列提供了一个从一个进程向另外一个进程发送一块数据的方法每个数据块都被认为是有一个类型,接收者进程接收的数据块可以有不同的类型值消息队列也有管道一样的不足,就是每条消息的最大长度是有上限的(MSGMAX),每个消息队列的总字节数(内核缓冲上限)是有上限的(MSGMNB),系统上消息队列的总数(消息条目数)也有一个上限(MSGMNI)对比: 管道 消息 流管道 有原创 2016-12-23 17:33:11 · 4572 阅读 · 3 评论 -
进程间通信之共享内存初步
基本概念共享内存 共享内存区是最快的IPC形式。一旦这样的内存映射到共享它的进程的地址空间,这些进程间数据传递不再涉及到内核,换句话说是进程不再通过执行进入内核的系统调用来传递彼此的数据。 用管道或者消息队列传递数据 内核为每个IPC对象维护一个数据结构 用共享内存传递数据相关APIshmget函数功能:用来创建共享内存原型 int shmget(key_t key,原创 2016-12-24 22:32:15 · 3793 阅读 · 0 评论 -
多进程+共享内存+信号量综合实例
具体说明看注释,另外关于信号量的陷进可参考 http://os.51cto.com/art/201311/418977_all.htmhttp://blog.csdn.net/killmice/article/details/41516399测试框架#include <stdio.h>#include <stdlib.h>#include <string.h>#include <unistd.原创 2016-12-25 22:25:13 · 3034 阅读 · 1 评论 -
进程间通信之信号量通信
概念信号量信号量和P、V原语由Dijkstra(迪杰斯特拉)提出互斥:P、V在同一个进程中同步:P、V在不同进程中信号量值含义 S>0:S表示可用资源的个数S=0:表示无可用资源,无等待进程S<0:|S|表示等待队列中进程个数信号量的数据结构–注意不是信号量集合struct semaphore{ int value; pointer_PCB queue;}P原原创 2016-12-24 22:50:05 · 487 阅读 · 0 评论 -
线程编程补充
线程概念什么是线程LWP:light weight process 轻量级的进程,本质仍是进程(在Linux环境下) 进程:独立地址空间,拥有PCB 线程:也有PCB,但没有独立的地址空间(共享) 区别:在于是否共享地址空间。 独居(进程);合租(线程)。 Linux下: 线程:最小的执行单位 进程:最转载 2016-12-28 13:52:59 · 455 阅读 · 0 评论 -
01-Ubuntu安装Oracle 11g
转自http://www.cnblogs.com/pabitel/p/5495576.html一.获取资源包,自己去官网下载64位版,共两个压缩包 下载地址:http://www.oracle.com/technetwork/database/enterprise-edition/downloads/index.html二.安装依赖包 1 a转载 2017-01-04 19:19:16 · 367 阅读 · 0 评论 -
02-Oracle11g的配置
oracle用户的bash配置避免sqldeveloper连接不上数据库 关于hosts文件 关于hostname可以手工设置一下oracle的sidset ORACLE_SID=ORCL这里的ORCL自己修改输入lsnrctl start回车启动监听启动oracle数据库服务一定要先启动数据库服务再去查看监听状态以及测试连接如果之前已经启动了数据库服务,需要先关闭数据库服务再启动 输入原创 2017-01-04 23:13:59 · 435 阅读 · 0 评论 -
串口备份
串口备份#include <stdio.h>#include <stdlib.h>#include <string.h>#include <dlfcn.h>#include <mysql/mysql.h>#include "uart.h"#define BUF_SIZE 1024 int main(void) { int fd,res; char buf[BU原创 2017-02-24 15:58:57 · 384 阅读 · 0 评论 -
进程的5种终止方式
进程终止的5种方式正常退出 从main函数返回–语言级别的返回操作调用exit–C库函数调用_exit–系统调用异常退出 调用abort 产生SIGABOUT信号由信号终止 ctrl+c /SIGINTexit和_exit的区别区别1:清空缓冲区的操作int main(void){ printf("hello itcast"); //exit(0);//不原创 2016-12-08 21:29:57 · 8679 阅读 · 0 评论 -
进程编程中的孤儿和僵尸进程--wait/waitpid函数
进程编程中的孤儿和僵尸进程–wait/waitpid函数孤儿进程 如果父进程先退出,子进程还没退出那么子进程就变为孤儿进程,他的父进程将变为init进程。(注:任何一个进程都必须有父进程)僵尸进程 如果子进程先退出,父进程还没退出,那么子进程必须等到父进程捕获到了子进程的退出状态才真正结束,如果父进程还没有查询子进程的状态,这个时候子进程就成为僵尸进程。 利用ps -ef可查看进程状态,进原创 2016-12-09 12:00:35 · 381 阅读 · 0 评论 -
信号编程之sigaction函数和sigqueue函数
函数介绍包含头文件<signal.h>功能:sigaction函数用于改变进程接收到特定信号后的行为。原型: int sigaction(int signum,const struct sigaction *act,const struct sigaction *old);参数 该函数的第一个参数为信号的值,可以为除SIGKILL及SIGSTOP外的任何一 个特定有效的信号(为这两个信原创 2016-12-09 22:29:30 · 2811 阅读 · 1 评论 -
Shell简介
什么是Shellshell是核心程序kernel之外的指令解析器,是一个程序,同时是一种命令语言和程序设计语言。shell是命令解析器,用户输入命令,它去解析,然后交给内核执行命令,内核便可以操作硬件。shell类型 ash、bash、ksh、csh、tcsh cat /etc/shells 看系统下的shell echo $SHELL 看当前用户运行的shellshell中可以运行子s原创 2016-12-10 15:39:44 · 608 阅读 · 0 评论 -
简单高并发C/S模型
使用了自己做的通用API函数库,参考之前的文章: 网络编程中的select实现超时检测和通用API多进程+共享内存+信号量综合实例第一篇文章能找到客户端和服务器的头文件和套接字编程相关的API,第二篇文章能找到信号量和共享内存相关的API。基于select+多进程+信号量+共享内存客户端#include "comsocket.h"#include <sys/wait.h>void handle(原创 2016-12-28 14:31:00 · 2373 阅读 · 0 评论 -
线程编程之条件变量
条件变量: 条件变量本身不是锁!但它也可以造成线程阻塞。通常与互斥锁配合使用。给多线程提供一个会合的场所。主要应用函数: pthread_cond_init函数 pthread_cond_destroy函数 pthread_cond_wait函数 pthread_cond_timedwait函数 pthread_con转载 2016-12-28 12:01:54 · 456 阅读 · 0 评论 -
哲学家用餐模型分析
多线程版: 选用互斥锁mutex,如创建5个, pthread_mutex_t m[5]; 模型抽象: 5个哲学家 --> 5个线程; 5支筷子 --> 5把互斥锁 int left(左手), right(右手) 5个哲学家使用相同的逻辑,可通用一个线程主函数,void *tfn(void *arg),使用参数转载 2016-12-28 13:36:58 · 857 阅读 · 0 评论 -
网络编程中I/O复用模型
再回首一些概念阻塞IO 数据没有准备好, 读操作就会阻塞数据不能立即被收时, 写操作就会阻塞打开文件时阻塞, 直到某些条件发生非阻塞IO 立即返回, 并用错误值来表示当前的状态指定非阻塞方式 打开时指定O_NONBLOCK 标志使用fcntl 打开或关闭非阻塞方式网络编程时, 可以使用非阻塞, 用轮询方式发送使用多线程可以避免使用非阻塞IO, 但是同步开销较大多路IO当程序需原创 2016-12-19 18:50:52 · 497 阅读 · 0 评论 -
什么是Segmentation fault(Core Dump)? + 我遇到的实例问题
转:http://blog.chinaunix.net/space.php?uid=21830881&do=blog&cuid=2093542什么是Core Dump?Core的意思是内存, Dump的意思是扔出来, 堆出来.开发和使用Unix程序时, 有时程序莫名其妙的down了, 却没有任何的提示(有时候会提示core dumped). 这时候可以查看一下有没有转载 2016-12-27 09:22:20 · 5160 阅读 · 0 评论 -
线程编程基础
基本概念线程在一个程序里的一个执行路线就叫做线程(thread)。更准确的定义是:线程是“一个进程内部的控制序列”一切进程至少都有一个执行线程 进程与线程进程是资源竞争的基本单位线程是程序执行的最小单位线程共享进程数据,但也拥有自己的一部分数据 线程ID程序计数器寄存器组栈errno一个进程内部的线程可以共享资源 代码段数据段打开文件和信号 fork和创建新线程的区别原创 2016-12-28 10:33:56 · 329 阅读 · 0 评论 -
线程编程之死锁
死锁 1. 线程试图对同一个互斥量A加锁两次。 2. 线程1拥有A锁,请求获得B锁;线程2拥有B锁,请求获得A锁#include #include #include #if 0int var = 1, num = 5;pthread_mutex_t m_var, m_num;void *tfn(void *arg){ int i转载 2016-12-28 11:50:42 · 281 阅读 · 0 评论 -
线程编程之读写锁
读写锁与互斥量类似,但读写锁允许更高的并行性。其特性为:写独占,读共享。的并行读写锁状态:一把读写锁具备三种状态: 1. 读模式下加锁状态 (读锁) 2. 写模式下加锁状态 (写锁) 3. 不加锁状态读写锁特性: 读写锁是"写模式加锁"时, 解锁前,所有对该锁加锁的线程都会被阻塞。读写锁是"读模转载 2016-12-28 11:51:40 · 394 阅读 · 0 评论 -
线程编程之信号量
信号量进化版的互斥锁(1 --> N)由于互斥锁的粒度比较大,如果我们希望在多个线程间对某一对象的部分数据进行共享,使用互斥锁是没有办法实现的,只能将整个数据对象锁住。这样虽然达到了多线程操作共享数据时保证数据正确性的目的,却无形中导致线程的并发性下降。线程从并行执行,变成了串行执行。与直接使用单进程无异。信号量,是相对折中的一种处理方式,既能保证同步,数据不混乱,又能提高线程并发转载 2016-12-28 12:47:55 · 357 阅读 · 0 评论