Articles of pipe理员

Linux中每个进程的最大打开文件数

我使用命令:ulimit -n,我采取数字1024,这是我的系统中每个进程打开文件的最大数量。 但下面的程序我拿510 …? 哪里不对 #include <stdio.h> #include <stdlib.h> #include <unistd.h> #include <sys/types.h> #include <errno.h> int main( void ) { int pipe_ext = 0, pfd[ 2 ], counter = 0; while ( 1 ) { pipe_ext = pipe( pfd ); //errno = 0; if ( pipe_ext == 0 ) { write( pfd[ 1 ], "R", […]

Open(),Close()和Read()应用于Linuxpipe道文件描述符

这可能是一个简单的问题,但我想确认我对这些function的理解 – 如果我完全错误的话,可能会澄清。 以下是发生了什么事情: 我有一个multithreading程序,使用unix pipe()函数通过pipe道传递数据。 基本上,两个线程可以写入pipe道(它们当然是同步的),只有一个线程可以从pipe道读取。 根据我的理解, read()命令将尝试从传递的文件描述符参数中读取x个字节,如果到达EOF ,它将返回0。 我写入pipe道的字节数是可变的,所以从pipe道读取时会有一些小的困难。 我相信我读了使用close(my_pipe_file_descriptor)在EOF抛出的地方。 如果是这样的话, read()会在返回EOF返回 – 这会很好。 如果我上面说的是正确的 – 关于close()和read()是如何工作的 – 我有一个问题。 如果我调用close(my_pipe_file_descriptor) ,pipe道是否被销毁,使得将来的调用open(my_pipe_file_descriptor)无效? 我希望这是有道理的。

内核必须在上下文切换之间保存什么内存“状态”?

目前我正在阅读Linux如何工作:每个超级用户应该知道什么 ,并阅读了关于上下文切换的以下内容: CPU(实际的硬件)根据内部的时钟中断当前的进程,切换到内核模式,并把控制权交还给内核。 内核logging了CPU和内存的当前状态 ,这对于恢复刚被中断的进程是非常重要的。 内核执行前一时间片中可能出现的任何任务(例如从input和输出或I / O操作收集数据)。 内核现在准备让另一个进程运行。 内核分析准备运行的进程列表并select一个进程。 内核为这个新进程准备内存 ,然后准备CPU。 内核告诉CPU新进程的时间片将持续多久。 内核将CPU切换到用户模式,并将CPU的控制权交给进程。 我知道需要从CPU的状态(寄存器值等)保存什么,但我不明白什么内存需要pipe理。 这个进程是否有自己的内存块,这应该不受上下文切换的影响? 内核需要在上下文切换之间保存什么内存?

pipe道访问权限setuid程序

我正在扩展GNU / Linux(Ubuntu 14.04)下运行的一些软件(我不是作者),它由一个manager进程和几个worker进程组成。 pipe理员可以通过我可以在configuration文件中指定的命令行来启动一个worker。 启动一名工人后,pipe理人员使用pipe道与其通信。 出于安全原因,我们决定让工人在不同于pipe理者的用户下运行(让我们称他们为manager-user和worker-user )。 这是通过编写一个小的包装脚本来实现的,该脚本用su来切换用户并启动一个新的worker。 在此之后,经理可以通过pipe道与工作进程进行通信。 这种方法现在已经运行了好几个月了。 作为su的替代,我们已经考虑使用setuid位来运行工作者。 所以我们写了一个C封装器,可以由pipe理器调用来启动一个worker。 如果我们将包装器configuration为由manager-user拥有,则worker正确启动(当然,但具有错误的权限)。 如果我们将包装程序configuration为由worker-user拥有并设置setuid位,则启动worker,但因为无法连接到manager而退出。 所以我的问题是:如何运行一个setuid可执行文件影响由父进程和subprocess创build的pipe道权限? 难道通过setuid-wrapper启动的工作进程没有权限打开pipe理器的pipe道(或者相反)? 如果可以的话,我们如何改变这些权限? 我几乎没有使用setuid经验,因此欢迎任何信息/解释。

共享内存中的Shared_dirty vs Private_dirty

我有使用共享内存的多进程应用程序。 我正在尝试检测我的应用程序中的内存泄漏。 我在/ proc / $ pid / smap中find了这个 2b51cd2b2000-2b53b8aa4000 rw-s 00000000 00:09 17151225 /dev/zero (deleted) Size: 8052680 kB Rss: 31608 kB Shared_Clean: 1524 kB Shared_Dirty: 25736 kB Private_Clean: 0 kB Private_Dirty: 4348 kB Swap: 0 kB Pss: 6945 kB 这是我分配的共享内存(大小告诉这是我用mmap分配的) 我试图理解在这种情况下Shared / Private之间的区别,内存本身是共享的。 看到''的标志。 如果任何人可以解释Shared_Clean与Private_Clean Shared_Dirty与Private_Dirty在共享内存上的区别。

以毫秒为间隔的netcat

我正在尝试使用netcat每隔几毫秒读取一个文件中的一行,并将其发送到一个端口.. 到目前为止,我从netcat文档知道它可以在每个发送的行之间插入一个时间间隔: 这是来自netcat的帮助手册: -i secs发送的线路,扫描的端口的延迟时间间隔 我尝试了以下的方法,允许我在每个发送的行之间插入最less1秒的时间间隔。 nc -q 10 -i 1 -lk 9999 < file_input 我想知道是否有这个时间间隔减less到毫秒。 也许通过pipe道input文件到netcat使用一些实用程序,允许configuration间隔之间的每个读取的毫秒数量级?

如何将文本文件输出redirect到pipe道?

我正在运行一个Unix工具,它需要一个选项-l log_file 。 我想redirect到一个pipe道,就像这样: my_tool -l /dev/tty | grep "Aye, Caramba!" 不幸的是,当我指定/dev/tty , my_tool的输出直接转到了控制台窗口,绕过了grep 。 我也试过/dev/stdout ,无济于事。 因此,问题是:为了捕获相应的输出到pipe道中,上面的选项-l需要指定什么?

如何使用wmctrl移动窗口

我试图以编程方式移动一个窗口,使其部分在屏幕上。 例如,单击VLC标题栏并拖动它,以便只有一半的窗口可见工作得很好。 当我输出wmctrl -lG的结果,这工作得很好: 0x04a00011 0 -293 138 600 420 HEVM002 VLC media player 然而,当我把它移回到屏幕上并尝试复制它的位置时,它不起作用,把窗户夹在远处: wmctrl -r "VLC media player" -e 0,-200,0,800,600 我已经testing了几个窗口pipe理器,它似乎在xfwm上工作得很好,但不是在compiz上。 是否有一个标志或类似的东西,我可以设置使窗口移动屏幕?

函数'mknod'的隐式声明,但是我包含了头文件

我想做一个C程序,使用命名pipe道与Raspberry Pi 3上的C ++程序进行通信。 当我编译我的一些代码时,GCC正在吐露的警告: /home/pi/BluetoothTest/btooth.c|76|warning: implicit declaration of function 'mknod' [-Wimplicit-function-declaration]| 下面是该函数的代码,包括上面的#if: #if defined __USE_MISC || defined __USE_BSD || defined __USE_XOPEN_EXTENDED extern int mknod (const char *__path, __mode_t __mode, __dev_t __dev) __THROW __nonnull ((1)); 这里是我在文件中包含的内容: #include <stdlib.h> #include <stdio.h> #include <unistd.h> #include <fcntl.h> #include <pthread.h> #include <sys/socket.h> #include <sys/stat.h> #include <sys/types.h> #include <bluetooth/bluetooth.h> #include […]

bash引用参数/variablespipe道

如何引用input的参数? 例如,如果你有一个代码test.sh如下 #!/bin/bash echo $1 当你运行./test.sh abcd.txt ,你会得到在屏幕上打印的abcd.txt。 但是当我尝试ls *.txt | ./test.sh ls *.txt | ./test.sh ,我得到所有的回声空行。