我有一个CLI,其中一个命令正在进入Linux bash shell。 这是使用fork&execv的代码: if ((pid = fork()) < 0) { syslog_debug(LOG_ERR, "Could not fork"); } if (pid == 0) { /* In child, open the child's side of the tty. */ int i; for(i = 0; i <= maxfd; i++) { close(i); } /* make new process group */ setsid(); if ((fd[0] = open(tty_name, […]
我正在写一个程序,使用共享内存和信号灯为ipc。 有一个主要的服务器进程创build共享内存和信号量。 任何数量的客户端进程都可以附加到共享内存,并在允许的情况下读取和写入。 信号量提供阻止机制来控制读取和写入。 一切工作正常,除非我试图终止客户端。 访问共享内存的信号量块是在一个线程和进程终止我无法释放信号量块,以便线程正确退出。 我将如何去做这件事? 这是用于Linux的。 具体来说,有一个SHM和两个SEMS。 第一个sem块写入,第二个块读取。 当客户端有东西要写的时候,它等待写入sem为0,然后将其设置为1,写入,然后将读取的sem设置为0,释放等待服务器以读取客户端写入的内容。 一旦读取服务器将写入sem设置回0,下一个客户端就可以写入。 它挂在一个semop调用,当读取sem时,释放0.这个semop调用是在一个线程中,我需要弄清楚如何正确退出该线程,然后让主线程终止。 这是一个我想要做的事情,但不工作的例子(睡眠假装是挂着的semop调用): #include <stdlib.h> #include <errno.h> #include <pthread.h> #include <signal.h> #include <stdio.h> #include <unistd.h> void termination_handler (int signum) { printf( "Got Signal\n" ); } void *threadfunc( void *parm ) { struct sigaction action; action.sa_handler = termination_handler; sigemptyset( &action.sa_mask ); action.sa_flags = 0; sigaction( […]
我们来看下面的例子。 我有一个父进程,创build一个pipe道,产生一个孩子,并阅读孩子的标准输出使用这个pipe道。 在某些时候,父进程不再对子的输出感兴趣,并closurespipe道的读端。 显然,如果孩子一直在写,这是否会导致孩subprocess收到一个SIGPIPE信号。 问题:有没有办法将孩子的输出redirect到/dev/null以便它仍然继续运行并生成输出,但父进程可以继续执行其他操作并稍后调用孩子的waitpid ? 请注意,将孩子的SIGPIPE处理程序设置为SIG_IGN不是一个选项,因为我无法控制孩子的信号处理程序。
让我们使用像shmget()这样的POSIX共享内存 – 一个通用的调用来协调进程间通信。 如何调用shmget()和协调共享内存段上的通信与Linux在单个进程中如何实现共享内存和线程间同步的方式不同。 其中一个更轻?
我有一个书面的Linux设备(实现为一个接口)和一个Perl脚本,我需要这两个在执行(Perl到设备)之间进行通信。 我曾经想过写一个文件并读取它。 但我认为这不是一个理想的。 谁能指出我更好的解决办法。
我使用的是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中做到这一点?
这是我简单的代码,打开一个命名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 […]
我正在使用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 […]
消息队列和Linux中的pipe道有什么区别?