Articles of pipe理员

使用分叉的variables的内存位置

我很难理解这个程序的输出。 使用fork() ,variablesinmem的内存位置显示相同。 有人可以解释这个! 谢谢你 #include <stdio.h> #include <stdlib.h> int main(void) { int inmem = 9; int pid = fork(); if(!pid) { printf("child inmem %d %p\n", inmem,&inmem); inmem = 8; printf("child inmem %d %p\n", inmem, &inmem); } else { printf("parent inmem %d %p\n", inmem, &inmem); inmem = 5; printf("parent inmem %d %p\n", inmem, &inmem); } […]

与subprocess标准输出/标准input进行通信

我正在尝试与一个进程进行通信(它本身写入到标准input和标准输出与用户在一个terminal进行交互),并读取它的标准input,并写入它的标准输出在C. 因此,我尝试以编程方式replaceshell用户。 一个美好的例子:想象一下,我想用C中的VIM出于某种原因。 然后我还需要编写命令(stdout)并从编辑器(stdin)读取内容。 起初,我认为这可能是一个微不足道的任务,但似乎没有标准的方法。 int system(const char *command); 只是执行一个命令,并将命令stdin / stdout设置为调用进程的一个。 因为这无处可去,所以我查看了FILE *popen(const char *command, const char *type); 但手册页指出: 由于pipe道的定义是单向的,所以types参数可以只指定读或写,而不是两者; 所得到的stream是相应的只读或只写。 其含义是: popen()的返回值在所有方面都是标准的I / Ostream,除了它必须用pclose()而不是fclose(3)来closures。 写入这样的stream写入命令的标准input; 该命令的标准输出 与调用popen()的进程 的标准输出 相同 ,除非这个命令本身被改变了。 相反, 从“popened”stream中读取命令的标准输出 , 命令的标准input与调用popen()的过程相同 。 因此,使用popen()并不是完全不可能的,但是在我看来,这是非常不雅观的,因为我将不得不parsing调用进程(称为popen()的代码)的stdout,以便parsing从被指挥的命令(当使用popen型'w'时)。 相反,当用'r'types调用popen时,我需要写入调用的进程stdin,以便将数据写入到被调用的命令中。 在这种情况下,我不清楚这两个进程是否在标准input接收相同的数据… 我只需要控制程序的stdin和stdout。 我的意思是不能有这样的function: stdin_of_process, stdout_of_process = real_popen("/path/to/bin", "rw") // write some data to the process stdin […]

bash标准输出不能被redirect到文件中

我正在阅读“高级bash脚本”,在第31章中有一个问题。 我想不明白。 tail -f /var/log/msg | grep 'error' >> logfile 为什么没有什么要输出到日志文件? 你能给我一个解释吗? 先谢谢你

几乎连续的v / s物理上连续的

几乎连续的记忆也总是物理上连续的? 如果不是,那么在物理上非连续的RAM块中分配和存储映射的内存如何? 详细的答复表示赞赏。

我如何循环pipe道中的数据?

我发现一些Perl中的进程可以通过pipe道进行通信的代码。 例: if ($pid = fork) { close $reader; print $writer "Parent Pid $$ is sending this\n"; close $writer; waitpid($pid,0); } else { close $writer; chomp($line = <$reader>); print "Child Pid $$ just read this: `$line'\n"; close $reader; exit; } 现在我有以下问题: 是否有可能让读者从pipe道中读取,然后阻塞,直到新的数据从pipe道中像循环一样来? 如果是,当父进程没有数据发送时,杀死subprocess的方式是什么? 每个程序有多less个打开的读/写pipe道是有限制的? 例如,如果我叉十进程,并有20个pipe道(10读/ 10写)这是一个坏主意? 如果问题太基本,我很抱歉,但我的经验是用另一种语言的线程。

C多个进程写入1个pipe道

您好Linux系统(Centos 6.5) 我创build一个pipe道,然后尝试分叉一些subprocess。 我想让subprocess写入同一个分支。 (我不关心同步)。 我发现只有第一个分支进程可以写入所有后续进程得到“错误的文件描述符”hibernate调用只用于debugging。 示例代码: #include <stdio.h> #include <unistd.h> #include <stdlib.h> #include <errno.h> #include <string.h> #include <err.h> int pipes[2]; #define FOREVER for(;;) int main(int argc, char *argv[]) { int rc; int k; int nbytes; char buffer[4096]; rc = pipe(pipes); if (rc <0) { perror(" Main error with pipes \n"); exit(2); } for (k […]

mmap():将旧内存重置为零非常驻状态

我在写一个内存分配例程,目前运行正常。 我用mmap()从4096字节的页面中获得操作系统的内存。 当我启动我的内存分配器时,我使用mmap()分配1g的虚拟地址空间,然后根据分配algorithm的具体情况,将其分配为hunk。 我觉得安全地分配1G内存,因为我知道mmap()实际上并没有把页面放到物理内存中,直到我真正写入它们。 现在,使用我的分配器的程序可能会突然出现,它需要大量的内存,在这种情况下,操作系统将不得不最终将整个1gig的页面放入物理RAM中。 麻烦的是,程序可能会进入一个hibernate状态,从而释放大部分的内存,然后使用最less的内存。 然而,我真正在我的分配器的MyFree()函数内部做的是翻转一些logging数据,这些logging数据标记着以前使用的gig是免费的,但是我知道这不会导致操作系统从物理内存中删除这些页面。 我不能使用像munmap()这样的东西来解决这个问题,因为分配algorithm的性质是这样的,它需要一个没有任何漏洞的连续的内存区域。 基本上我需要一种方法来告诉操作系统“听着,你可以把这些页面从物理内存中清除出来,并清除它们,但是当我再次需要它们的时候请重新映射它们,好像它们是新鲜的mmap() “ 最好的办法是什么呢? 实际上,写完这些之后,我才意识到我可以做一个munmap(),然后立即执行一个新的mmap()。 那会是正确的方法吗? 我明白,可能有一些更有效的方法来做到这一点。

在linux中通过pipe道设置和使用环境variables

如何在一个脚本中设置环境variables,并在将输出传输到另一个脚本之后,我需要在第一个脚本中设置特定的环境variables并在第二个脚本中使用。 我正在使用Python脚本。 python script1.py | python script2.py 在script1.py ,我正在做 os.environ["some_key"] = some_value 在script2.py ,我正在试图读取它 saved_value = os.environ["some_key"] 当我尝试运行上述脚本时, Traceback (most recent call last): File "script2.py", line 11, in <module> filename = os.environ["some_key"] File "/usr/lib/python2.7/UserDict.py", line 23, in __getitem__ raise KeyError(key) 反正有这个可以纠正? 我特别需要它从script2.py os.environ["some_key"] script2.py os.environ["some_key"] script2.py因为该文件是更大的框架的一部分,不能改变它。 我有script1.py灵活性

“–target list”在qemu安装中的含义

我是qemu的新手。 我有以下问题。 我需要使用qemu模拟一些新的说明。 基本上我修改target-i386到像target-i386-extended这样的东西。 添加tcg / i386-extended。由于qemu支持许多体系结构,通常我使用以下命令进行configuration ./configure –target-list = i386-softmmu –enable-debug 使 进行安装 如果我们想模仿新的目标,是否有任何需要改变的地方? 如果是这样,在上述情况下需要什么命令? 期待你的回复。

如何从挂载的硬盘启动恢复模式的MySQL服务

我有一个服务器崩溃,并将我的磁盘安装到/ mnt / 我现在做了所有数据的备份,但确实需要我的mysql数据库的结构和数据。 我想也许是最简单的方法来让MySQL运行,所以我可以做一个数据库转储,我是吗? 已经尝试运行/mnt/etc/init.d/mysql启动 还是有办法复制所有文件,并在我的电脑本地运行数据库? 我坚持,真的需要一些帮助。 提前致谢!