unix环境高级编程
文章平均质量分 91
后打开撒打发了
有些人注定要生活在彼岸 可以亲近可以爱怜 甚至可以穷尽一生去思念 只是无法触及 有些距离 注定不能跨越 只能俩俩相望 就像有些爱只能养在心里 长在眼中 不要捧在手里 放在身边 注定只能邂逅 无法遭遇
展开
-
Linux进程间通信——使用共享内存
下面将讲解进程间通信的另一种方式,使用共享内存。一、什么是共享内存顾名思义,共享内存就是允许两个不相关的进程访问同一个逻辑内存。共享内存是在两个正在运行的进程之间共享和传递数据的一种非常有效的方式。不同进程之间共享的内存通常安排为同一段物理内存。进程可以将同一段共享内存连接到它们自己的地址空间中,所有进程都可以访问共享内存中的地址,就好像它们是由用C语言函数malloc转载 2018-01-10 15:23:18 · 385 阅读 · 1 评论 -
unix网络编程之socket:epoll 系列函数简介、与select、poll 的区别
一、epoll 系列函数简介#include int epoll_create(int size);int epoll_create1(int flags);int epoll_ctl(int epfd, int op, int fd, struct epoll_event *event);int epoll_wait(int epfd, struct epoll_even原创 2016-01-10 18:32:50 · 2221 阅读 · 0 评论 -
linux网络编程之socket(十一):套接字I/O超时设置方法和用select实现超时
注:如无特殊说明,sockfd 原始状态都是阻塞的。一、使用alarm 函数设置超时 C++ Code 12345678910111213void handler(int sig){}signal(SIGALRM, handler);alarm转载 2016-01-10 17:10:34 · 2187 阅读 · 0 评论 -
linux网络编程之socket(七):一个进程发起多个连接和gethostbyname等函数
一、在前面讲过的最简单的回射客户/服务器程序中,一个客户端即一个进程,只会发起一个连接,只要稍微修改一下就可以让一个客户端发起多个连接,然后只利用其中一个连接发送数据。先来认识一个函数getsockname #include int getsockname(int sockfd, struct sockaddr *addr, socklen_t *ad转载 2016-01-10 16:55:50 · 2007 阅读 · 0 评论 -
linux网络编程之socket(六):利用recv和readn函数实现readline函数
在前面的文章中,我们为了避免粘包问题,实现了一个readn函数读取固定字节的数据。如果应用层协议的各字段长度固定,用readn来读是非常方便的。例如设计一种客户端上传文件的协议,规定前12字节表示文件名,超过12字节的文件名截断,不足12字节的文件名用'\0'补齐,从第13字节开始是文件内容,上传完所有文件内容后关闭连接,服务器可以先调用readn读12个字节,根据文件名创建文件,转载 2016-01-10 16:15:10 · 2366 阅读 · 0 评论 -
linux网络编程之socket(五):tcp流协议产生的粘包问题和解决方案
我们在前面曾经说过,发送端可以是一K一K地发送数据,而接收端的应用程序可以两K两K地提走数据,当然也有可能一次提走3K或6K数据,或者一次只提走几个字节的数据,也就是说,应用程序所看到的数据是一个整体,或说是一个流(stream),一条消息有多少字节对应用程序是不可见的,因此TCP协议是面向流的协议,这也是容易出现粘包问题的原因。而UDP是面向消息的协议,每个UDP段都是一条消息,应用程序必须以消转载 2016-01-10 16:11:41 · 1069 阅读 · 0 评论 -
linux网络编程之socket(四):使用fork并发处理多个client的请求和对等通信p2p
一、在前面讲过的回射客户/服务器程序中,服务器只能处理一个客户端的请求,如何同时服务多个客户端呢?在未讲到select/poll/epoll等高级IO之前,比较老土的办法是使用fork来实现。网络服务器通常用fork来同时服务多个客户端,父进程专门负责监听端口,每次accept一个新的客户端连接就fork出一个子进程专门服务这个客户端。但是子进程退出时会产生僵尸进程,父进程要注意处理SIGCHLD转载 2016-01-10 15:54:44 · 3039 阅读 · 0 评论 -
linux网络编程之socket(三):最简单的回射客户/服务器程序、time_wait 状态
下面通过最简单的客户端/服务器程序的实例来学习socket API。echoser.c 程序的功能是从客户端读取字符然后直接回射回去。 C++ Code 1234567891011121314151617181920212223242526转载 2016-01-10 15:48:48 · 1460 阅读 · 0 评论 -
linux网络编程之socket(二):C/S程序的一般流程和基本socket函数
一、基于TCP协议的网络程序下图是基于TCP协议的客户端/服务器程序的一般流程:服务器调用socket()、bind()、listen()完成初始化后,调用accept()阻塞等待,处于监听端口的状态,客户端调用socket()初始化后,调用connect()发出SYN段并阻塞等待服务器应答,服务器应答一个SYN-ACK段,客户端收到后从connect()返回,同时转载 2016-01-10 15:45:08 · 1158 阅读 · 0 评论 -
linux网络编程之socket(一):socket概述和字节序、地址转换函数
一、什么是socketsocket可以看成是用户进程与内核网络协议栈的编程接口。socket不仅可以用于本机的进程间通信,还可以用于网络上不同主机的进程间通信。socket API是一层抽象的网络编程接口,适用于各种底层网络协议,如IPv4、IPv6,以及以后要讲的UNIX Domain Socket。然而,各种网络协议的地址格式并不相同,如下图所示:转载 2016-01-10 15:35:31 · 1052 阅读 · 0 评论 -
Epoll详解及源码分析
1.什么是epollepoll是当前在Linux下开发大规模并发网络程序的热门人选,epoll 在Linux2.6内核中正式引入,和select相似,都是I/O多路复用(IO multiplexing)技术,按照man手册的说法:是为处理大批量句柄而作了改进的poll。Linux下有以下几个经典的服务器模型: ①Apache模型(Process Per Conn原创 2016-01-10 19:55:55 · 951 阅读 · 0 评论 -
epoll用法整理
l epoll是什么?epoll是当前在Linux下开发大规模并发网络程序的热门人选,epoll 在Linux2.6内核中正式引入,和select相似,都是I/O多路复用(IO multiplexing)技术。Linux下设计并发网络程序,常用的模型有:Ø Apache模型(Process Per Connection,简称PPC)Ø TPC(Thread PerConn原创 2016-01-10 20:53:28 · 1511 阅读 · 0 评论 -
makefie
0.前言 从学习C语言开始就慢慢开始接触makefile,查阅了很多的makefile的资料但总感觉没有真正掌握makefile,如果自己动手写一个makefile总觉得非常吃力。所以特意借助博客总结makefile的相关知识,通过例子说明makefile的具体用法。 例说makefile分为以下几个部分,更多内容请参考【例说makefile索引博文】原创 2016-01-29 10:02:00 · 864 阅读 · 0 评论 -
Linux进程间通信——使用信号量
这篇文章将讲述别一种进程间通信的机制——信号量。注意请不要把它与之前所说的信号混淆起来,信号与信号量是不同的两种事物。有关信号的更多内容,可以阅读我的另一篇文章:Linux进程间通信——使用信号。下面就进入信号量的讲解。一、什么是信号量为了防止出现因多个程序同时访问一个共享资源而引发的一系列问题,我们需要一种方法,它可以通过生成并使用令牌来授权,在任一时刻只能有一个执行转载 2018-01-10 15:19:59 · 366 阅读 · 0 评论 -
unix网络编程卷2:管道和FIFO
管道和FIFO管道(Pipe):管道可用于具有亲缘关系进程间的通信,允许一个进程和另一个与它有共同祖先的进程之间进行通信。命名管道(named pipe):命名管道克服了管道没有名字的限制,因此,除具有管道所具有的功能外,它还允许无亲缘关系进程间的通信。命名管道在文件系统中有对应的文件名。命名管道通过命令mkfifo或系统调用mkfifo来创建。#include <unistd.h>int原创 2017-02-08 23:58:56 · 452 阅读 · 0 评论 -
我的makefile模板
想大家提供一个makefile万能模板,工程目录结构project目录下有三个文件夹,include文件夹放头文件,src放cpp文件,lib文件夹放lib.a文件lib.so文件都可以的以及其他链接文件都可以的。说明:根据需要大家可以随便扩展这个模板,在任何位置放置自己的头文件,源文件和库文件都可以,只要把路径添加makefile中去就可以了。CC = gccXX = g++CFLAGS =原创 2017-01-12 20:58:17 · 552 阅读 · 0 评论 -
strchar函数和 strstr函数的学习
strchar函数的实现char strchr(const char _Str,char _Val)char strchr(char _Str,char _Ch)头文件:#include #include <iostream>#include <stdio.h>#include <stdlib.h>char *my_strchar(char *str, char c){ whil原创 2017-01-12 11:01:30 · 5014 阅读 · 0 评论 -
unix网络编程----------fifo
#include #include #include #include #include #include #define MAXLINE 4096 #define FIFO1 "/tmp/fifo.1"#define FIFO2 "/tmp/fifo.2"#define FILE_MODE (S_IRUSR | S_IWUSR | S_IR原创 2016-09-25 19:59:16 · 514 阅读 · 0 评论 -
unix网络编程----------管道 pipe
#include #include #include #include #include #include #define MAXLINE 4096void client(int readfd, int writefd){ size_t len; ssize_t n; char buff[MAXLINE]; /* 4read pathname */ fgets(原创 2016-09-25 17:54:49 · 739 阅读 · 0 评论 -
GDB使用教程
本文写给主要工作在Windows操作系统下而又需要开发一些跨平台软件的程序员朋友,以及程序爱好者。GDB是一个由GNU开源组织发布的、UNIX/LINUX操作系统下的、基于命令行的、功能强大的程序调试工具。GDB中的命令固然很多,但我们只需掌握其中十个左右的命令,就大致可以完成日常的基本的程序调试工作。 命令 解释 示例file 加载被调试的原创 2016-03-10 09:36:42 · 859 阅读 · 0 评论 -
socket编程例子
客户端例子:#include #include #include #include #include #include #include #include #include #include #define RES_LENGTH 10240 //接受字符的最大长度int conne原创 2016-02-19 11:08:55 · 812 阅读 · 0 评论 -
[文件I/O] select
select() 函数允许我们在一组文件描述符上进行 I/O 多路复用。相关原型及相关操作宏定义如下:#include #include #include #include int select(int nfds, fd_set *readfds, fd_set *writefds, fd_set *exceptfds, struct timeval *timeout);原创 2016-02-19 09:42:02 · 962 阅读 · 0 评论 -
深入研究socket编程(4)——并发服务器(TCP)
在迭代服务器中,服务器只能处理一个客户端的请求,如何同时服务多个客户端呢?在未讲到select/poll/epoll等高级IO之前,比较老土的办法是使用fork来实现。 网络服务器通常用fork来同时服务多个客户端,父进程专门负责监听端口,每次accept一个新的客户端连接就fork出一个子进程专门服务这个客户端。但是子进程退出时会产生僵尸进程,父进程要注意处理SIGCHLD信号和原创 2016-01-09 16:34:43 · 3693 阅读 · 1 评论 -
深入研究socket编程(3)——使用select函数编写客户端和服务器
首先看原先《UNIX网络编程——并发服务器(TCP)》的代码,服务器代码serv.c:[cpp] view plaincopyprint?#include #include #include #include #include #include #include #include #includ原创 2016-01-09 16:26:44 · 6230 阅读 · 0 评论 -
unix环境高级编程-------socket(套接字)
一、socket是什么? socket就是用来通信的,本博客所讲的socket是基于tcp/ip协议的(当然还可以采用其他不同的网络协议来通信)?首先我们来了解一下tcp/ip协议: 首先记住,每台电脑在网络中都有一个ip地址,这个ip地址就是网络中电脑的唯一的标识,那么在网络中怎么标识网络进程呢?这个时候端口号就是派上用场了。不同的端口号对应不用的服务。所以ip+协议+端原创 2015-10-30 00:10:56 · 4294 阅读 · 0 评论 -
linux------进程通信总结
一、进程通信的几种方式 管道( pipe ): 管道是一种半双工的通信方式,数据只能单向流动,而且只能在具有亲缘关系的进程间使用。进程的亲缘关系通常是指父子进程关系。 有名管道 (named pipe) : 有名管道也是半双工的通信方式,但是它允许无亲缘关系进程间的通信。 信号量( semophore ) :原创 2015-10-25 19:00:01 · 1058 阅读 · 0 评论 -
UNIX环境高级编程之-----setjmp和longjmp
非局部跳转头文件中的说明提供了一种避免通常的函数调用和返回顺序的途径,特别的,它允许立即从一个多层嵌套的函数调用中返回。setjmp#include int setjmp(jmp_buf env);setjmp()宏把当前状态信息保存到env中,供以后longjmp()恢复状态信息时使用。如果是直接调用setjmp(),那么返回值为0;如果是由于调用longjm原创 2015-07-05 22:03:25 · 825 阅读 · 1 评论 -
UNIX环境高级编程之----多线程技术(3)
pthread_create函数的第二个参数,是关于线程属性的设置,这也是今天所有讲述的。这些属性主要包括邦定属性、分离属性、堆栈地址、堆栈大小、优先级。其中系统默认的是非邦定、非分离、缺省1M的堆栈、与父进程同样级别的优先级。在pthread_create中,把第二个参数设置为NULL的话,将采用默认的属性配置。(1)邦定属性。 在LINUX中,采用的是“一对一”的线程机原创 2015-07-12 01:10:43 · 839 阅读 · 0 评论 -
UNIX环境高级编程之----多线程技术(1)
进程是系统中程序执行和资源分配的基本单位。每个进程都有自己的数据段,代码段和堆栈段,这就导致了进程在进行切换等操作起到了现场保护作用。但是为了进一步减少处理机的空转时间支持多处理器和减少上下文切换开销,进程演化中出现了另外一个概念,这就是线程,也被人称为轻量级的进程。它是一个进程内的基本调度单位。线程是在共享的内存空间中并发的多道执行路径,它们共享一个进程的资源,比如文件描述符和信号处理等。因此,原创 2015-07-11 23:29:32 · 964 阅读 · 0 评论 -
UNIX环境高级编程之-----popen函数
头文件: #include 函数说明:FILE * popen ( const char * command , const char * type );int pclose ( FILE * stream );说明:(参考unix环境高级编程)popen() 函数通过创建一个管道,调用 fork 产生一个子进程,执行一个 shell 以运行命令来开启一个进程。这个进原创 2015-06-15 01:43:09 · 2423 阅读 · 0 评论 -
unix环境高级编程之 read与write 函数详解
学习记录:unix环境高级编程之 read 与write 函数详解备注:本博文非本人所写,本人觉得此文讲的非常地道通俗易懂,所以摘录在此以方便以后再次查看read函数从打开的设备或文件中读取数据。#include ssize_t read(int fd, void *buf, size_t count); 返回值:成功返回读取的字节数,出错返回原创 2015-06-14 03:22:09 · 8120 阅读 · 0 评论 -
UNIX环境高级编程之----多线程技术(2)
创建线程实际上就是确定调用该线程函数的入口点,这里通常使用的函数是pthread_create。在线程创建之后,就开始运行相关的线程函数。在该函数运行结束,线程也会随着退出。这是其中退出线程的一种方法,另外一种退出线程的方法就是调用pthread_exit()函数接口,这是结束函数的主动行为。在这里要注意的是,在使用线程函数时,不要轻易调用exit()函数,因为这样会使整个进程退出,往往一个进程包原创 2015-07-11 23:54:00 · 886 阅读 · 0 评论 -
UNIX环境高级编程之----多线程同步学习
线程的最大特点是资源的共享性,但资源共享中的同步问题是多线程编程的难点。linux下提供了多种方式来处理线程同步,最常用的是互斥锁、条件变量和信号量。 1、互斥锁(mutex) 通过锁机制实现线程间的同步。同一时刻只允许一个线程执行一个关键部分的代码。int pthread_mutex_init(pthread_mutex_t *mutex,const pthre原创 2015-07-11 01:30:15 · 1069 阅读 · 0 评论 -
socket编程注意的地方---bind socket error: Address already in use
在进行linux网络编程时,每次修改了源代码并再次编译运行时,常遇到下面的地使用错误:Bind error: Address already in use虽然用Ctrl+C强制结束了进程,但错误依然存在,用netstat -an |grep 5120和ps aux |grep 5120都还能看到刚才用Ctrl+C“强制结束”了的进程,端口还是使用中,只好每次用kil原创 2015-10-30 21:00:48 · 8232 阅读 · 1 评论 -
uinx环境高级高级编程---------孤儿进程与僵尸进程
1、前言 之前在看《unix环境高级编程》第八章进程时候,提到孤儿进程和僵尸进程,一直对这两个概念比较模糊。今天被人问到什么是孤儿进程和僵尸进程,会带来什么问题,怎么解决,我只停留在概念上面,没有深入,倍感惭愧。晚上回来google了一下,再次参考APUE,认真总结一下,加深理解。2、基本概念 我们知道在unix/linux中,正常情况下,子进程是通过父进程创建的,子进原创 2015-12-23 02:29:53 · 975 阅读 · 0 评论 -
Linux进程间通信——信号集函数
下面是信号函数集:1、int sigemptyset(sigset_t *set);该函数的作用是将信号集初始化为空。2、int sigfillset(sigset_t *set);该函数的作用是把信号集初始化包含所有已定义的信号。3、int sigaddset(sigset_t *set, int signo);该函数的作用原创 2015-12-24 02:11:22 · 577 阅读 · 0 评论 -
深入研究socket编程(1)-----socket之TCP回射服务器/客户端程序
unix环境高级编程-------socket(套接字)中对socket编程有了初步的了解,在本篇以及后续的博客中来深入探讨各种实例以及更多的socket编程技术。来看一个例子:服务端的server.c#include#include#include#include#include#include#include#include#include#inclu原创 2016-01-09 16:06:44 · 3596 阅读 · 1 评论 -
UNIX网络编程——select函数的并发限制和 poll 函数应用举例
一、用select实现的并发服务器,能达到的并发数,受两方面限制 1、一个进程能打开的最大文件描述符限制。这可以通过调整内核参数。可以通过ulimit -n来调整或者使用setrlimit函数设置, 但一个系统所能打开的最大数也是有限的,跟内存大小有关,可以通过cat /proc/sys/fs/file-max 查看 2、select中的fd原创 2016-01-09 21:21:13 · 1324 阅读 · 0 评论 -
深入研究socket编程(6)——高级I/O复用(select、poll 、 epoll)
问题聚焦: 前篇提到了I/O处理单元的四种I/O模型。 本篇详细介绍实现这些I/O模型所用到的相关技术。 核心思想:I/O复用使用情景:客户端程序要同时处理多个socket。客户端程序要同时处理用户输入和网络连接。TCP服务器要同时处理监听socket和连接socket,这是使用最多的场合。服务器要同时处理TCP请求和UDP请求。服务器原创 2016-01-09 19:03:23 · 1243 阅读 · 0 评论 -
深入研究socket编程(5)——I/O复用的高级应用
高级应用一:非阻塞connectconnect系统调用的man手册中有如下的一段内容:[cpp] view plaincopyprint?EINPROGRESS The socket is non-blocking and the connection cannot be completed imm原创 2016-01-09 19:00:16 · 1639 阅读 · 0 评论