Articles of pipe理员

为什么malloc依赖于从某个阈值开始的mmap?

我正在读一些关于malloc的信息,并在malloc的手册页中find了以下内容: 通常,malloc()从堆中分配内存,并根据需要使用sbrk(2)调整堆的大小。 当分配大于MMAP_THRESHOLD字节的内存块时,glibc malloc()实现使用mmap(2)将内存分配为专用匿名映射。 MMAP_THRESHOLD默认为128 kB,但可以使用mallopt(3)进行调整。 使用mmap(2)执行的分配不受RLIMIT_DATA资源限制的影响(请参阅getrlimit(2))。 所以基本上从阈值MMAP_THRESHOLD malloc开始使用mmap开始。 有没有任何理由切换到大块的mmap? 这可能会影响stream程执行的性能吗? mmap系统调用是否强制上下文切换?

哪些片段受到写入时拷贝的影响?

我对“ 写时复制 ”的理解是:“每个人在写入之前都有一个相同数据的共享副本,然后进行复制”。 是由堆和bss段组成的相同数据的共享副本还是仅堆? 哪些内存段将被共享,这是依赖于操作系统?

如何在写入之前检查pipe道是否打开?

如果我写封闭的pipe道消息,然后我的程序崩溃 if (write(pipe, msg, strlen(msg)) == -1) { printf("Error occured when trying to write to the pipe\n"); } 如何在写入之前检查pipe是否仍然打开?

在c中实现stream水线 什么是最好的方法来做到这一点? (自己的linuxshell)

我想不出有什么办法可以在c中实现stream水线操作。 这就是为什么我决定写在这里。 我不得不说,我明白了pipe / fork / mkfifo是如何工作的。 我已经看到了很多实现2-3个pipe道的例子。 这很容易。 我的问题开始,当我要实现壳,pipe道数不明。 我现在得到了什么:例如。 ls -al | tr az AZ | tr AZ az | tr az AZ 我把这样的线路变成这样的东西: array[0] = {"ls", "-al", NULL"} array[1] = {"tr", "az", "AZ", NULL"} array[2] = {"tr", "AZ", "az", NULL"} array[3] = {"tr", "az", "AZ", NULL"} 所以我可以使用 execvp(array[0],array) 稍后的。 现在,我相信一切都好。 问题开始,当我试图将这些函数的input/输出redirect到彼此。 以下是我如何做到这一点: […]

获取进程段C / C ++的开始和结束

我需要得到以下过程段的开始和结束地址:代码,数据,堆栈,环境。 我明白它是如何在内存中,但不知道如何使用API​​调用或其他东西。 我已经find了如何使用这段代码开始一些细分市场 #include <stdio.h> int temp_data = 100; static int temp_bss; void print_addr ( void ) { int local_var = 100; int *code_segment_address = ( int* ) &print_addr; int *data_segment_address = &temp_data; int *bss_address = &temp_bss; int *stack_segment_address = &local_var; printf ( "\nAddress of various segments:" ); printf ( "\n\tCode Segment : %p" , […]

Xlib这是如何(删除窗口装饰)工作?

以下代码如何删除窗口边框? //note the struct is declared elsewhere, is here just for clarity. //code is from [http://tonyobryan.com/index.php?article=9][1] typedef struct Hints { unsigned long flags; unsigned long functions; unsigned long decorations; long inputMode; unsigned long status; } Hints; //code to remove decoration Hints hints; Atom property; hints.flags = 2; hints.decorations = 0; property = XInternAtom(display, "_MOTIF_WM_HINTS", true); […]

当操作系统杀死你的进程时返回代码

我想testing如果使用多进程,我可以在32位操作系统上使用超过4GB的内存(我的是:1GB内存的Ubuntu)。 所以我写了一个malloc稍小于1GB的小程序,并对该数组执行一些操作,并运行该程序的5个实例。 事情是,我怀疑操作系统杀死了其中的4个,只有一个幸存下来,并显示它是“PID:我已经完成”)。 (我已经尝试了小数组,并得到5印刷,当我看着与TOP运行的进程,我只看到一个实例..) 奇怪的是这个 – 我收到了所有实例的返回代码0(成功?),包括据说被OS 我没有得到任何按摩说明进程被杀害。 这个返回代码是否正常? (如果是这样,这减less了我对'返回代码'的信任…) 谢谢。 编辑:一些答案build议在小程序可能的错误,所以在这里。 分支和保存返回码的较大的程序是较大的,我在这里有麻烦,但我认为(并希望)没有问题。 我也注意到,如果不是用我的分叉程序来运行它,我使用'.a.out&./a.out&./a.out&./a.out&'来运行terminal。 ./a.out是附带的小程序的二进制文件)我看到一些“Killed”消息。 #include <stdio.h> #include <stdlib.h> #include <sys/types.h> #include <unistd.h> #define SMALL_SIZE 10000 #define BIG_SIZE 1000000000 #define SIZE BIG_SIZE #define REAPETS 1 int main() { pid_t my_pid = getpid(); char * x = malloc(SIZE*sizeof(char)); if (x == NULL) { printf("Malloc failed!"); return(EXIT_FAILURE); […]

PhantomJS:pipe道input

我正在尝试使用PhantomJS来呈现一个HTML页面到PDF。 我不想将文件写入磁盘,我有内存中的HTML,我想在内存中的PDF。 在这个问题上使用Pooria Azimi的出色答案,我可以从命名pipe道获得pdf。 当在另一端尝试相同的时候(用命名pipe道replaceinput文件),我最终得到一个空白的pdf。 这就是我现在正在做的(简化): mkfifo in_pipe.html out_pipe.pdf ./phantomjs rasterize.js in_pipe.html out_pipe.pdf 然后在另一个terminal: echo '<center>hey!</center>' > in_pipe.html cat out_pipe.pdf > out.pdf 文件out.pdf被创build,但是是空的。 我错过了什么吗?

有没有可能在Linux上更改命名pipe道的大小?

我知道,对于当前版本的Linux内核,命名pipe道的大小是64K。 有没有可能增加这个大小呢? 我知道我可以切换到套接字,但首先我想看看是否可以通过增加命名pipe道大小来解决间歇性缓冲区溢出问题。

你怎么能find一个线程正在运行的处理器号码?

我有一个内存堆pipe理器,它根据系统上的处理器数量将堆分成不同的段。 内存只能分配到当前正在运行的线程处理器的分区。 这将有助于允许不同的处理器继续运行,即使两个不同的处理器要同时分配内存,至less我相信。 我发现了Windows的函数GetCurrentProcessorNumber(),但是这只适用于Windows Vista和更高版本。 有没有一种方法可以在Windows XP上运行? 另外,这可以通过POSIX系统上的pthread来完成吗?