Articles of ipc

Windows IPC模拟到Linux Unix域和Netlink套接字

在Linux上,在用户态进程和服务之间的一个相当常见的IPC方法是,例如一个套接字接口(Unix域或者netlink)。 简单地说 – 这是什么Windows的模拟,以及用户级进程如何与服务进行通信? 设置阶段:假设我有一个后台服务运行,监视networking上的设备。 如果我想写一个程序来利用这个服务提供的服务,那么这样做的常见“Windows方法”是什么? 如果我完全不在这里,那么Windows服务可能在Windows操作系统上自行扩展的常见方式是什么,以便其他进程可能知道它正在主动监听连接?

在Linux中使用pipe道的进程间通信

我已经写了我的代码编写一个数字在Linuxpipe道。 它是一样的,但它是显示错误,任何人都可以帮助我。 基本上这个程序的问题陈述如下: – 一个程序将打开一个pipe道,向pipe道写一个数字。 – 其他程序将打开相同的pipe道,将读取数字并打印它们。 – closures两个pipe道 int main() { int number; FILE *fout; fout = popen(" ","w"); pclose(fout); return 0; } 现在我的问题是我应该给popen命令选项(如上面显示的空白)什么命令,以便我可以进一步进行并编写一个数字pipe道。

等待多个信号而不需要等待(C / C ++ Linux)

如果我有多个信号量,那么我怎么能有一个进程块,直到至less有一个信号量是免费的? 我知道我可以用忙等待循环来做到这一点,例如: // blocks until one of the semaphores in sems is free, returns // index of semaphore that was available int multiple_sem_wait(sem_t **sems, int num_sems) { while (true) { for (int i = 0; i < num_sems; ++i) { if (sem_trywait(sems[i]) == 0) { return i; } } } } 但是有没有办法做到这一点,没有繁忙的循环? 也许除了应该使用的信号量外,还有一些IPC技术? 谢谢

在mq_send中发送结构体

我使用的是POSIX IPC,根据文档 – http://man7.org/linux/man-pages/man3/mq_send.3.html mq_send()方法只发送char *数据,而mq_recv()只接收字符数据。 但是,我想发送一个自定义结构到我的消息队列,并在接收端,我想要的结构。 示例结构: struc Req { pid_t pid; char data[4096]; } 那么,有没有人知道如何在C lang中做到这一点?

用O_WRONLY挂在open()上的C ++ Linux命名pipe道

这是我简单的代码,打开一个命名pipe道,写一个string,然后closurespipe道。 pipe道是在另一个函数中创build的,如下所述。 char * ipcnm = "./jobqueue"; std::cout << "opening job queue" << std::endl; //ensure the jobqueue is opened if ((jobq = open(ipcnm, O_WRONLY)) < 0) { perror("open"); exit(-1); } std::cout << "queue opened" << std::endl; // record the number of bytes written to the queue size_t written = write(jobq, ptr, size*nmemb); // close fifo […]

处理mq_unlink之后的mq_open失败

我正在使用Posix消息队列进行通信,在Suse Linux上编写客户机/服务器进程,类似于“ 如何在基于Linux的系统上的ac程序中使用mqueue? ”中的接受答案。 当服务器死亡,它做一个mq_close和mq_unlink 。 但是,客户端没有得到这个通知,所以即使队列已经被解除链接 ,在客户端的mq_send的调用也将继续工作。 问题是,当服务器重新启动时,它会尝试使用O_CREAT创build一个mq_open的队列,但由于客户端仍然有一个打开的fd,所以会失败。 所以,即使/ dev / mqueue中的文件名不存在,服务器也不能创build一个,直到客户端退出并closures其文件描述符。 我只是想确定我正确地理解了这一点:如果我想让服务器closures,取消链接,然后重新打开mqueue(例如:具有不同的属性),是否肯定需要客户端退出或closures它的fd? 这与使用普通文件的方式有很大不同:我可以删除另一个进程正在使用的文件,文件系统可能会将其重命名为“.nfsXXX”,他们可以继续使用它,但是我可以创build一个新文件立即使用该名称的文件。 我第一次尝试解决这个问题只是为了不退出服务器退出时的mqueue – 如果我想允许服务器重新启动,而客户端不需要重新启动,那么我想我不应该取消链接队列(因为服务器知道客户端可能仍在使用mqueue,不应该取消链接)。 我最想要发生的事情是新的mq_open在服务器上成功,而下一个mq_send在客户端失败。 有一个简单的方法来模拟这个? 发生在我身上的方式是: 在每个mq_send ( yuck !)之前对“/ dev / mqueue / queueName”做一个fstat(或者其他),如果这个名字不存在(当服务器试图在一个循环中重新创build它),closuresfd,如果客户端当前被阻塞在mq_send上因为队列已满而无法正常工作。 在客户端有一个单独的套接字,当服务器希望客户端closures它们的mqueue(可能是客户端中的一个单独的线程来监视该套接字)时,服务器会向其发送消息。 让服务器杀死客户端。

如何附加到现有的共享内存段

我遇到了共享内存的问题。 我有一个创build和写入共享内存段的过程就好了。 但是我无法获得第二个过程来附加相同的现有细分。 我的第二个进程可以创build一个新的共享段,如果我使用IPC_CREATE标志,但我需要附加到由第一个进程创build的现有共享段。 这是我在第二个过程中的代码: int nSharedMemoryID = 10; key_t tKey = ftok("/dev/null", nSharedMemoryID); if (tKey == -1) { std::cerr << "ERROR: ftok(id: " << nSharedMemoryID << ") failed, " << strerror(errno) << std::endl; exit(3); } std::cout << "ftok() successful " << std::endl; size_t nSharedMemorySize = 10000; int id = shmget(tKey, nSharedMemorySize, S_IRUSR | S_IWUSR […]

pipe道vs味精队列

消息队列和Linux中的pipe道有什么区别?

一对多的IPC

我正在寻找一个ipc机制,这将允许从一个进程的数据更新的高吞吐量到许多(数千)。 “服务器”进程将负责高频更新数据结构。 更新后,我想通知“客户”进程的更新,并允许这些进程读取新的数据。 在Linux或FreeBSD环境下,这将是一个好方法吗?

UNIX / Linux IPC:从pipe道读取。 如何知道运行时的数据长度?

我有一个subprocess生成一些可变长度的输出,然后使用半双工pipe道将其发送给父进程。 在父,如何使用read()函数? 由于每次数据可以有不同的长度,我怎么能在运行时知道数据的大小来做缓冲区的任何malloc()? fstat()函数可以在pipe道文件描述符上使用吗? 我知道read()函数将读取指定数量的字节,但如果在请求的字节被读取之前到达文件结尾(而不是EOF字符),将返回0。 我专门运行一个2.6.27-9内核的Ubuntu GNU / Linux。 理查德·史蒂文森在UNIX环境下的高级编程中的所有例子都指定了写入pipe道时的数据长度,或者依赖于fgets()stdio.h函数。 由于我关心速度,我想尽可能远离使用stdio.h。 这将有必要共享内存更快? 谢谢,德鲁夫