标签: posix

使用POSIX消息队列而不是TCP套接字 - 如何建立"连接"?

我有客户端和服务器程序,现在通过TCP进行通信.我正在尝试使用POSIX消息队列(当然,在客户端和服务器位于同一台机器上的情况下).我希望它能提高性能(特别是通过减少延迟).

我已经解决了大部分问题,但我不确定一件事:如何建立"连接".服务器同时接受来自多个客户端的连接,所以我很想模仿TCP连接建立过程,如下所示:

  1. 服务器打开一个具有已知名称的队列并连续读取它(它可以select(2)像TCP一样使用).
  2. 客户端打开三个队列:两个具有任意名称(包括一些唯一性,例如PID以避免冲突),以及一个具有服务器使用的已知名称的队列.
  3. 客户端向服务器的队列发送"连接"消息,包括客户端的队列名称(一个用于客户端到服务器的流量,另一个用于反向).
  4. 服务器打开客户端连接消息中指定的队列,并开始从客户端到服务器读取(选择).
  5. 客户端使用众所周知的名称关闭服务器队列.使用客户端命名的两个队列(每个方向一个)进行双向通信.

您可能会看到此方案与常见的TCP方法类似,这并非偶然.但是,我想知道:

  1. 你能想到一个更好的方法吗?
  2. 你看到我的方法有任何潜在的问题吗?
  3. 您是否有任何其他想法,包括在同一台计算机上使用消息队列而不是TCP实际上可以提高性能(延迟)的可能性?

请记住,之前我没有使用POSIX消息队列(我之前使用过的是IBM WebSphere MQ,但这有点不同).该平台是Linux.

c connection posix client-server message-queue

14
推荐指数
2
解决办法
1万
查看次数

是否有Unix函数的Java库?

我要寻找一个Java库与标准的Unix功能,即对接stat(),getpwuid(),readlink().

这曾经存在,并被称为javaunix.它于2000年发布.见本公告.但是项目页面现在已经消失了.

今天Java中这些类型的函数是否有任何现代替代品?可以让系统调用/bin/ls -l并解析输出,或编写自定义JNI方法,但这些方法比简单地使用旧javaunix库更有用.

澄清 -为了从C程序中找出文件的所有者,它应该调用stat()哪个给出所有者的UID,然后用来getpwuid()从UID获取帐户的名称.在Java中,这可以通过自定义JNI方法或javaunix使用JNI 的库来完成.

java unix java-native-interface posix

14
推荐指数
1
解决办法
5936
查看次数

C中的实路径功能示例

我正在寻找一个如何在C程序中使用realpath函数的示例.我似乎无法在网上或我的任何C编程书中找到一个.

c posix realpath

14
推荐指数
1
解决办法
4万
查看次数

结构中的"s"是什么意思?

这是一个简单的问题.sin_family,sin_port,sin_addr和sin_zero中主要字母" s " 的含义是什么?

struct sockaddr_in {
    short int          sin_family;  // Address family, AF_INET
    unsigned short int sin_port;    // Port number
    struct in_addr     sin_addr;    // Internet address
    unsigned char      sin_zero[8]; // Same size as struct sockaddr
};
Run Code Online (Sandbox Code Playgroud)

谢谢.

c unix posix network-programming

14
推荐指数
3
解决办法
1114
查看次数

两个文件描述符到同一个文件

使用posix read()write()linux调用,是否保证如果我通过一个文件描述符写入并通过另一个文件描述符读取,则以串行方式使这两个动作相互排斥......我的读文件描述符总是会看到写文件描述符最后写的是什么?

我相信情况确实如此,但我想确定并且手册页对此没有太大帮助

linux posix file file-descriptor

14
推荐指数
1
解决办法
2万
查看次数

如何在POSIX中标记数组?

在替换shell脚本中的外部命令时,我使用了一个数组来摆脱awk NF.

现在,由于我从bash转移到POSIX sh,我无法将数组标记为正确:

#!/bin/bash
export RANGE="0 1 4 6 8 16 24 46 53"
RANGE=($RANGE)
echo arrayelements: $((${#RANGE[@]}))
LAST=$((${#RANGE[@]}-1))
echo "Last element(replace NF): ${RANGE[$LAST]}"

# ./foo
arrayelements: 9
Last element(replace NF): 53
Run Code Online (Sandbox Code Playgroud)

我正在使用OpenBSD,sh和它的大小与ksh完全相同.更改为以上/bin/sh,似乎以下不起作用:

set -A "$RANGE"
set -- "$RANGE"
Run Code Online (Sandbox Code Playgroud)

我怎么能实现上面的脚本/bin/sh?(注意,如果你调用bash,它可以正常工作--posix,那不是我想要的.)

arrays bash posix sh

14
推荐指数
2
解决办法
1万
查看次数

在主要之前调用fork

POSIX标准是否允许fork()在之前调用main()- 例如,在C++ static实例中或在__attribute__((constructor))C函数中?

c c++ posix fork language-lawyer

14
推荐指数
2
解决办法
547
查看次数

在x86_64上,大6GB文件的read()失败

这是我的问题的描述:

我想读取一个大的文件,大约6.3GB,所有内存使用readC中的系统调用,但发生错误.这是代码:

#include <stdio.h>
#include <stdlib.h>
#include <errno.h>
#include <string.h>
#include <unistd.h>
#include <assert.h>
#include <sys/types.h>
#include <sys/stat.h>
#include <fcntl.h>
#include <limits.h>

int main(int argc, char* argv[]) {
    int _fd = open(argv[1], O_RDONLY, (mode_t) 0400);
    if (_fd == -1)
        return 1;
    off_t size = lseek(_fd, 0, SEEK_END);
    printf("total size: %lld\n", size);
    lseek(_fd, 0, SEEK_SET);
    char *buffer = malloc(size);
    assert(buffer);
    off_t total = 0;
    ssize_t ret = read(_fd, buffer, size);
    if (ret != size) {
        printf("read fail, %lld, reason:%s\n", …
Run Code Online (Sandbox Code Playgroud)

c linux file-io posix unbuffered

14
推荐指数
2
解决办法
696
查看次数

`gmtime()`会在闰秒时报告秒为60?

我有一台运行的服务器TZ=UTC,我有这样的代码:

time_t t = time(NULL);
struct tm tm;
gmtime_r(&t, &tm);
Run Code Online (Sandbox Code Playgroud)

问题是tm.tm_sec == 60服务器何时处于闰秒之内?

例如,如果我在以下时间范围内:

1998-12-31T23:59:60.00 - 915 148 800.00
1998-12-31T23:59:60.25 - 915 148 800.25
1998-12-31T23:59:60.50 - 915 148 800.50
1998-12-31T23:59:60.75 - 915 148 800.75
1999-01-01T00:00:00.00 - 915 148 800.00
Run Code Online (Sandbox Code Playgroud)

gmtime()返回tm == 1998-12-31T23:59:60time_t = 915148800,一旦出了闰秒,回归tm == 1999-01-01T00:00:00为同time_t

c time posix utc unix-timestamp

14
推荐指数
2
解决办法
1159
查看次数

OSX缺乏memalign

我正在研究C中的一个项目,它需要memalign().真的,posix_memalign()也会这样做,但是darwin/OSX缺少这两者.

什么是鞋拔的良好解决方案?我不理解posix-C代码的许可,如果我要删掉memalign.c并把它放在我的项目中 - 我不希望任何病毒式许可LGPL-ing我的整个项目.

c c++ macos posix

13
推荐指数
3
解决办法
1万
查看次数