草庐IT

c++ - 用 C 编写 Linux 服务器的最佳方法(phtreads、select 或 fork?)

我有一个关于UNIX(Debian,内核2.6.32)服务器编程的非常具体的问题。我的目标是学习如何编写可以处理大量客户端的服务器。我的目标是超过30,000个并发客户端(即使我的大学提到500,000个是可能的,这似乎QUIIITEEE是一个巨大的数量:-)),但我真的不知道(即使是可能的),这就是我问的原因这里。所以我的第一个问题。有多少同时客户端是可能的?客户端可以随时连接并与其他客户端联系并组成一个组(1个组最多包含12个客户端)。他们可以互相聊天,因此TCP/IP数据包的大小取决于发送的消息。客户端还可以向服务器发送数学公式。服务器将解决它们并将答案广播回组。这是一个相当繁重

linux - Linux 中的 fork() 和 grep 是什么意思?

作为一个非英语母语的人,与其他API相比,我很难记住Linux命令。在Linux中,函数名称似乎并不表明它们的用途。为什么选择名称fork()来创建子进程?在字典中,fork的意思是“有两个或多个fork的器具”,这与创建新进程无关。为什么选择名称grep来“打印与模式匹配的行”?grep是否表示“g报告”?我在哪里可以找到LinuxAPI中其他命令背后的词源? 最佳答案 Fork可以表示一分为二,如道路(source)。Fork(15):todivideintobranches.Grep'setymology:Fromanidio

c - _do_fork() 如何返回两个不同的 PID(一个用于父进程,一个用于子进程)

我正在查看_do_fork()function()试图理解fork()如何返回父进程的子PID和子进程的0。我认为nr包含子进程的PID(将返回给调用者进程),但我看不出它如何能够将0返回给子进程。答案Howdoesfork()knowwhentoreturn0?说返回值在为新进程创建的堆栈上传递,但是(除了没有真正理解它之外)我在代码中找不到它。那么,子进程的返回值0设置在哪里呢?_do_fork()函数的代码复制如下:long_do_fork(unsignedlongclone_flags,unsignedlongstack_start,unsignedlongstack_size

c++ - 为什么 fork() 会导致重复输出?

这个问题在这里已经有了答案:fork()andoutput(8个答案)关闭6年前。#include#include#includeintmain(){std::coutfork位于流进cout之后,但此代码打印11。为什么?如果将std::endl添加到cout,为什么代码只打印1?#include#include#includeintmain(){std::cout

python - 通过 fork() 运行多个子进程的最佳方式是什么?

一个python脚本需要通过fork()生成多个子进程。所有这些子进程都应该同时运行,父进程应该等待它们全部完成。能够为“慢”child设置一些超时会很好。收集完所有child后,父进程继续处理脚本的其余部分。解决问题的最佳方法是什么?谢谢。 最佳答案 简单的例子:importoschidren=[]forjobinjobs:child=os.fork()ifchild:children.append(child)else:pass#reallyshouldexecthejobforchildinchildren:os.waitpi

c - 是否可以在不继承父进程的虚拟内存空间的情况下 fork 进程?

由于父进程正在使用大量内存,fork可能会失败errno的ENOMEM在内核过量使用策略的某些配置下。即使子进程可能只有exec像ls这样的低内存消耗程序。为了澄清问题,当/proc/sys/vm/overcommit_memory配置为2时,(虚拟)内存的分配限制为SWAP+MEMORY*ration(defaultto50%).当一个进程fork时,由于COW,虚拟内存不会被复制。但是内核仍然需要分配虚拟内存空间。打个比方,fork就像malloc(virtualmemoryspacesize),不会分配物理内存,写共享内存会导致复制虚拟内存,分配物理内存。当overcommit_

linux - clone()/fork()/进程创建在某些机器上很慢

在我的一些机器上创建新进程非常慢,而在其他机器上则不然。所有机器都很相似,一些速度较慢的机器在与一些速度较快的机器相同的硬件和内核(2.6.32-26,Ubuntu10.04)上运行完全相同的工作负载。不涉及进程创建的任务在所有机器上的速度相同。例如,此程序在受影响的机器上执行速度慢了约50倍:intmain(){inti;for(i=0;i什么可能导致任务创建速度变慢,我可以在机器中寻找哪些其他差异?编辑1:在这些机器上运行bash脚本(因为它们会生成大量子进程)也非常慢,慢速脚本上的strace显示clone()内核调用速度变慢。Edit2:vmstat在快机器和慢机器上没有显示任

c++ - 如何在 Linux 中找到具有写时复制的 fork 进程之间共享多少内存?

如果有一个进程读取一个大文件并将其保存在它的内存中(或者只是一个mallocedchar*),并且该主进程被fork,如果子进程只从该内存(或char*)中读取,根据写时复制,保存指针的内存不会被复制,父进程和子进程共享同一内存,直到其中任何一个尝试写入该内存,在这种情况下,进程会复制内存并改变它。所以我的问题是,如果实现了写时复制,是否有办法知道子进程使用的未与主进程共享的内存量?换句话说,如果子进程使用来自某些读取调用的父内存,那么它实际使用了多少内存?top或ps命令只会给出child应该拥有的内存总量。(即假设内存或指针中的数据被child复制。)有没有办法获取CoW语义实际使

c - 使用 fork/execvp 在 C 中编写一个简单的 shell

我必须使用系统调用fork()/execvp()在C中开发一个简单的shell。到目前为止,我的代码接受了一个命令,使用strtok将其拆分为一个数组argv,然后我调用fork来创建一个子对象并执行该命令。我在ubuntu中处理这个问题,其中大多数命令都在/bin/目录中,所以我附加程序名称(例如/bin/ls)并将其用于execvp的第一个arg,然后我给它argv数组.如果我输入命令“ls”,我的程序就可以运行,但是当尝试其他命令甚至“ls-l”时,我得到一个“ls:无效选项”。我不确定我在这里做错了什么。#include#include#include#defineBUFFER

c - 在接受连接之前或之后 fork ?

下面的代码片段创建了4个进程,它们都共享同一个监听套接字。这样做有什么危险吗?在连接被接受后,我是否应该始终以传统方式进行一个监听进程和fork?for(p=0;p(我知道接受后的fork允许程序为每个连接创建一个进程。我正在玩原型(prototype)线程和各种异步的东西,所以我只是在考虑每个核心有一个进程。) 最佳答案 两种方式都可以。正如您所注意到的,接受之后的fork是每个客户端/连接的一个child。在接受之前(但在监听之后)fork通常称为预fork。每个child都在等待接受,任何获得传入连接的child都会处理它。只