fd

一步一步创建聊天程序2-利用epoll来创建简单的聊天室

放肆的年华 提交于 2019-12-06 06:27:01
如图,这个是看视频时,最后的作业,除了客户端未使用select实现外,其它的要求都有简单实现。 服务端代码如下: #include <stdio.h> #include <string.h> #include <sys/types.h> #include <sys/socket.h> #include <errno.h> #include <sys/epoll.h> #include <netinet/in.h> #include <unistd.h> #include<netinet/tcp.h> #define MAX_LISTEN 10 #define EPOLL_SIZE 100 struct message { int target_id; char buf[100]; }; struct user_password { char username[100]; char password[100]; }; //设置保活参数 keepalive_time保活时间,keepalive_intvl保活间隔,keepalive_probes保活探测数。 int set_keepalive(int sockfd,int keepalive_time, int keepalive_intvl, int keepalive_probes) { int optval; socklen_t

Python画一棵漂亮的樱花树(不同种樱花+玫瑰+圣诞树喔)

邮差的信 提交于 2019-12-06 04:53:00
不少用Python(大多是turtle库)绘制的树图,感觉很漂亮,我整理了一下,挑了一些我觉得不错的代码分享给大家(这些我都测试过,确实可以生成喔~) one 樱花树 动态生成樱花 效果图(这个是动态的): ​ 实现代码 import turtle as T import random import time # 画樱花的躯干(60,t) def Tree(branch, t): time.sleep(0.0005) if branch > 3: if 8 <= branch <= 12: if random.randint(0, 2) == 0: t.color('snow') # 白 else: t.color('lightcoral') # 淡珊瑚色 t.pensize(branch / 3) elif branch < 8: if random.randint(0, 1) == 0: t.color('snow') else: t.color('lightcoral') # 淡珊瑚色 t.pensize(branch / 2) else: t.color('sienna') # 赭(zhě)色 t.pensize(branch / 10) # 6 t.forward(branch) a = 1.5 * random.random() t.right(20 * a) b =

Python画一棵漂亮的樱花树(不同种樱花+玫瑰+圣诞树喔)

孤人 提交于 2019-12-06 04:42:23
有不少用Python(大多是turtle库)绘制的树图,感觉很漂亮,我整理了一下,挑了一些我觉得不错的代码分享给大家(这些我都测试过,确实可以生成喔~) one 樱花树 动态生成樱花 效果图(这个是动态的): 实现代码 很多人学习python,掌握了基本语法过后,不知道在哪里寻找案例上手。 很多已经做案例的人,却不知道如何去学习更加高深的知识。 那么针对这三类人,我给大家提供一个好的学习平台,免费领取视频教程,电子书籍,以及课程的源代码! QQ群:127341871 import turtle as Timport randomimport time# 画樱花的躯干(60,t)def Tree(branch, t): time.sleep(0.0005) if branch > 3: if 8 <= branch <= 12: if random.randint(0, 2) == 0: t.color('snow') # 白 else: t.color('lightcoral') # 淡珊瑚色 t.pensize(branch / 3) elif branch < 8: if random.randint(0, 1) == 0: t.color('snow') else: t.color('lightcoral') # 淡珊瑚色 t.pensize(branch / 2) else

文件描述符fd,struct files_struct

安稳与你 提交于 2019-12-06 04:16:37
程序可以理解为硬盘上的普通二进制文件;进程是加载到内存中的二进制文件,除了加载到内存中的二进制文件外,还附有所有对于该二进制文件 描述信息的结构体 ,描述该进程的结构体叫 PCB(进程控制块) ,在这就不在讨论。对于程序与进程,也就可以简单地理解为是否有PCB(进程控制块)。下面我们再来讨论PCB与file_struct的关系。 在每一个PCB中,都有一个文件描述符表,通过文件描述符索引指向file_struct(系统打开文件表) 。 文件描述符在形式上是一个非负整数,实际上, 它是一个索引值,指向内核为每一个进程所维护的该进程打开文件的记录表 ,当程序打开一个现有文件或创建一个新文件时,内核向进程返回一个文件描述符。也就是说,一个程序能够访问文件是因为给这个程序分配了文件描述符。 下面我们来讨论file_struct里面具体有哪些内容, file结构体定义在linux系统中的(/kernels/include/linus/fs.h)文件中。 file_struct结构如下 struct file {   union {   struct list_head fu_list; //文件对象链表指针linux/include/linux/list.h   struct rcu_head fu_rcuhead; //RCU(Read-Copy Update)是Linux 2

带外数据

空扰寡人 提交于 2019-12-06 03:23:59
  许多传输层有带外数据的概念,它有时也称为经加速数据。其想法是一个连接的某端发生了重要的事情,而且该端希望迅速通告其对端。这里“迅速”意味着这种通知应该在已排队等待发送的任何“普通”(有时称为“带内”)数据之前发送。也就是说,带外数据被认为具有比普通数据更高的优先级。带外数据并不需要在客户和服务器之间再使用一个连接,而是被映射到已有的连接中。   不幸的是,一旦超越普通概念光临现实世界,我们发现几乎每个传输层都各自有不同的带外数据实现。而UDP作为一个极端的例子,没有实现带外数据。 TCP带外数据   TCP并没有真正的带外数据,不过提供了我们接着要说的紧急模式。假设一个进程已经往一个TCP套接字写出N字节数据,而且TCP把这些数据排队在该套接字的发送缓冲区中,等着发送到对端。如图展示了这样的套接字发送缓冲区,并且标记了从1到N的数据字节。   该进程接着以MSG_OOB标志调用send函数写出一个含有ASCII字符a的单字节带外数据: send(fd,"a",1,MSG_OOB);   TCP把这个数据放置在该套接字发送缓冲区的下一个可用位置,并把该连接的TCP紧急指针设置成再下一个可用位置。如图展示了此时的套接字发送缓冲区,并且把带外字节标记为:“OOB”。   TCP紧急指针对应一个TCP序列号,它是使用MSG_OOB标志写出的最后一个数据字节(即带外字节)对应的序列号加1

第十四周课程总结

[亡魂溺海] 提交于 2019-12-06 03:16:55
实验报告(简单记事本的实现) 实验任务详情: 完成简单记事本的练习。 (1)实验代码: package 测试; import java.awt.EventQueue; import java.awt.FileDialog; import javax.swing.JFrame; import javax.swing.JMenu; import java.awt.BorderLayout; import java.awt.event.ActionEvent; import java.awt.event.ActionListener; import java.io.BufferedReader; import java.io.BufferedWriter; import java.io.File; import java.io.FileReader; import java.io.FileWriter; import java.io.IOException; import javax.swing.JMenuBar; import javax.swing.JOptionPane; import javax.swing.JTextArea; import javax.swing.JScrollPane; import javax.swing.JMenuItem; public class

UNIX编程 I/O多路转接笔记

无人久伴 提交于 2019-12-06 02:37:52
在标准输入上测试select 实现参考了《UNIX环境高级编程》14.4.1和《UNIX系统编程手册》63.2.1。 #include <cstdio> #include <iostream> #include <unistd.h> #include <fcntl.h> #include <sys/select.h> using namespace std; const int BUF_SIZE = 128; int main(int argc, char **argv) { fd_set rs; FD_ZERO(&rs); FD_SET(STDIN_FILENO, &rs); for (int i = 0; i < 5; i++) { timeval tv = {.tv_sec=2, .tv_usec=0}; fd_set rs_temp = rs; int ret = select(STDIN_FILENO + 1, &rs_temp, NULL, NULL, &tv); if (ret == -1) { printf("select ret: %d, errno: %d\n", ret, errno); return 1; } printf("select ret: %d\n", ret); printf("if can read data from fd: %d is %s

golang的写文件测试

时光怂恿深爱的人放手 提交于 2019-12-05 22:12:32
package main import ( "os" "strings" "time" "fmt" "strconv" ) //耗时统计函数 func timeCost() func() { start := time.Now() return func() { tc := time.Since(start) fmt.Printf("time cost = %v\n", tc) } } func sum(n int, fd *os.File) { defer timeCost()() //注意,是对 timeCost()返回的函数进行调用,因此需要加两对小括号 for i:=1; i <= n; i++ { stri := strconv.Itoa(i) content := "写入的文件内容" + stri fd_time := time.Now().Format("2006-01-02 15:04:05") fd_content := strings.Join([]string{"======",fd_time,"=====",content,"\n"},"") buf := []byte(fd_content) fd.Write(buf) } } func main() { fd , _ := os.OpenFile("xyz2.txt",os.O_RDWR|os.O

[apue] 神奇的 Solaris pipe

北战南征 提交于 2019-12-05 19:15:06
说到 pipe 大家可能都不陌生,经典的pipe调用配合fork进行父子进程通讯,简直就是Unix程序的标配。 然而Solaris上的pipe却和Solaris一样是个奇葩(虽然Solaris前途黯淡,但是不妨碍我们从它里面挖掘一些有价值的东西), 有着和一般pipe诸多的不同之处,本文就来说说Solaris上神奇的pipe和一般pipe之间的异同。 1.solaris pipe 是全双工的 一般系统上的pipe调用是半双工的,只能单向传递数据,如果需要双向通讯,我们一般是建两个pipe分别读写。像下面这样: 1 int n, fd1[2], fd2[2]; 2 if (pipe (fd1) < 0 || pipe(fd2) < 0) 3 err_sys ("pipe error"); 4 5 char line[MAXLINE]; 6 pid_t pid = fork (); 7 if (pid < 0) 8 err_sys ("fork error"); 9 else if (pid > 0) 10 { 11 close (fd1[0]); // write on pipe1 as stdin for co-process 12 close (fd2[1]); // read on pipe2 as stdout for co-process 13 while (fgets

文件IO

允我心安 提交于 2019-12-05 17:56:58
目录 文件IO 文件描述符 获取最大支持的描述符 open/openat/creat close lseek off_t 类型说明 lseek与OAPPEND的区别 内核维护的文件信息 dup/dup2 FD_CLOEXEC 缓存同步到存储 fcntl改变文件属性 ioctl 文件截断 代码附录 获取最大文件描述符 使用openat来实现一种相对路径的打开 lseek测试管道等 lseek文件跨越写 fcntl获取文件状态 title: 文件IO date: 2019/11/23 10:49:52 toc: true --- 文件IO 文件描述符 文件描述符是非负的整数,一般是系统调用的,这个与 file_struct 区别开来. STDIN_FILENO, STDOUT_FILENO, and STDERR_FILENO 被定义在 <unistd.h> 获取最大支持的描述符 新的 linux 已经不支持 OPEN_MAX 来直接获取这个最大描述符了, sysconf(_SC_OPEN_MAX) shell 下这么查看,其中的 open files (-n) 1024 就是了 reallin@ubuntu:/work/pan/apue$ ulimit -a core file size (blocks, -c) 0 data seg size (kbytes, -d)