Articles of pipe理员

Linuxpipe道():从pipe道读取并不总是解锁编写器

我在Linux下使用pipe有一个问题。 我想填充一个pipe道,以进一步写入呼叫阻止。 另一个进程应该能够从pipe道读取一些允许另一个进程写入的字符。 示例代码: #include <stdio.h> #include <errno.h> #include <unistd.h> #include <stdlib.h> int main() { int pipefd[2]; int size = 65535; int total = 0; // Create the pipe if(pipe(pipefd) == -1) { perror("pipe()"); exit(EXIT_FAILURE); } // Fill in (almost full = 65535 (full – 1 byte)) while(total < size) { write(pipefd[1], &total, 1); total++; […]

有没有机会由mmap(2)与堆冲突返回地址?

如果我使用mmap(2)分配一些页面,而不提供地址提示,然后使用malloc(3) / calloc(3)分配一些内存,有没有机会malloc调用sbrk(2)并增加堆它重叠到我以前调用mmap返回的地址的方式或mmap始终保证返回远离堆或堆栈的地址?

如何避免closures后从命名pipe道阻塞read()

我有两个使用命名pipe道创build的进程。 编写器进程使用write()写入消息,读取器进程使用read()读取消息。 我注意到,当编写器closurespipe道时,read()会被阻塞。 在closurespipe道之前,是否可以让编写器进程发送EOF,以便读者不会被阻塞?

命令“ls |的执行顺序是什么? 厕所”

在上面的shell脚本中,程序序列将如何执行。 ls会处理pipe道和wc是一个论据? 或者哪一个将会执行,以及将要采取什么样的论据?

Mmap不能分配超过2GB的连续数据

我在用大量内存的64位机器上用mmap分配超过2GB的连续内存时遇到了困难。 下面的代码愉快地运行。 但是,当连续mmap'ed页面的数量增加到略高于2GB mmap在我的机器上失败。 #include <sys/mman.h> #include <stdio.h> #include <signal.h> #include <stdlib.h> #include <time.h> #include <errno.h> #include <unistd.h> #define PAGE_SIZE (4*1024) #define START_ADDRESS 0x8000000 #define START_ADDRESS2 0x800000000 #define N_ITERATIONS 524288 // one more iteration and mmap fails //#define N_ITERATIONS 524289 void allocate(void* base_address) { int i; for (i = 0; i < N_ITERATIONS; ++i) { […]

文件描述符在哪里存储在进程内存中?

当从一个执行点调用函数A时,在内部它是指向函数A的地址的JMP语句。因此当前的执行点被保存到堆栈中,PC加载被调用的函数A的地址并继续。 为了回到函数调用之后的执行点,function块应该具有相同的推送并popup到堆栈上。 通常在C中退出函数,定义的堆栈variables被销毁(我认为意味着popup堆栈),但我决定在我的函数中定义一个文件描述符variables。 代码如下: void main() { printf("In the beginning there was main()\n"); func_call(); printf("func_call complete\n"); while(1); } void func_call() { int fp; //Opening a file to get handle to it. fp = open("stack_flush.c", O_RDONLY); if (fp < 0 ) { perror("fp could not open stack_flush.c"); return; } } 在运行这个程序并检查lsof时,我可以看到在退出函数func_call()时fd仍然是打开的。 stack_flu 3791 vvdnlt260 0u CHR […]

当使用'push'或'sub'x86指令时如何分配堆栈内存?

我一直在浏览一段时间,我想了解如何将内存分配给堆栈时,例如: push rax 或者移动堆栈指针来为子例程的局部variables分配空间: sub rsp, X ;Move stack pointer down by X bytes 我所理解的是,在虚拟内存空间中,堆栈段是匿名的,即不支持文件。 我也明白,内核实际上不会将匿名的虚拟内存段映射到物理内存,直到程序实际上对内存段做某事,即写入数据。 所以,在写入之前尝试读取该段可能会导致错误。 在第一个例子中,如果需要,内核将在物理内存中分配一个帧页面。 在第二个例子中,我假定内核不会将任何物理内存分配给堆栈段,直到程序实际将数据写入堆栈堆栈段中的地址为止。 我在这里的正确轨道?

覆盖malloc,free和calloc会导致在Linux中recursion

我已经在Linux平台上覆盖了函数malloc , calloc和free函数,如下所示: #include <stdio.h> #include <dlfcn.h> #include <stdlib.h> typedef void* (*MALLOCFN)(size_t); typedef void* (*CALLOCFN)(size_t, size_t); typedef void* (*CALLOCFN)(size_t, size_t); typedef void (*FREEFN)(void *); MALLOCFN real_malloc = (MALLOCFN) 0; CALLOCFN real_calloc = (CALLOCFN) 0; FREEFN real_free = (FREEFN) 0; void *get_realfn(const char *fnm) { void *pfunc = (void *) NULL; printf("searching for original %s\n", fnm); […]

为什么Linux会重新使用由pipe()分配的文件描述符

我在Linux中看到使用套接字和pipe道的问题。 具体来说,我们调用pipe(),它分配接下来的两个可用的文件描述符…比方说10和11.然后我们调用accept()在一个套接字上,期待它分配12.而是,它分配11。 我们已经testing了一下,似乎从pipe()返回的第二个FD始终可供其他用于创build文件描述符的系统调用重用。 任何人都可以解释吗?

用于在Unix / Linux环境下使用Perl下载和处理文件的pipe道

我有一个文件的URL列表,我想下载它们: http://somedomain.com/foo1.gz http://somedomain.com/foo2.gz http://somedomain.com/foo3.gz 我想要做的是每个文件的以下内容: 与wget和nohup并行下载foo1,2 .. 每次它完成下载处理他们与myscript.sh 我有什么是这样的: #! /usr/bin/perl @files = glob("foo*.gz"); foreach $file (@files) { my $downurls = "http://somedomain.com/".$file; system("nohup wget $file &"); system("./myscript.sh $file >> output.txt"); } 问题是我不能告诉上面的pipe道什么时候文件完成下载。 所以现在myscript.sh不能正确执行。 什么是正确的方法来实现这一目标?