Articles of ipc

在C ++代码中使用哪个命令来执行程序?

问候, C ++和Linux新手。 我正在寻找一个命令,我用它来执行3个可执行程序(exe / bin)在我的源代码,这是我想要做的: 1.知道进程是否成功执行(返回值) 2.了解进程ID 3.杀死一个进程 我试过系统(),但它不会返回错误和没有PID,也不安全。 我有一个快看fork() – exec()但是有可能没有父子关系? 另外,我看着手册页,但我不明白:( 请告诉我,我将使用哪个命令。 先谢谢你!

在C / C ++中通过stdin / stdout执行linux程序并与之通信的最简单的方法

我有我不能修改程序,我需要执行它,写一些数据到它的标准input,并从程序化的方式,自动获得答案。 什么是最简单的方法来做到这一点? 我猜想像这个伪C代码 char input_data_buffer[] = "calculate 2 + 2\nsay 'hello world!'"; char output_data_buffer[MAX_BUF]; IPCStream ipcs = executeIPC("./myprogram", "rw"); ipcs.write(input_data_buffer); ipcs.read(output_data_buffer); … PS:我想到popen,但是AFAIK在linux中只有单向pipe道 编辑: 据推测,这将是一个单方面的消息通信。 首先父节点发送input到subprocessstdin,然后子节点向stdout提供输出并退出,同时父节点读取它的stdout。 关于通讯终止:我想在孩subprocess退出的时候会把EOF终止符发送到stdout,所以父母会确切地知道孩子是否做了,另一方面保证父母知道什么样的input孩子期望。 一般这个程序(家长) – 一个学生的解决schemetesting人员。 它从CLI获取两个其他可执行文件的path,第一个是学生的程序testing,第二个是标准的正确工作的程序,这解决了同样的问题。 学生程序的input/输出是严格规定的,所以testing者运行这两个程序并比较输出的大量随机input,所有的不匹配都会被报告。 input/输出最大尺寸估计为几百千字节 例子:..实现插入sortingalgorithm…第一行有序列长度…第二行有序列号a_i其中| a_i | 输出第一行必须是所有元素的总和,第二行必须是sorting顺序。 input: 5 1 3 4 6 2 预期产出: 16 1 2 3 4 6

POSIX消息队列 – 重启后它是否仍然存在?

在linux上,写了一个简单的程序来创build一个POSIX消息队列,并发送一个消息给它,在进程终止后,似乎消息仍然存在。 问题是: msg在重启之后还在吗? 如果它存在,那么它在磁盘上,如果它将msg存储在磁盘而不是内存上,它是如何保证性能的。

睡觉时,按住boost :: interprocess :: scoped_lock导致它永远不会被释放

我正在Linux上使用boost::interprocess::shared_memory_object按照参考 (匿名互斥示例)在IPC上进行IPC。 有一个服务器进程,它创buildshared_memory_object并写入它,同时持有包含在scoped_lock中的scoped_lock ; 和一个客户端进程打印任何其他人写的 – 在这种情况下,它是一个int 。 我遇到了一个问题:如果服务器在睡眠的同时持有互斥锁,客户端进程将永远无法获取并永远等待。 越野车服务器循环: using namespace boost::interprocess; int n = 0; while (1) { std::cerr << "acquiring mutex… "; { // "data" is a struct on the shared mem. and contains a mutex and an int scoped_lock<interprocess_mutex> lock(data->mutex); data->a = n++; std::cerr << n << std::endl; sleep(1); } // […]

杀死运行系统shell命令的subprocess

在我的父进程中,我创build了一个执行系统的subprocess(“find / -print”)。 从父内部,当我试图用kill(childProcPID,SIGTERM)杀死这个subprocess时,它不会立即终止。 系统命令继续在控制台上打印输出。 以下是示例代码: int main(void) { pid_t childProc = fork(); switch (childProc) { case -1: perror("fork() error"); exit(EXIT_FAILURE); case 0: system("find / -print"); printf("if I use kill(pid, SIGTERM) control doesnt reach here"); exit(EXIT_SUCCESS); default: ; int i = 500000; //No a great way to put sleep //but its just temp while (i […]

分叉时,是否需要“其他”块?

if (pid==0) { //child } else { //parent … } 为什么“其他”部分是必要的? 是不是暗示我们在家长?

如果父母没有调用wait(),那么相同父项的两个子项不使用pipe道进行通信

请参阅下面的代码: #include<stdio.h> main(){ int pid, fds[2], pid1; char buf[200]; pipe(fds); pid = fork(); if(pid==0) { close(fds[0]); scanf("%s", &buf); write(fds[1], buf, sizeof(buf)+1); } else { pid1 = fork(); if(pid1==0) { close(fds[1]); read(fds[0], buf, sizeof(buf)+1); printf("%s\n", buf); } else { Line1: wait(); } } } 如果我不评论Line1,它工作正常。 请看下面: hduser@pc4:~/codes/c/os$ ./a.out hello //*Entry from keyboard* hello //Output hduser@pc4:~/codes/c/os$ 但是,如果我注释掉Line1,两个subprocess不通信: […]

简单的Linux IPC问题

目前我有一个客户端进程和一个服务器进程。 客户端进程需要经常联系服务器进程来交换数据,但是需要知道服务器的进程号。 客户应该如何知道如何做到这一点? 我想避免重复的硬盘访问。 这个应用程序只在linux下运行。 目前服务器设置一个locking文件,它的pid或RAM磁盘。 客户端检查文件。 我还能如何有效地完成这个事务,以便服务器可以发送一个信号给客户端? (注意:客户端是PHP,服务器是c)

业务统计收集系统的build议

我有一个运行在Linux上的Web服务,它由一些依靠C ++程序来完成繁重任务的PHP代码组成。 PHP和C ++代码每个事务运行一次,然后终止。 它不是(还)坚持不懈(即守护进程),是的,我知道它会更有效率。 随着交易完成,各种信息积累(我统称为“统计”或“统计”)。 这些信息包括分析信息,如交易各种子任务的执行时间,以及逻辑信息,如交易的性质和结果。 这些指标是高度专用的,所以一般的监测和测量工具在这里可能是不合适的。 我想开始logging这些信息,但是我不想logging它来干扰性能。 具体来说,我假设我不想承担数据库连接的代价和每个事务的拆卸,或者在等待对文件的写入访问时阻塞。 如果可能的话,我想在许多交易中分摊这笔费用。 我不关心统计logging是否在C ++或PHP代码中完成。 我想知道如果一个好的方法是作为一个守护进程在服务器本身上运行,并接收统计数据包(可能是JSON或protobufs或其他打包格式)。 交付渠道将是一个sockets或一个pipe道或其他types的有效的IPC。 这些数据包将被收集成捆,并定期存储到数据库或以其他方式移出服务器。 效率是通过最小化每个数据包的处理,并分摊许多数据包的昂贵操作来实现的。 我的第一个问题:我上面概述的方法是否可行和最佳? 我应该考虑其他devise吗? 我的第二个问题:这感觉应该是已经存在的东西。 是否有任何Linux系统的通用工具接收,收集和转发统计数据包?

用System V信号量实现条件variables

我正在尝试使用System V信号量来实现条件variables。 为了简单起见,我们假设一次只有一个进程可以等待一个条件variables。 这个概念看起来很简单,所以只要看看我的互斥和条件variables包装的实现,其中: 互斥是一个二进制信号,1代表自由,0代表locking。 条件variables是一个二进制信号量,1表示有人在等待,否则为0。 这里是: //Sets value of 'num' semaphore from 'semid' semaphore set to be 'val'. // Returns 0 on success and -1 on failure. int set_value(int semid, int num, int val) { union semun setval_semun; setval_semun.val = val; return semctl(semid, num, SETVAL, setval_semun); } // Returns the value of semaphore 'num' […]