Tag: ipc

什么是Linux中C和PHP之间良好的进程间通信方法

我实际上不知道我是否在问一个正确的问题。 让我先描述一下我的问题。 最终用户 Web服务器(通过PHP)内部进程(通过C或C ++)外部硬件 1应该像ajax请求。 2应该是进程间通信。 3应该是uart RS232通信。 最终用户将请求更改硬件上的某些设置,然后请求将传播到硬件。 硬件回复成功或失败,然后结果将传播回用户。 硬件回复延迟可以在1秒内。 因此,当Web服务器收到来自最终用户的ajax请求时,它将保存并向c / c ++程序发送IPC请求。 c / c ++程序将通过UART发送并保持并等待硬件回复。 对于UART部分,有异步uart模型,因此c / c ++程序不需要持续等待UART。 Web服务器将等待c / c ++程序返回(再次通过IPC),然后将结果转发回最终用户。 由于webserver没有内存,所以不能有任何异步的东西(据我所知)。 我可以想到一个通过文件或数据库的简单方法。 Web服务器不断读取文件或数据库以进行回复。 但我真的不认为这是一个好方法,因为它会导致服务器CPU周期的浪费。 如果我可以容忍一些延迟,那么这取决于,但我认为用户端的几秒延迟对他们来说是好的。 你能给我一些很好的IPC方法来实现我的目的吗? 而且,如果您认为整个过程或任何特定链接(包括链接1,2和3)有更好的解决方案(比我上面的描述),请同时分享您的2cent。 希望我能清楚地问我的问题。 谢谢。

openMPI在服务器集群上运行期间无限期等待?

我已成功在服务器和计算机之间设置密码减去ssh。 有一个简单的openMPI程序在单台计算机上运行良好。 但是,不幸的是,当我在群集上尝试这个时,我都没有得到密码提示(因为我已经设置了ssh授权),也没有执行正在向前发展。 Hostfile看起来像这样, # The Hostfile for Open MPI # The master node, ‘slots=8’ is used because it has 8 cores localhost slots=8 # The following slave nodes are single processor machines: gautam@pcys13.grm.polymtl.ca slots=8 gautam@srvgrm04 slots=160 我在群集上运行hello world MPI程序, int main(int argc, char *argv[]) { int numprocs, rank, namelen; char processor_name[MPI_MAX_PROCESSOR_NAME]; double t; MPI_Init(&argc, […]

在C中使用管道用于父子IPC会使程序阻塞

我正在编写一个服务器,当fork接受套接字连接时,fork()关闭子进程。 当孩子与客户沟通时,它必须将一些信息发送回父母。 我正在使用管道来实现这一目标。 问题是当我尝试做父子IPC时,父母在读取孩子的输入时会阻塞。 这意味着,即使孩子们同时运行,他们也只能一次一个地处理,因为他们都在等待父母。 我的代码看起来像这样(为简洁起见,删除了错误检查): /* loop: wait for clients to connect */ for(;;) { pipe(write_to_parent); /* create pipe between parent and child */ pipe(write_to_child); /* create pipe between parent and child */ newsockfd = accept(…); pid = fork(); if (pid == 0) { /* child process */ close(write_to_parent[0]); close(write_to_child[1]); printf(“Connected!\n”); while ((rc = […]

Select()仍然阻止从管道读取

我的应用程序分叉一个孩子,孩子执行一个新的程序,父母写入它,然后在孩子完成一些工作后从孩子读回来。 当监视管道的读取结束时,程序仍然等待孩子。 我目前没有写回父母,所以它故意阻止。 下面是代码(write_to()函数关闭函数中管道的未使用部分): pid_t leaf_proc; int rv = 0; int w_pfd[2]; int r_pfd[2]; if(pipe(w_pfd) == -1 || pipe(r_pfd) == -1){ printf(“Failed to pipe. Goodbye.\n”); exit(0); } if((leaf_proc = fork()) < 0){ printf("Error: %s\n",strerror(errno)); exit(0); }else if(leaf_proc == 0){ /***Child to be execl()'d***/ rv = execl("Some program"); if(rv < 0){ printf("Error: %s\n",strerror(errno)); exit(0); } }else{ […]

使用共享内存和矩阵

我想在共享内存段中创建一个矩阵。 在我的第二个程序中,我可以读取tailleX , tailleY但我的矩阵的值只有’0’。 我在我的函数initialiserSegMem创建我的矩阵,值很好……就像我总是指针有问题… 我的struct mem_share: typedef struct mem_partage{ int** carte; int tailleY; int tailleX; }mem_share; mem_share initialiserDonneeMem(grille* g){ mem_share mem_share_carte; int x = g->tailleX; int y = g->tailleY; int i,j; mem_share_carte.carte = malloc(y*sizeof(int*)); for(i=0;i carte; mem_share_carte.tailleY = y; mem_share_carte.tailleX = x; return mem_share_carte; } void initialiserSegMem(mem_share *mem_share_carte){ int shmid,id_memoire,i,j; int test = 100; […]

使用fork()和IPC在C中进行最有效的矩阵乘法

我需要使用多个进程在C中实现并发矩阵乘法。 我理解,因为每个进程都有自己的私有地址空间,我将不得不使用某种forms的进程间通信(IPC)。 我做了一些环顾四周,找不到许多不使用线程的实现。 我想知道是否有人知道最好的方法,使用共享内存,消息传递或管道? 我不是要求解决方案,而是,如果有人知道,这些方法中的哪一种在矩阵乘法中会更有效。 或者,如果有一个通用的标准方法来执行多个流程?

编写将函数返回给Fortran的C函数

最后,我试图编写一个IPC计算器,利用Fortran计算和C来传递两个Fortran程序之间的数据。 当我完成它将希望看起来像: Fortran program to pass input -> Client written in C -> Server written in C -> Fortran program to calculate input and pass ans back C客户端/服务器部分已完成,但目前我仍然试图编写一个在Fortran程序中输入的程序,将其传递给计算答案的C程序。 但是,我看到了一些奇怪的行为。 Fortran计划 program calculator !implicit none ! type declaration statements integer x x = 1 ! executable statements x = calc(1,1) print *, x end program calculator […]

msgrcv – SA_RESTART标志不起作用

我的代码使用IPC队列在线程之间进行通信有问题。 我需要安全地处理SIGINT – 让程序在关闭之前出现SIGINT时完成所有活动线程。 虽然,我有找到解决方案的严重问题,因为即使对带有标志SA_RESTART的SIGINT进行sigaction,msgrcv函数也会出现EINTR错误。 我的问题是 – 有没有办法避免使用msgrcv函数的EINTR,而不是在某些“if”中指定错误条件,例如: if (msgrcv<0){ if (errno == EINTR){ errno = 0; } } 这是我的程序的简化版本,用于演示问题: #include #include #include #include #define IPC_KEY 11000 #define BUF_SIZE 128 //structure of IPC message typedef struct msgbuf{ long mtype; char mtext[BUF_SIZE]; } message_buf; void handle_sigint(int sig){ signal(SIGINT,SIG_IGN); /* some operation to handle sigint, here it’s […]

shmget无法正常工作

#include #include #include #include #include #include #include int main() { int i=0; int shmid; int *mem=(int*)malloc(10*sizeof(int)); key_t key; key=1234; pid_t pid; shmid=shmget(1234,sizeof(*mem), IPC_CREAT|0666); if(shmid==-1) { printf(“shmget error\n”); return -1; } mem=shmat(shmid, NULL, 0); if(mem==(int*)-1) { printf(“shmat error\n”); return -1; } for(;i<10;i++) { *(mem+i)=0; } pid=fork(); if(pid<0) { fprintf(stderr,"Fork Failed"); printf("array : "); } else if […]

如何在ListView控件中找到项?

我的列表视图包含3列名称,地址和电话号码。 我想检索特定名称的索引。 我正在使用ListView_FindItem宏来查找索引号,但是当我的代码到达此行时,它会使程序崩溃。 它只是说Payroll已经停止工作了。 Windows可以在线检查问题的解决方案。 我确定我已经通过了ListView_FindItem宏的正确句柄,但我不确定LVFINDINFO结构。 这是我的代码 WCHAR szProcess[80] = {0}; LVFINDINFO item = {LVFI_STRING, (LPCTSTR) szProcess}; //code to find parent handles … //code to find index index = ListView_FindItem(hwndListView, -1, &item); 我不确定LVFI_STRING标志,我甚至尝试将一个常量LVFINDINFO结构传递给ListView_FindItem宏,但我的程序仍然崩溃。 注意:上述代码不是工资单应用程序的一部分。 我的意思是说工资单应用程序有listview,我正在尝试从其他应用程序中搜索该项目。 有人可以指出我正确的方向吗? 谢谢。