Tag: ipc

C使用共享内存传递void指针

我需要将void处理程序传递给另一个应用程序,为了复制场景我使用共享内存创建了一个小程序并尝试将void指针传递给另一个应用程序并打印该值,我可以在另一个应用程序中获取void指针地址,但是当我尝试取消引用指针第二个应用程序崩溃时。 以下是示例应用程序wire.c。 #include #include #include int main() { key_t key=1235; int shm_id; void *shm; void *vPtr; shm_id = shmget(key,10,IPC_CREAT | 0666); shm = shmat(shm_id,NULL,NULL); sprintf(shm,”%d”,&vPtr); printf(“Address is %p, Value is %d \n”, (void *)&vPtr, * (int *)vPtr); return; } 这是read.c #include #include #include #include int main() { key_t key=1235; int shm_id; void *shm; void *p […]

如何在C和Python之间处理IPC?

我有一个带有两个进程的应用程序,一个在C中,一个在Python中。 C进程是完成所有繁重工作的地方,而Python进程则处理用户界面。 C程序每秒写入4次大型缓冲区,Python进程读取此数据。 到目前为止,AMQP已经完成了与Python进程的通信。 我更愿意在两个进程之间设置一些内存共享,以减少开销并提高性能。 我有什么选择? 理想情况下,我只是简单地让Python进程直接读取物理内存(最好是从内存中读取而不是从磁盘中读取),然后使用信号量或类似的东西来处理竞争条件。 然而,这是我没什么经验的东西,所以我很感激我能得到的任何帮助。 我正在使用Linux btw。

unlink()后从FIFO读取

我创建了一个FIFO,写入并取消链接。 令我惊讶的是,我能够在取消关联后从fifo读取数据,为什么会这样? #include #include #include #include #include #include #define MAX_BUF 256 int main() { int fd; char * myfifo = “/tmp/myfifo”; /* create the FIFO (named pipe) */ mkfifo(myfifo, 0666); int pid = fork(); if (pid != 0) { /* write “Hi” to the FIFO */ fd = open(myfifo, O_WRONLY); write(fd, “Hi”, sizeof(“Hi”)); close(fd); /* […]

在Linux中无法阻止从命名管道(FIFO)读取

我似乎无法完成这项工作,这很奇怪。 这是我的架构:我有一个命名管道,它将在一个始终运行的 root读取器进程和多个应用程序编写器进程之间进行通信。 当编写器nonblocking blocking时,读取器进程必须被blocking 。 因此,这是我在读者进程中所做的,它将以root权限运行。 reader.c #define PIPE_ID “/dev/shm/mypipe” // This function configures named pipe void configure_pipe() { // So that others can write umask(0000); if(mkfifo(PIPE_ID, S_IWUSR | S_IRUSR | S_IRGRP | S_IROTH | S_IWGRP | S_IWOTH) != 0) { perror(“mkfifo error\n”); } } 在主要function: int main (int argc, char **argv) { int […]

如何从子进程到父进程返回值?

我应该将斐波纳契系列的前12个项的总和从子进程返回到父进程,但是有377 ,父进程得到30976 。 #include #include #include #include #include int main(int argc, char *argv[]) { pid_t childpid; int i, fib_sum=0, fib1=1, fib2=1, temp, status; childpid=fork(); if(childpid!=0) { wait(&status); fprintf(stderr, “%d\n”, status); } else { for(i=1; i<=12; i++) { temp=fib1; fib_sum=fib1+fib2; fib1=fib_sum; fib2=temp; } fprintf(stderr, "%d\n", fib_sum); return fib_sum; } } 我究竟做错了什么?

共享内存和IPC

我正在阅读有关共享内存的教程,并发现以下语句:“如果进程希望通知另一个进程已将新数据插入共享内存,则必须使用信号,消息队列,管道,套接字或其他IPC的类型。“ 那么使用共享内存和其他类型的IPC仅用于通知而不是使用不需要任何其他IPC类型的IPC(如消息队列和套接字)的主要优点是什么?

C – fork()和共享内存

我需要我的父进程和子进程才能读取和写入相同的变量(类型为int),因此它在两个进程之间是“全局的”。 我假设这会使用某种跨进程通信,并且在一个进程上有一个变量正在更新。 我做了一个快速谷歌和IPC和各种技术出现,但我不知道哪个是最适合我的情况。 那么什么技术是最好的,你可以提供一个链接到它的noobs教程。 谢谢。

(How)我可以从套接字文件描述符中确定套接字系列

我正在编写一个包含IPC函数的API,这些函数将数据发送到另一个可能是本地或另一个主机的进程。 我真的很喜欢发送function如下: int mySendFunc(myDataThing_t* thing, int sd); 没有调用者必须知道 – 在mySendFunc()调用的直接上下文中 – sd是否导致本地或远程进程。 在我看来,如果我能这样: switch (socketFamily(sd)) { case AF_UNIX: case AF_LOCAL: // Send without byteswapping break; default: // Use htons() and htonl() on multi-byte values break; } 有人建议我可以实现socketFamily(): unsigned short socketFamily(int sd) { struct sockaddr sa; size_t len; getsockname(sd, &sa, &len); return sa.sa_family; } 但是我有点担心getsockname()的效率,并且想知道我每次发送都能负担得起。

为什么管道在Windows / unix / linux中被认为是危险的?

为什么管道被认为是危险的? 可以采取哪些措施来避免这些安全问题? 我最感兴趣的是Windows,但如果您有其他操作系统信息,请提供。

IPC vs domain sock vs命名管道

什么是IPC和Unix域套接字和命名管道之间的差异? 我从各种书籍中得到了模糊的定义,但无法明确应该在哪里使用哪一本。