Tag: posix

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

我有客户端和服务器程序,现在通过TCP进行通信。 我正在尝试使用POSIX消息队列(当然,在客户端和服务器位于同一台机器上的情况下)。 我希望它能提高性能(特别是通过减少延迟)。 我已经解决了大部分问题,但我不确定一件事:如何建立“连接”。 服务器同时接受来自多个客户端的连接,所以我很想模仿TCP连接建立过程,如下所示: 服务器打开一个具有已知名称的队列并连续读取它(它可以像使用TCP一样使用select(2) )。 客户端打开三个队列:两个具有任意名称(包括一些唯一性,例如PID以避免冲突),以及一个具有服务器使用的已知名称的队列。 客户端向服务器的队列发送“连接”消息,包括客户端的队列名称(一个指定用于客户端到服务器的流量,另一个指定用于反向)。 服务器打开客户端连接消息中指定的队列,并开始从客户端到服务器读取(选择)。 客户端使用众所周知的名称关闭服务器队列。 使用客户端命名的两个队列(每个方向一个)进行双向通信。 您可能会看到此方案与常见的TCP方法类似,这并非偶然。 但是,我想知道: 你能想到更好的方法吗? 你看到我的方法有任何潜在的问题吗? 您是否有任何其他想法,包括在同一台计算机上使用消息队列而不是TCP实际上可以提高性能(延迟)的可能性? 请记住,之前我没有使用POSIX消息队列(我之前使用过IBM WebSphere MQ,但这有点不同)。 该平台是Linux。

将队列设计为共享内存

我正在尝试将(循环)队列(在C中)设计/实现为共享内存,以便可以在多个线程/进程之间共享它。 队列结构如下: typedef struct _q { int q_size; int q_front; int q_rear; int *q_data; }queue; 它支持以下function: int empty_q(queue *q); int display_q(queue *q); int create_q(queue **q, int size); int delete_q(queue **q); int enqueue(queue *q, int data); int dequeue(queue *q, int *data); 根据用户提到的队列大小,q_data的内存将在create_q()中分配。 问题:如何使用“sys / shm.h”中提供的系统函数为此队列创建共享内存? 使用shmget(),shmat(),shmctl()等创建/附加/检索/删除队列数据结构的共享内存的任何代码片段/示例都将是一个很好的帮助。

在sigprocmask()中设置和设置

我还没有完全理解,如何使用sigprocmask() 。 特别是, set和oldset及其语法如何工作以及如何使用它们。 int sigprocmask(int how, const sigset_t *set, sigset_t *oldset); 请解释一个例子,阻止,说SIGUSR1几秒钟,然后解锁并处理它。

什么posix_fadvise()args用于顺序文件写入?

我正在开发一个顺序写入大文件(并且根本不读取)的应用程序,我想使用posix_fadvise()来优化文件系统行为。 联机帮助页中的函数说明表明最合适的策略是POSIX_FADV_SEQUENTIAL 。 但是,Linux实现描述怀疑: 在Linux下, POSIX_FADV_NORMAL将预读窗口设置为后备设备的默认大小; POSIX_FADV_SEQUENTIAL将此大小加倍,POSIX_FADV_RANDOM完全禁用文件预读。 由于我只是在写数据(可能也会覆盖文件),所以我不期待任何预读。 我应该坚持使用POSIX_FADV_SEQUENTIAL还是使用POSIX_FADV_RANDOM来禁用它? 其他选项怎么样,比如POSIX_FADV_NOREUSE ? 或者也许不要使用posix_fadvise()来写作?

如何在没有连接的情况下同步管理器/工作线程pthreads?

我熟悉multithreading,并且已经成功地用Java和Objective-C开发了许多multithreading程序。 但是在没有使用主线程的连接的情况下,我无法使用pthreads在C中实现以下内容: #include #include #include #define NUM_OF_THREADS 2 struct thread_data { int start; int end; int *arr; }; void print(int *ints, int n); void *processArray(void *args); int main(int argc, const char * argv[]) { int numOfInts = 10; int *ints = malloc(numOfInts * sizeof(int)); for (int i = 0; i < numOfInts; i++) { ints[i] […]

POSIX pthread编程

我必须编写一个multithreading(比如两个线程)程序,其中每个线程执行不同的任务。 此外,这些线程一旦启动就必须在后台无限运行。 这就是我所做的。 有人可以给我一些反馈,如果方法是好的,如果你看到一些问题。 另外,我想知道如果用Ctrl + C终止执行,如何以系统的方式关闭线程。 main函数创建两个线程,让它们无限运行,如下所示。 这是骨架: void *func1(); void *func2(); int main(int argc, char *argv[]) { pthread_t th1,th2; pthread_create(&th1, NULL, func1, NULL); pthread_create(&th2, NULL, func2, NULL); fflush (stdout); for(;;){ } exit(0); //never reached } void *func1() { while(1){ //do something } } void *func2() { while(1){ //do something } } 谢谢。 使用答案中的输入编辑代码:我是否正确退出线程? […]

在使用带有信号处理程序的multithreading程序时,有没有办法确保primefaces性?

如果我有这样的程序(伪代码): mutex_lock; func() { lock(mutex_lock); // Some code (long enough to make a // race condition if no proper synchronisation // is available). We also going to call a signal, // say, SIGINT, through (ctrl-c), while we are in // the range of locking and unlocking the lock. unlock(mutex_lock); } sig_handler_func(sig) { // Say, we […]

时间函数的粒度

有没有办法检查POSIX提供的gettimeofday()函数的粒度?

是否可以从FILE *中挽救文件描述符?

我必须使用某个跨平台库来传递FILE*对象。 我从另一个源(inheritance)获取文件描述符,我想在fd过程中保持相同的fd 。 我目前使用fdopen将文件描述符转换为FILE*对象。 我的问题是fclose用于清理FILE*对象关闭连接文件描述符。 我非常希望在使用它之后保留这个文件描述符。 有没有办法从FILE*救援文件描述符? 有没有办法拆分它? 或者用虚拟替换FILE*文件描述符的方法? PS这需要跨平台,无论如何都要横跨POSIX。

raise(SIGABRT)和abort()方法之间的区别

我知道raise(SIGABRT)和abort()方法都会向自己发送SIGABRT信号。 但这两个function之间存在一些差异。 (例如 – abort()函数解除SIGABRT信号的阻塞,而raise(SIGABRT)则不会。) raise(SIGABRT)和abort()方法之间的其他区别是什么?