首页
学习
活动
专区
工具
TVP
发布
精选内容/技术社群/优惠产品,尽在小程序
立即前往

swoole 学习第二章 Event Io 与 process

,除了这些之外,子进程会复制父进程的io句柄(fd描述符) [x] 子进程会复制父进程的IO句柄(我们打开的一个文件,以及创建的一个socked连接,这些都属于句柄,比如我在父进程内打开了一个文件fopen...那么子进程中同样拥有这个句柄,并且可以对同一个文件进行读写操作,这样的话多个进程对一个文件进行读写操作的话就会对文件造成混乱,这个时候我们就需要一个文件锁的东西,fd描述符); 进程之间的通信方式 –...父进程通过对描述符当中写内容的时候子进程就可以通过读描述符来得到管道中的内容这样就实现了两个进程之间的通信, [x] 管道是一组(2个)特殊的描述符 [x] 管道需要在fork函数调用前创建 [x] 如果一端主动关闭管道...whlie的循环不断监听这个事件直到我们调用exit,因此不会退出, Q:如何关闭 Event Loop ?...$process->pid 属性为子进程的PID $process->pipe 属性为管道的文件描述符 来个实例玩玩 <?php /** * swoole_process.

46020
  • 您找到你想要的搜索结果了吗?
    是的
    没有找到

    Linux守护进程

    这意味着当终端关闭时,与之关联的所有进程都会被终止。守护进程通过脱离控制终端来避免这种限制,使其能够在后台独立运行。这种脱离的目的是防止进程在运行过程中受到终端输出的干扰,并确保它们能够持续工作。...设置 umask 的方法是调用 umask(0)。 5、关闭不再需要的文件描述符 子进程会继承父进程打开的所有文件描述符,这可能导致不必要的资源消耗。...应关闭不再需要的文件描述符,以确保守护进程不再持有任何继承自父进程的描述符,从而减少资源浪费。...6、将文件描述符 0、1、2 定位到 /dev/null 守护进程的标准输入、标准输出和标准错误通常会重定向到 /dev/null,这样守护进程的输出就不会显示在任何地方,同时也不会试图从交互式用户那里接收输入...关闭不再需要的文件描述符 close(STDIN_FILENO); close(STDOUT_FILENO); close(STDERR_FILENO); // 8.

    16510

    Python中TCP协议的理解

    ,这样可以避免一些恶意连接导致server端服务受损; 如果条件再允许就可以以客户端机器为颗粒度,限制每个客户端的最大长连接数,这样可以完全避免某个蛋疼的客户端连累后端服务。...(connect_socket) print(client_addr) # 每当来新的客户端连接,创建子线程,由子线程和客户端通信 thread_do_service...,不能关闭connect_socket,多个线程共享打开的文件 # connect_socket.close() if __name__ == "__main__": main...这些设备的文件描述符被放在一个数组中,然后select调用的时候遍历这个数组,如果对于文件描述符可读则会返回该文件描述符。...') # 指定select关心的哪些路(socket,或文件)数据 rlist = [listen_socket, sys.stdin] # 要读的文件对象列表,包括listen socket

    91920

    Python守护进程daemon实现

    守护进程脱离于终端是为了避免进程在执行过程中的信息在任何终端上显示并且进程也不会被任何终端所产生的终端信息所打断。...这些环境包括未关闭的文件描述符,控制终端,会话和进程组,工作目录以及文件创建屏蔽字等。这些环境通常是守护进程从执行它的父进程(特别是shell)中继承下来的。...1.2 守护进程的特性 1.在后台运行 2.与其运行前的环境隔离开来。这些环境包括未关闭的文件描述符、控制终端、会话和进程组、工作目录以及文件创建掩码等。...这是为了保证守护进程的当前工作目录在一个挂载的文件系统中,该文件系统不能被卸载。 5、关闭不再需要的文件描述符。根据具体情况来定。...se = open(stderr, 'a+', 0) os.dup2(si.fileno(), sys.stdin.fileno()) #dup2函数原子化关闭和复制文件描述符 os.dup2

    7.7K30

    Nginx(4):守护进程,一份nginx实现,一份我的实现,看着拿呗

    创建步骤 1、创建“孤儿进程”,形式上与终端脱离; 2、让这个“孤儿进程”成为新会话的组长,防止进程被原会话中其他进程干扰; 3、改变工作目录并重设文件创建掩码; 4、关闭文件描述符,因为没必要开着了...2)避免进程被任何终端所产生的信息所打断,其在执行过程中的信息也不在任何终端上显示。逍遥吧! 3)尽可能少的消耗CPU资源。...*/ umask(0); /* 新产生的进程从父进程继承了某些打开的文件描述符,如果不使用这些文件描述符,则需要关闭它们。...,第二子进程继续(第二子进程不再是会话组长) exit(0); } // 5)关闭打开的文件描述符 /* NOFILE 为 的宏定义 NOFILE...新产生的进程从父进程继承了某些打开的文件描述符,如果不使用这些文件描述符,则需要关闭它们。

    1.2K20

    【linux学习指南】 进程间通信&&匿名管道&&理解管道的本质

    父进程可以向管道的写端 fds[1] 写入数据。 在子进程中: 子进程关闭管道的写端 fds[1]。 子进程可以从管道的读端 fds[0] 读取数据。...通过这种方式,父进程和子进程可以通过共享的管道进行通信。父进程将数据写入管道,子进程从管道中读取数据。 这个过程中,父进程和子进程各自持有管道的一端文件描述符,确保了数据的正确流向。...通常,标准输入(stdin)是文件描述符 0, 标准输出(stdout)是文件描述符 1, 标准错误(stderr)是文件描述符 2。...文件描述符共享: 当使用 fork() 创建子进程时,子进程会继承父进程的所有文件描述符,包括管道的文件描述符。 父进程和子进程共享同一个管道的文件描述符,这使得它们可以通过管道进行通信。...关闭文件描述符: 当一个进程不再需要管道的某个端口时,应该关闭相应的文件描述符。 关闭读端 fds[0] 表示不再从管道读取数据,关闭写端 fds[1] 表示不再向管道写入数据。

    8410

    Python 守护进程

    调用‘close()’关闭文件描述符0,1和2。这样我们释放了从父进程继承的标     准输入,标准输出,和标准错误输出。...‘_SC_OPEN_MAX’告诉你每个进程能够打     开的最多文件数。然后使用一个循环,守护程序可以关闭所有可能的文件描     述符。你必须决定你需要做这个或不做。...如果你认为有可能有打开的文件描     述符,你需要关闭它们,因为系统有一个同时打开文件数的限制。 7. 为标准输入,标准输出和标准错误输出建立新的文件描述符。...(译者注:一     般使用dup2函数原子化关闭和复制文件描述符。...这就能够说通第一次是避免process group leader,第二次是避免session group leader。子进程就变成了一个无终端,无会话的完全自我掌控的后台进程了。

    93530

    优雅的玩PHP多进程

    参数 cmd 要执行的命令 descriptorspec 一个索引数组。 数组的键表示描述符,数组元素值表示 PHP 如何将这些描述符传送至子进程。...表达一个真实文件描述符的流资源类型 (例如:已打开的文件,一个 socket 端口,STDIN)。 文件描述符的值不限于 0,1 和 2,你可以使用任何有效的文件描述符 并将其传送至子进程。...0]); echo stream_get_contents($pipes[1]); fclose($pipes[1]); // 切记:在调用 proc_close 之前关闭所有的管道以避免死锁.../bin/php ) command returned 0 注释 Note: Windows 兼容性:超过 2 的描述符也可以作为可继承的句柄传送到子进程。...但是,由于 Windows 的架构并不将文件描述符和底层句柄进行关联, 所以,子进程无法访问这样的句柄。 标准输入,标准输出和标注错误会按照预期工作。

    55920

    【Linux系统IO】二、文件描述符与重定向

    fd 不是 0 或者 1 呢,而是从 3 开始 ❓❓❓ ​ 还记得我们曾经学C语言的文件操作时候说过,每次我们打开一个 C 程序或者这么说,Linux 进程默认情况下会有 3 个缺省打开的文件描述符,默认会打开三个标准输入输出流...所以我们创建这些新文件,都是从 fd 为 3 开始,那么我们也另外可以发现,fd 是 从 0 开始的,我们就可以推测其实这是一个数组下标!!!...而每次 linux 进程都会默认生成三个文件描述符分别指向 stdin、stdout、stderr,下标分别为 0、1、2,这也是为什么我们每次打开或者创建一个新文件的时候,fd 都是从 3 开始的原因...= -1); if(id == 0) { // 因为命令是子进程执行的,真正重定向的工作一定是子进程来完成的 // 如何重定向...,是父进程要给子进程提供信息的 // 又因为进程独立性,子进程重定向后其files_struct是不会影响父进程的 // 并且因为被打开文件是共享的,所以就能达到子进程重定向

    6510

    记一次传递文件句柄引发的血案

    它关闭管道的另一端,然后在fork出的子进程中将另一端重定向到子进程的标准输入、输出。...之后不断从console读入用户输入的两个整数,创建一个临时文件(get_temp_fd)并将用户输入写入文件, 之后通过管道将此临时文件传递给子进程,然后在管道上等待子进程返回的另一个临时文件句柄,...、标准输出,就简单多了, 从标准输入接收一个文件描述符作为输入,读取内容并解析后计算相加结果, 再取另一个临时文件(get_temp_fd)用来保存结果,并将该文件描述符回传给父进程。...这就奇怪了,读取管道返回这个错误的唯一原因只能是管道被关闭,而此管道在子进程端已经被重定向到了标准输入、标准输出, 当标准输入输出关闭时,唯一的可能性是进程已经退出。难道子进程已经不在了么?...从写这个小 demo 的过程中,我理解到书本知识到可运行的代码之间,还是有很多细节需要处理的, 有时看书就感觉自己会了,但到了实践就可能会遇到这样那样的问题(这些问题甚至和你要测试的东西无关), 动手解决问题的过程其实也加深了对书本知识的了解

    50320

    一文读懂五大 IO 模型的前世今生( select、epoll、epoll)

    }真正的非阻塞式 IO伪非阻塞(多线程)实现方案是通过创建多线程的方式来处理不同的连接从而避免主线程阻塞,但实际上子线程内部读操作 read 还是阻塞的,这只是用户层的小把戏。...,但是第二阶段的数据读取还是阻塞的,非阻塞 read 最重要的是提供了我们在一个线程内管理多个文件描述符的能力。...这时我们自然而然就会想到把上述循环检测连接(文件描述符)可读的过程交给操作系统去做,从而避免频繁的进行系统调用。当然操作系统给我们提供了这样的函数:select、poll、epoll。...IO 模型发展从阻塞 read 函数开始,它整个过程都是阻塞的,为了解决这个问题,我们在用户态通过异步线程实现主线程的非阻塞,但是子线程的 read 过程还是阻塞的,但是线程资源是有限的,且等待读就绪的过程是耗时最多的环节...,因此我们在一个线程内通过 while 和非阻塞 read 的能力避免等待读就绪过程中线程资源占用,后来操作系统发现这个场景比较多,便提供了 select、epoll、epoll 函数实现上述功能来减少系统调用

    1.1K41

    如何让程序真正地在后台运行?

    况且,一旦系统的huponexit选项是打开的,这种方式仍然无法避免终端关闭程序就退出的命运! 那么就需要实现用户守护进程了,或者说daemon化。...同样的,其工作目录可能是从父进程继承而来的,可以自己另立山头。 关闭不需要的文件描述符。同样的,可能从父进程继承了一些打开的文件描述符,而这些描述符可能再也不需要,因此可以关闭。...(在fork的介绍中,我们说到,儿子从父亲那里继承了很多东西) 重新设置权限掩码,避免受父进程影响 创建新的会话,脱离终端 使用新的工作目录 关闭不需要的文件描述符 关闭标准输入,标准输出和标准错误 所以通过这些也可以明白...为了保留printf的输出,我在daemonize函数中,并没有关闭所有的文件描述符,0,1,2可以参考《如何理解 Linux shell中“2>&1”?》...,当然了,如果想让printf的输出保存到文件,也有方法,可以参考《如何优雅地将printf的打印保存在文件中?》,这里就不再赘述了。

    2.6K20

    Linux应用编程基本概念

    进程 在Linux中,进程是正在运行的程序的实例。每个进程都有独立的内存空间、文件描述符和执行上下文。fork系统调用用于创建新进程。exec系列系统调用用于在进程中执行新程序。...include int main() { pid_t child_pid = fork(); if (child_pid == 0) { // 子进程执行的代码...文件描述符 文件描述符是一个整数,用于标识一个打开的文件、套接字或其他I/O资源。标准输入、标准输出和标准错误的文件描述符分别是0、1和2。文件描述符的操作包括读、写、关闭等。...线程 Linux支持多线程编程。线程是一个轻量级的执行单元,可以与同一进程的其他线程共享内存空间。线程可以通过pthread库创建和管理。...多路复用(select 和 epoll) 多路复用是一种提高 I/O 操作效率的机制,它允许一个进程同时监视多个文件描述符。在 Linux 中,select 和 epoll 是常用的多路复用机制。

    19610

    从零实现操作系统-Lab 1: Unix utilities

    下面看下,xv6 book中对管道的定义。 管道是一个小的内核缓冲区,它以文件描述符对的形式提供给进程,一个用于写操作,一个用于读操作。从管道的一端写的数据可以从管道的另一端读取。...== 0) { //unix里面,一切皆文件,所以stdin stdout都可以看成是文件 close(0); //关闭stdin, 对应文件描述符0,这样0就空出来了 dup(p[0]); //...在 fork 之后,父进程和子进程都有了指向管道的文件描述符。子进程将管道的读端口拷贝在描述符0上,关闭 p 中的描述符,然后执行 wc。当 wc 从标准输入读取时,它实际上是从管道读取的。...父进程向管道的写端口写入然后关闭它的两个文件描述符。...提示: 及时关闭进程不需要的文件描述符,否则将会耗尽系统内存。 一旦第一个进程达到 35,您应该安排管道终止,包括所有子进程(提示:当管道的写端关闭时,读取将返回文件结束)。

    1.1K20

    并发编程~先导篇上

    ,逆天遇到太多坑了,所以避免大家入坑,简单说说这些概念和一些偏底层的东西~看不懂没事,有个印象即可,以后遇到问题至少知道从哪个方向去解决 2.进程相关 示例代码:https://github.com/lotapp...,把符合条件的输出到终端 终端文件描述获取: import syssys.stdin.fileno() # STDIN_FILENO = 0:文件描述符输入(读端)sys.stdout.fileno()...sys.stdin.fileno()) # STDOUT_FILENO == 0 (文件描述符输入,读端) # 僵桃李代 (默认是从终端读,重定向后从内核缓冲区读) os.execlp...:fork了两个子进程,则文件描述符被复制了2份,大家文件描述符的3、4都指向了 pipe管道的 read_fd和 write_fd 来张图理解一下,哪些fd被close了(如果让子进程之间通信,父进程因为不读不写...返回实际写入的字符串长度 os.read(fd,n)从文件描述符 fd 中读取最多 n 个字节,返回包含读取字节的字符串 如果文件描述符fd对应文件已达到结尾, 返回一个空字符串 举个父子间通信的例子(

    1.9K80

    1.并发编程~先导篇(上)

    ,逆天遇到太多坑了,所以避免大家入坑,简单说说这些概念和一些偏底层的东西~看不懂没事,有个印象即可,以后遇到问题至少知道从哪个方向去解决 2.进程相关 示例代码:https://github.com/lotapp...STDOUT_FILENO = 1 # 看这:文件描述符输出(写端) STDERR_FILENO = 2 # 已经被占用了0~2了,自然从3开始 # 下面的不用你会,上面Code看完,我们的目的就达到了...,grep从内核缓冲区里面读取,把符合条件的输出到终端 终端文件描述获取: import sys sys.stdin.fileno() # STDIN_FILENO = 0:文件描述符输入(读端) sys.stdout.fileno...(read_fd, sys.stdin.fileno()) # STDOUT_FILENO == 0 (文件描述符输入,读端) # 僵桃李代 (默认是从终端读,重定向后从内核缓冲区读)...返回实际写入的字符串长度 os.read(fd,n)从文件描述符 fd 中读取最多 n 个字节,返回包含读取字节的字符串 如果文件描述符fd对应文件已达到结尾, 返回一个空字符串 举个父子间通信的例子(

    1.5K40

    守护进程

    守护进程不受任何终端控制是为了避免进程在的执行的过程中在终端上输出信息,同时避免进程被终端所产生的信息打断(比如在终端输入ctrl+c或直接退出ssh连接导致的进程退出)。...一般的服务软件都需要这样的性质,比如nginx,就要长期运行并且不受终端输入的影响。 然后,如何创建守护进程? 一、Call fork and have the parent exit....--设置文件屏蔽字。 这一步的作用有三个: 1.修改从父进程继承来的文件屏蔽字,避免父进程原先设置的文件屏蔽字对守护进程来说不合理。...--关闭不必要的文件描述符。 这一步同样可有可无,如果守护进程觉得有必要,可以这样做。如果确信没有从父进程继承什么文件描述符,或者需要这些继承的文件描述符,就不需要关闭。...} 注意 有很多守护进程的实现是两次调用fork,这样做主要是为了避免僵尸进程的产生。 何为僵尸进程呢? linux里的进程都属于一棵树,树的根结点是init(pid为1)。

    2.8K40

    linux网络编程之socket(九):使用select函数改进客户端服务器端程序

    kill掉,则其终止时,socket描述符会自动关闭并发FIN段给client,client收到FIN后处于CLOSE_WAIT状态,但是client并没有终止,也没有关闭socket描述符,因此不会发...FIN 段给 server子进程,因此server 子进程的TCP连接处于FIN_WAIT2状态。...出现上述问题的根本原因在于客户端程序不能并发处理从标准输入读取数据和从套接字读取数据两个事件,我们可以使用前面讲过的select函数来完善客户端程序,如下所示: void do_echocli(int ...socket描述符,server 子进程的TCP连接收到client发的FIN段后处于TIME_WAIT状态,此时会再发生一个ACK段给client,client接收到之后就处于CLOSED状态,这个状态存在时间很短... * 1.一个进程所能打开的最大文件描述符数,可以通过ulimit -n来调整  *   但一个系统所能打开的最大数也是有限的,跟内存有关,可以通过cat /proc/sys/fs/file-max

    3.8K00

    手拿放大镜深究文件IO

    只在一个地方有区别,即当子进程关闭一个文件时,不会影响父进程的文件表。 图1 文件描述符和文件的对应关系 从图1可以得到以下几点信息。...内核为每个进程都维护了一个文件表,文件表在底层是一个数组,索引从0开始,索引即为文件描述符,几乎所有对文件的操作均以文件描述符作为基本参数。...打开/关闭文件 linux系统下一切皆文件,而对文件的所有操作都需要打开文件,所有操作结束之后都需要关闭文件,否则会出现预期之外的错误。 2.1.1. open 打开文件的系统函数是open。...从中也可以看到,即使已经关闭文件(调用了close函数),依旧可以写入文件,因为存储映射还在。写文件内容时,从第三个字节开始,将文件后续的内容全部刷为字母’s‘。...),如何手动执行页回写(2.5.2.3);并由此过渡到标准I/O(2.6),同时介绍了使用mmap读写文件的机制(2.7),看到了应用程序在系统调用的基础上如何加速文件操作;最后介绍了网络I/O(3),

    86230
    领券