在分散和收集(即readv和writev)中,Linux读入多个缓冲区并从多个缓冲区写入.
如果说,我有一个3个缓冲区的向量,我可以使用readv,或者我可以使用单个缓冲区,其大小为3个缓冲区并且可以fread.
因此,我很困惑:应该使用分散/聚集哪些情况以及何时应该使用单个大缓冲区?
我正在实现一个简单的服务器,它接受单个连接,然后使用该套接字同时读取和写入来自读写线程的消息.在Linux上的c/c ++中同时读取和写入相同套接字描述符的安全简便方法是什么?我不需要担心从同一个套接字读取和写入多个线程,因为将有一个专用读取和单个专用写入线程写入套接字.
在上面的场景中,是否需要任何类型的锁定?
以上场景是否需要非阻塞套接字?
是否有任何开源库,这将有助于上述情况?
我正在编写一个脚本,使用bash在linux 2.6上设置环境变量.所以脚本包含如下命令:
export SRC_DIR=..
export LIBPATH=${SRC_DIR}/lib
Run Code Online (Sandbox Code Playgroud)
问题是,当我尝试回显$ LIBPATH时,它显示"../lib"而不是将SRC_DIR扩展为完整路径.我真的希望脚本打印像/ home/x/lib这样的东西而不是../lib.
更新脚本应该将SRC_DIR评估为脚本位置向上的一个目录,而不是调用脚本的当前目录
我有一台服务器接收连续的数据流.与从套接字多次读取相反,我想通过一次系统调用来读取套接字接收缓冲区中的整个数据read().
当然,我可以传递一个大缓冲区,read()并尝试用所有可用数据填充它.但这会浪费大量内存,因为malloc的缓冲区大多数时候都比socket上的实际数据大.有没有办法查询套接字上的可用数据?
下面的程序将字符串转换为long,但根据我的理解,它也会返回错误.我依赖的事实是,如果strtol将字符串成功转换为long,那么第二个参数strtol应该等于NULL.当我用55运行以下应用程序时,我收到以下消息.
./convertToLong 55
Could not convert 55 to long and leftover string is: 55 as long is 55
Run Code Online (Sandbox Code Playgroud)
如何成功检测strtol的错误?在我的应用程序中,零是有效值.
码:
#include <stdio.h>
#include <stdlib.h>
static long parseLong(const char * str);
int main(int argc, char ** argv)
{
printf("%s as long is %ld\n", argv[1], parseLong(argv[1]));
return 0;
}
static long parseLong(const char * str)
{
long _val = 0;
char * temp;
_val = strtol(str, &temp, 0);
if(temp != '\0')
printf("Could not convert %s to long and …Run Code Online (Sandbox Code Playgroud) 我有以下代码:
#include <string>
#include <boost/thread/tss.hpp>
static boost::thread_specific_ptr<string> _tssThreadNameSptr;
Run Code Online (Sandbox Code Playgroud)
我收到以下错误
g ++ -c -I $ BOOST_PATH tssNaming.h
tssNaming.h:7:错误:未在此范围内声明'string'
但我在我的包括字符串#include.
我正在尝试在RHEL 5.6,64位上编译以下内容,并且我不断收到警告
"var.c:7:警告:格式'%d'需要类型'int',但参数2的类型为'long unsigned int'"
这是我的代码:
#include <stdio.h>
#include <stdlib.h>
int main()
{
unsigned int n =10;
printf("The size of integer is %d\n", sizeof(n));
}
Run Code Online (Sandbox Code Playgroud)
如果我将"n"的声明更改为以下内容并不重要
我想要做的就是在我的机器上打印整数的大小,而不是真正关注limits.h.
在我的应用程序中,有一个专用的io-thread
应用程序通过不同的线程处理数据.此外,要求规定未确认的窗口大小应为1,即任何时候应该只有一个未确认的未确认消息.这意味着如果io-thread已经通过套接字发送了一条消息,它将不再发送任何消息,直到它从接收方听到一个确认消息.应用程序的处理线程通过管道与io-thread通信.如果来自linux CLI的人键入ctrl + C,应用程序需要正常关闭.因此,鉴于这些要求,我有以下选择
我有以下问题
select()和poll()之间的决定.我的应用程序只处理少于50个文件描述符.可以假设我选择选择或民意调查没有区别吗?
select()和pselect()之间的决定.我阅读了linux文档,它说明了signal和select之间的竞争条件.我没有信号经验,所以有人可以更清楚地解释竞争条件和选择()吗?它是否与某人在CLI上按ctrl + C并且应用程序没有停止有关?
pselect和ppoll()之间的决定?对一个与另一个的任何想法
我的理解是,带宽延迟乘积指的是在两个端点之间的任何时间点"在途中"的最大数据量.
我没有得到的是,为什么乘以RTT的带宽.带宽是底层介质的功能,如铜线,火灾光学等,RTT是中间节点繁忙程度,中间节点应用的任何调度,距离等的函数.RTT可以改变,但实际用途的带宽可以考虑固定的.那么如何将常数值(容量即带宽)乘以波动值(RTT)表示传输中的数据总量?
基于此,真的很慢会有非常大的容量吗?机会是RTT的"原因"将开始下降.
我正在使用自定义网络协议库.该库基于TCP/IP构建,据称可用于高频消息传递.它是一个非阻塞库,使用回调作为与调用者集成的接口.
我不是表演专家,这就是我决定在这里提出这个问题的原因.自定义库带有特定约束,概述如下:
"Callee不应该在回调线程的上下文中调用任何库的API.如果他们试图这样做,线程将挂起"
克服API限制的唯一方法是我启动另一个处理消息的线程并调用库来发送响应.库线程和进程线程将共享一个公共队列,该队列将受到互斥锁的保护,并使用wait_notify()调用来指示是否存在消息.
如果我每秒接收80k消息,那么我会让线程进入睡眠状态并经常唤醒它们,执行线程上下文切换每秒80k次.
另外,由于有两个线程,它们不会在L1缓存中共享消息缓冲区.包含消息的缓存行首先由库的线程填充,然后逐出并拉入进程线程的核心L1缓存.我是否遗漏了某些内容,或者图书馆的设计是否可能不适用于高性能用例?
我的问题是:
我已经看到过诸如"不要在回调的上下文中使用此API,因为它可能导致锁定"的警告.跨越许多图书馆.导致此类设计约束的常见设计选择是什么?如果是多次调用锁的同一线程的简单问题,他们可以使用递归锁.这是一个可重入的问题,以及哪些挑战可能导致API所有者制作不可重入的API?
在上面的设计模型中有没有办法,库线程和进程线程可以共享同一个内核,从而共享一个缓存行?
volatile sig_atomic_t作为一种在两个线程之间共享数据的机制有多昂贵?
鉴于高频情况,在两个线程之间共享信息的轻量级方法是什么?
库和我的应用程序是基于C++和Linux构建的.
c ×6
linux ×6
c++ ×4
sockets ×2
bash ×1
boost-thread ×1
io ×1
networking ×1
nonblocking ×1
tcp ×1