标签: linuxc 1.pthread_create函数 函数原型:int pthread_create(pthread_t *tid, const pthread_attr_t *tattr, void*(*start_routine)(void *), void *arg); 功能:创建一个新的线程,并将线程加入当前进程 头文件:#include pthread并非linux系统的默认库,需要手动链接 -线程库 -lpthread 参数: tid:指向线程标识符的指针 tattr:设置线程属性,可由pthread_attr_init()函数创建默认属性对象 start_routine:线程运行函数的起始地址,注意start_route的返回值地址必须无效 arg:运行函数的参数,arg首选动态堆上分配内存(进程,这样资源可以由程序控制回收),从栈上(线程)分配内存可能导致地址无效或在线程终止时地址被重新分配。 线程函数有多个参数的情况:申明一个结构体来包含所有的参数,然后将结构体传入线程函数。 继续阅读 >>


胡锦雲 19/01/20 22:17:02
三张Linux图 作者:lalala323 发表于 2018/12/04 20:19:03 原文链接 https://blog.csdn.net/lalala323/article/details/84798043 阅读:39 评论:2 查看评论 继续阅读 >>


李重乐 18/12/04 20:19:03
文章目录前言原理初探共享内存的创建过程系列 API 的使用ftokshmgetshmatshmdtshmctl共享内存实例 前言 总结一下最近对于共享内存的学习, 可能比较浅显或者有疏漏, 欢迎指正! 原理初探 我们知道, 进程空间相互隔离, 互相对立, 但是共享内存允许多个进程可以访问同一块内存来达到进程间通信的目的. 共享内存是最高效的 IPC 机制, 它不涉及任何进程间的数据传输, 而且他和进程同处于用户空间, 不像消息队列, 信号量是内核空间的系统对象, 不需要花费额外的数据拷贝, 但是同时他并没有预防竞态条件, 也就是说在多进程利用共享内存进行通信的情况下, 我们需要自己去利用锁等操作来进行同步 共享内存的创建过程 当我们创建了一块共享内存, 其实是在 tmpfs 中创建了一个文件 (这个文件是存储于内存的), 也就意味着在 tmpfs 中创建了一个 iNode 节点 然后我们需要将这个创建好的文件映射到进程中 (如下图, 此图来自网络, 应该是哪个博客或者知乎吧…已经记不清了) 我们创 继续阅读 >>


吕子健 18/11/08 23:11:47
ArchLinux 安装及KDE桌面环境安装配置 首先,安装之前,需要一个“启动介质”,我这里习惯使用USB设备作为启动介质,这是由于ArchLinux滚动更新的特性,而且占用空间很小,以其他的方式安装个人认为不太适合。 话不多说,访问ArchLinux官方网站,点击右上角Download,在下方选择适合你的下载方式或镜像进行下载,我常用的地址是网易的镜像源,和清华大学的镜像源。下载完毕后,我一般使用开源工具Rufus将之写入到U盘中。 安装 将启动U盘插入到电脑中,选择从U盘启动,进入到archlinux的LiveCD模式,若使用网线连接,此时应已经自动配置好网络,可使用ping命令测试网络;若使用无线网络,则键入wifi-menu命令选择并登录无线网络。然后,输入以下命令保证系统时间是正确的: timedatectl set-ntp true 然后我们可以通过fdisk -l命令查看分区情况,若要在此时修改分区表,ArchLinux提供了命令parted和fdisk,可以在此时修改分区表。若要格式 继续阅读 >>


娄泽豪 18/09/22 22:22:39
文章目录@[toc]三次握手过程中 TCP 的状态变化三次握手的过程和本质三种状态socket 函数listen 函数connect 函数accept 函数connect 函数在三次握手中的返回情况 总结一下近日所学的关于 TCP 建立连接 三次握手 的过程中, TCP 的 状态变化, 以及在这个过程中所用的 socket 函数, 对于各种情况会如何处理 涉及到 connect listen accept 函数 三次握手过程中 TCP 的状态变化 三次握手的过程和本质 如下图, 是一个 TCP 建立和断开连接的过程, 我们今天只讨论建立连接的三次握手过程 主动申请连接的一方(通常为客户端), 发送一个 SYN 报文段, 服务器在收到客户端发来的 SYN 报文段后, 回复一个 SYN 报文段, 并发送一个 ACK 以确认客户端的 SYN, 为了确认服务器的 SYN, 客户端也会回复一个 ACK 经过上面三个步骤交换三个报文段之后, 就建立起了一个 TCP 连接, 这也被称为 三次握手, 继续阅读 >>


吕子健 18/09/04 14:58:46
dup 与dup2函数 Linux c 函数 #include<unistd.h> int dup(int fd); int dup2(int fd1,int fd2); 两个均为复制一个现存的文件的描述 两个函数的返回:若成功为新的文件描述,若出错为-1; 由dup返回的新文件描述符一定是当前可用文件描述中的最小数值。用dup2则可以用fd2参数指定新的描述符数值。如果fd2已经打开,则先关闭。若fd1=fd2,则dup2返回fd2,而不关闭它。通常使用这两个系统调用来重定向一个打开的文件描述符。 重定向 一般在程序实现重定向都会用到dup2函数。 文件描述符0 --> 标准输出 文件描述符1 -->标准输入 文件描述符2–>标准错误 例子1: #include<stdio.h> #include<stdlib.h> #include<fcntl.h> #include<unistd.h> #include<sys/ 继续阅读 >>


朱文博 18/09/03 18:00:25
为什么要用epoll,用了epoll还用不用多线程或者多进程了? 高性能的网络服务器需要同时并发处理大量的客户端,而采用那种对于每个连接使用一个分开的线程或进程的方法效率不高. 因为在处理大量的客户端的时候,资源的使用以及进程上下切换会影响服务器的性能. 那么有一个可代替的方法就是在单一的线程中使用非阻塞的I/O. epoll与多线程与多进程是互不冲突的.使用了epoll并不是说就不能用多线程,可以另开一个线程在分支上工作以节省时间. 那么epoll有哪些相关的函数呢 epoll_createor epoll_create1:用来创建epoll实例 epoll_ctl:用来增加或移除被epoll所监听的文件描述符 epoll_wait:用来等待发生在监听描述符上的事件,它会一直阻塞直到事件发生. 这里要特别强调一个参数EPOLLONESHOT,如果要保证套接字同一时段只被一个线程处理,必须加上。 解决方案:给accept()后的套接字加上参数EPOLLONESHOT,线程结 继续阅读 >>


胡锦雲 18/08/20 08:23:21
Linux网络编程—多路复用之epoll epoll 是多路复用select和poll的加强版,epoll到底强在了哪些地方,我们接下来就会谈到。 我们先简单说一下select和poll的不足之处 select的缺点: 1、单个进程能够监视的文件描述符的数量存在最大限制,通常是1024,当然可以更改数量,但由于select采用轮询的方式扫描文件描述符,文件描述符数量越多,性能越差。 2、 内核 / 用户空间内存拷贝问题,select需要复制大量的句柄数据结构,产生巨大的开销。 3、select返回的是含有整个句柄的数组,应用程序需要遍历整个数组才能发现哪些句柄发生了事件。 4、select的触发方式是水平触发,应用程序如果没有完成对一个已经就绪的文件描述符进行IO操作,那么之后每次select调用还是会将这些文件描述符通知进程。 poll和select的用法非常相似,但是poll是使用链表保存文件描述符,因此没有了监视文件数量地限制,select的前三个缺点依然存在,在高并发下性能还是不够强大。 这 继续阅读 >>


朱文博 18/08/19 23:18:10
最开始的学习疑问,网络编程上的这些乱七八糟的名词这些都是用来干什么的? 地址:为了使网络上的计算机通过唯一标识进行相互间通信 端口:解决多个程序要同时访问网络 IP协议:确定到达目的地的路由 UDP协议:向应用程序提供一种面向无连接的服务 TCP协议:提供一种面向连接的,可靠的数据传输服务 套接字是什么 在两个程序进行通讯连接的一个端点.是连接应用程序和网络驱动程序的桥梁. 网络应用程序通过socket进行数据的发送与接收过程: socket在应用程序中创建,通过绑定与网络驱动建立关系.此后,应用程序送给socket的数据,由socket交给网络驱动程序向网络上发送出去.计算机从网络上收到与该socket绑定IP地址和端口号相关的数据之后,由网络驱动交给socket,应用程序便可以从该socket中提取接收到的数据. 假设第二个程序被加入的网络的Host B中,那么由Host A传来的信息如何能被正确的传给程序B而不是传给新加入的程序呢?这是因为每一个基于TCP/IP网络通讯 继续阅读 >>


胡锦雲 18/08/15 09:17:48
I/O多路复用的理解 先讲一个大家都比较熟悉的例子吧 小时候咱们都喜欢看《亮剑》、《雪豹》这一类的抗日剧,里面八路军在自己的驻地周围都会24小时分布一些暗哨,每当有鬼子要进行扫荡或者清剿的时候暗哨就会赶紧告诉驻地的八路军,有敌人过来了,赶紧抄家伙干仗了。其实这就和咱们要讲的I/O多路复用有异曲同工之处。 在我们接触I/O多路复用以前,在处理一些比较多的连接或者请求的时候大多数人会去使用类似下面这种方式去处理: while(1) { int cli_fd = accept(listen_fd, (struct sockaddr*)&addrCli, sizeof(addrCli)); ...../*开启一个线程或者开启一个进程*/ } 这么做看着十分的清爽,而且实现起来也相当的简单,但是服务器的主程序会一直阻塞在accept这个函数上,然后会一直去等待connect的到来,这种方法虽然十分的简单,但是在轮询的过程中耗费了大量的CPU时间,并且效率还十分的低下,因此我们要想 继续阅读 >>


李佳灏 18/08/14 16:27:10