Articles of pipe理员

正确的fork()和pipe()用于具有多个子项的单个父项。 我该如何解决这个问题?

所以,我以前的post被标记为脱离主题,太模糊,并要求有用的代码的意见和build议。 它做了这些事情,所以我重新张贴作为我正在工作的代码的问题。 感谢上一篇文章中的内容,通过回顾你们所说的话,我能够把我在这里所得到的结果分解开来。 这里的重点是父/子关系和使用fork()和pipe()来获得所需的影响。 该项目是一个POSIX纸牌游戏,父母(经销商)从父母手中分出5个孩子(玩家)和自己的pipe道。 父母向玩家发牌(至less5卡),直到一个玩家拥有3个(不丢弃)。 获胜的孩子将获胜的手和EOF(退出(0))传送给父母以宣告胜利。 这会触发父母打印胜出的玩家,并将EOF传送给其余的孩子将其closures(退出(1))。 父母然后closures。 如果父母没有获胜者到达甲板的末端,则将EOF传递给孩子,等待他们退出(1)…然后closures。 我所面临的主要问题是孩子的程序如何分别读取每张卡片,而不是一遍又一遍地从pipe道读取相同的值。 我想我缺less一种方法来同步父母写入pipe道和孩子从pipe道读取。 我对这个家伙是全新的,所以任何帮助都非常感激。 非常感谢。 代码更新:(编译很多问题)完成和编译,但我显然有pipe道和通过它们传递数据的麻烦。 没有玩游戏,没有读取或写入pipe道,离开僵尸进程,这里是错误的。 我很感激任何投入在我的混乱。 大声笑 这是我运行程序(play.c)时的输出: os@debian:~/Documents/cpsc351/projects/assn2$ gcc -o play play.c os@debian:~/Documents/cpsc351/projects/assn2$ ./play Pipe Success…toChild 1 created. Pipe Success…toParent 1 created. Pipe Success…toChild 2 created. Pipe Success…toParent 2 created. Pipe Success…toChild 3 created. Pipe Success…toParent 3 created. Pipe Success…toChild 4 created. Pipe […]

在mono / Linux下从命名pipe道读/写

我想从Linux下的命名pipe道/ FIFo队列中读/写。 我已经尝试了System.IO中的标准类StreamWriter和其他类,但是因为使用了seek而失败了。 有没有人使用Mono写入/读取命名pipe道? 我正在努力阅读和写作 – 但不是同一时间…

Linux是否提供低于堆栈底端的保证无法访问的内存区域?

Linux是否提供低于低端堆栈端的无法访问的内存区域,并具有保证的最小大小? 如果这种保证的最小尺寸存在,那是什么? 或换句话说,我什么时候该开始担心alloca()或者让我指向有效的非堆栈内存?

malloc像使用自定义堆的函数

如果我想用自定义的预分配堆构buildmalloc类似的function,C中最好的方法是什么? 我的具体问题是,我有一个已经被放置到我的地址空间的mmap-able(类似于内存)的设备,但是我需要获得一个更灵活的方式来使用这个内存来存储将被分配和释放的对象。 我知道malloc,free和其他类似的函数是用来在堆上执行这种分配的,但是有什么办法可以使用这种函数提供的逻辑来实现它的dynamic行为,同时提供我自己的地址空间来操作有问题的堆?

在Linux中以编程方式设置自定义文件夹/目录图标

在Linux中,是否可以为桌面/文件pipe理器中显示的文件夹/目录设置自定义图标? 例如,对于Windows资源pipe理器,可以在文件夹的desktop.ini文件中设置自定义图标? 如果是这样,是否有一个共同的机制或API函数来做到这一点(这可能在发行版/桌面/文件pipe理器中很常见)? 我想从一个独立的控制台模式程序C ++或者可能使用桌面API的KDE,GNOME等。(也是Unix CDE和OSX)

如果一个孩子的过程在阅读的时候不会从写作中结束,会发生什么?

给出以下代码: int main(int argc, char *argv[]) { int pipefd[2]; pid_t cpid; char buf; if (argc != 2) { fprintf(stderr, "Usage: %s \n", argv[0]); exit(EXIT_FAILURE); } if (pipe(pipefd) == -1) { perror("pipe"); exit(EXIT_FAILURE); } cpid = fork(); if (cpid == -1) { perror("fork"); exit(EXIT_FAILURE); } if (cpid == 0) { /* Child reads from pipe */ […]

最后一个分叉的孩子不会死

我有两个主要的过程分叉,从而创造两个孩子。 这两个孩子是这样互相配pipe的: ls | more 现在的问题是,第二个孩子永远不会死亡。 这是为什么? 什么时候pipe道中的最后一个孩子真的死了? 除去一个wait()调用显示ls | more的预期结果 ls | more但给出了一些更奇怪的行为(卡住terminal等)。 这是我的代码: int main(){ printf("[%d] main\n", getpid()); int pip[2], i; pipe(pip); /* CHILDREN*/ for (i=0; i<2; i++){ if (fork()==0){ /* First child */ if (i==0){ printf("[%d] child1\n", getpid()); close(1); dup(pip[1]); close(pip[0]); execlp("ls", "ls", NULL);} /* Second child */ if (i==1){ printf("[%d] child2\n", […]

Python和FIFO

我试图了解在Linux下使用Python的FIFO,我发现了一个奇怪的行为,我不明白。 以下是fifoserver.py import sys import time def readline(f): s = f.readline() while s == "": time.sleep(0.0001) s = f.readline() return s while True: f = open(sys.argv[1], "r") x = float(readline(f)) g = open(sys.argv[2], "w") g.write(str(x**2) + "\n") g.close() f.close() sys.stdout.write("Processed " + repr(x) + "\n") 这是fifoclient.py import sys import time def readline(f): s = f.readline() […]

如何使用Linux的splice()函数将文件复制到另一个文件?

这里是关于splice()的另一个问题。 我希望使用它来复制文件,并试图使用拼接的维基百科页面上的例子一样的pipe道连接的两个拼接调用。 我写了一个简单的testing用例,它只尝试从一个文件读取第一个32K字节,并将它们写入另一个文件: #define _GNU_SOURCE #include <fcntl.h> #include <stdio.h> #include <unistd.h> #include <errno.h> #include <string.h> int main(int argc, char **argv) { int pipefd[2]; int result; FILE *in_file; FILE *out_file; result = pipe(pipefd); in_file = fopen(argv[1], "rb"); out_file = fopen(argv[2], "wb"); result = splice(fileno(in_file), 0, pipefd[1], NULL, 32768, SPLICE_F_MORE | SPLICE_F_MOVE); printf("%d\n", result); result = splice(pipefd[0], […]

python Pipes的同步/asynchronous行为

在我的应用程序中,我使用多处理模块中的pipe道在python进程之间进行通信。 最近我观察到一个奇怪的行为取决于我通过他们发送的数据的大小。 根据python文档,这些pipe道是基于连接的,并且应该以asynchronous的方式运行,但是有时他们在发送时会卡住。 如果我在每个连接中启用全双工,一切工作正常,即使我没有使用连接发送和收听。 任何人都可以解释此行为? 100浮点数,全双工禁用 代码工作,利用asynchronous。 100个浮点,全双工启用 该示例正常工作正常。 10000浮点数,全双工禁用 尽pipe数据较小,但执行被永久封锁。 10000浮点,全双工启用 再次罚款。 代码(这不是我的生产代码,它只是说明了我的意思): from collections import deque from multiprocessing import Process, Pipe from numpy.random import randn from os import getpid PROC_NR = 4 DATA_POINTS = 100 # DATA_POINTS = 10000 def arg_passer(pipe_in, pipe_out, list_): my_pid = getpid() print "{}: Before send".format(my_pid) pipe_out.send(list_) print "{}: […]