linux 管道写入size t 最大值值pipe size是多少

linux无名管道pipe父子进程读写文件是同一个吗?_百度知道
linux无名管道pipe父子进程读写文件是同一个吗?
close(pipe_fd[1]);0)
/close(pipe_fd[0]);}else if(pid&/子进程{
close(pipe_fd[1]),那么sleep期间调用父进程的时候不需要先open一下pipe_fd[1]吗;write()经常看到这样的代码if(pid==0)
/}请问比如先运行子进程;read();父进程{
close(pipe_fd[0]);/ sleep(),子进程程序里先把pipe_fd[1]写端关闭了
是同一个文件父子进程各自拥有相同的,但独立的文件描述符,各close自己的不影响其他进程的!
其他类似问题
为您推荐:
pipe的相关知识
等待您来回答
下载知道APP
随时随地咨询
出门在外也不愁博客访问: 716501
博文数量: 1491
博客积分: 38
博客等级: 民兵
技术积分: 5825
注册时间:
IT168企业级官微
微信号:IT168qiye
系统架构师大会
微信号:SACC2013
原文地址: 作者:
linux下的管道机制是需要两个进程有亲缘关系才可以的.但是命名管道(FIFO)却没有这个限制.&不过命名管道却有着下面的规则:a. 不使用O_NONBLOCK标志时,只读open要阻塞到某个其它进程为写而打开它为止b. 不使用O_NONBLOCK标志时,只写open要阻塞到某个其它进程为读而打开它为止c. 如果在open的时候指定O_NONBLOCK标志,当只读open时,没有进程为写而打开FIFO的话,会返回-1,只写open时,没有进程为读而打开FIFO的话也会返回-1表示失败。以上的情况使FIFO的使用带来了一些不便,但有一个常用的技巧是,只要用O_RDWR(读写)来打开一个管道,则不会返回失败,而open也不会阻塞。两个进程使用FIFO来进行通信时,通常会使用两个FIFO,一个用于发送数据(即进行写操作),一个用于接收数据(即进行读操作),而这两个FIFO需要均使用O_RDWR来打开。使用系统调用open, read, write来操作这两个FIFO没有什么问题,程序工作得很好。=======================================================================废话还是不多说, 附上样例代码吧. 我已经简单测试过, 运行得挺好.#include <sys/types.h> #include <sys/stat.h>#include <fcntl.h>#include <unistd.h>#include <string>#include <cstring>#include<iostream>#include<algorithm>int readPipe(const char * namedPipe){&&&&int fd = open(namedPipe, O_RDWR, 0);&&&&//int fd = open(namedPipe, O_RDONLY, 0);&&&&if ( fd < 0 ) {&&&&&&&&std::cout << "Open pipe failed!\n" << std::flush;&&&&&&&&return -1;&&&&}&&&&static const size_t BUFF_LENGTH = 1024;&&&&char r_buf[BUFF_LENGTH] = {0};&&&&while (true) {&&&&&&&&sleep(5);
// Slepp for 5 secounds.&&&&&&&&std::cout << "5 seconds had passed, let's check the pipe buffer: "& & & & & & & & & << std::endl;&&&&&&&&&&&&&&&&memset(r_buf,0,BUFF_LENGTH);&&&&&&&&size_t ret_size = read(fd, r_buf, BUFF_LENGTH);&&&&&&&&if
( ret_size <= 0 )&&&&&&&&{&&&&&&&&&&&&std::cout << __FILE__<< "(" << __LINE__ << "):&"& & & & & & & & & & &&<<&"unknow error happened on read function."&<<&std::endl;&&&&&&&&&&&&close(fd);&&&&&&&&&&&&return -1;&&&&&&&&}&&&&&&&&&&&&&&&&char * begin = static_cast<char*>(r_buf);&&&&&&&&char * end
= begin+BUFF_LENGTH;&&&&&&&&do {&&&&&&&&&&&&std::string strOut(begin);&&&&&&&&&&&&std::cout << strOut << std::endl;&&&&&&&&&&&&if ( strOut == "q" ||strOut == "quit" ||strOut == "exit" )&&&&&&&&&&&&{&&&&&&&&&&&&&&&&close(fd);&&&&&&&&&&&&&&&&return 0;&&&&&&&&&&&&}&&&&&&&&&&&&&&&&&&&&&&&&begin= std::find(begin,end,'\0');&&&&&&&&} while( *(++begin) != '\0' );&&&&}&&&&close(fd);&&&&return 0;}int writePipe(const char * namedPipe){&&&&int fd = open(namedPipe, O_RDWR, 0);&&&&//int fd = open(namedPipe, O_WRONLY, 0);&&&&if ( fd < 0 ) {&&&&&&&&std::cout << "Open pipe failed!\n" << std::flush;&&&&&&&&return -1;&&&&}&&&&while (true) {&&&&&&&&std::string strIn;&&&&&&&&std::cin >> strIn;&&&&&&&&std::cout << "write " << strIn.size() << " bytes" << std::endl;&&&&&&&&size_t sizeWrite = write(fd,strIn.c_str(),strIn.size()+1);&&&&&&&&if ( sizeWrite <= 0 )&&&&&&&&{& & & & & & std::cout&<<&__FILE__<<&"("&<<&__LINE__&<<&"):&"& & & & & & & & & & &&<<&"unknow error happen on write function."&<<&std::endl;&&&&&&&&&&&&close(fd);&&&&&&&&&&&&return -1;&&&&&&&&}&&&&&&&&if ( strIn == "q" ||strIn == "quit" ||strIn == "exit" )&&&&&&&&{&&&&&&&&&&&&close(fd);&&&&&&&&&&&&return 0;&&&&&&&&}&&&&}&&&&close(fd);&&&&return 0;}int main(int arc, char**arv){&&&&if (arc <=1) return -1;&&&&&&&&&&&&static const char * namedPipe = "/tmp/MyNamedPipe";&&&&if ( mkfifo(namedPipe, S_IRUSR | S_IWUSR)< 0 && errno != EEXIST )&&&&{&&&&&&&&unlink(namedPipe);&&&&&&&&std::cout << "Create named pipe failed! \n" << std::flush;&&&&&&&&return -1;&&&&}&&&&std::string command = arv[1];&&&&if (command == "write") writePipe(namedPipe);&&&&if (command == "read") readPipe(namedPipe);&&&&unlink(namedPipe);
&&&&return 0;}再介绍一个更加实用的方案,假设一个叫functionBinary的可执行文件在标准输出里面打印了很多信息.我们希望通过管道捕获这些打印信息到我们的程序里面来.我们只要对上面的程序稍作修改就能办到 < 只需要修改函数&writePipe, 其他代码不变 >int writePipe(const char * namedPipe){&&&&std::string strCommand = "./functionBinary > ";&&&&strCommand += namedPipe;&&&&system(strCommand.c_str());&&&&return 0;}
阅读(16) | 评论(0) | 转发(0) |
相关热门文章
给主人留下些什么吧!~~
请登录后评论。博客访问: 150747
博文数量: 52
注册时间:
IT168企业级官微
微信号:IT168qiye
系统架构师大会
微信号:SACC2013
分类: Linux
Linux对于每个用户,系统限制其最大进程数。为提高性能,可以根据设备资源情况,设置各linux 用户的最大进程数可以用ulimit -a 来显示当前的各种用户进程限制。下面我把某linux用户的最大进程数设为10000个:& & &ulimit -u 10240& & &对于需要做许多 socket 连接并使它们处于打开状态的 Java 应用程序而言,& & &最好通过使用 ulimit -n xx 修改每个进程可打开的文件数,缺省值是 1024。& & &ulimit -n 4096 将每个进程可以打开的文件数目加大到4096,缺省为1024& & &其他建议设置成无限制(unlimited)的一些重要设置是:& & &数据段长度:ulimit -d unlimited& & &最大内存大小:ulimit -m unlimited& & &堆栈大小:ulimit -s unlimited& & &CPU 时间:ulimit -t unlimited& & &虚拟内存:ulimit -v unlimited  & & &暂时地,适用于通过 ulimit 命令登录 shell 会话期间。& & &永久地,通过将一个相应的 ulimit 语句添加到由登录 shell 读取的文件中, 即特定于 shell 的用户资源文件,如:1)、解除 Linux 系统的最大进程数和最大文件打开数限制:& & & & vi /etc/security/limits.conf& & & & # 添加如下的行& & & & * soft noproc 11000& & & & * hard noproc 11000& & & & * soft nofile 4100& & & & * hard nofile 4100& & & &说明:* 代表针对所有用户,noproc 是代表最大进程数,nofile 是代表最大文件打开数2)、让 SSH 接受 Login 程式的登入,方便在 ssh 客户端查看 ulimit -a 资源限制:& & & & a、vi /etc/ssh/sshd_config& & & & & & &把 UserLogin 的值改为 yes,并把 # 注释去掉& & & & b、重启 sshd 服务:& & & & & & & /etc/init.d/sshd restart3)、修改所有 linux 用户的环境变量文件:& & vi /etc/profile& & ulimit -u 10000& & ulimit -n 4096& & ulimit -d unlimited& & ulimit -m unlimited& & ulimit -s unlimited& & ulimit -t unlimited& & ulimit -v unlimited&保存后运行#source /etc/profile 使其生效/**************************************有时候在程序里面需要打开多个文件,进行分析,系统一般默认数量是1024,(用ulimit -a可以看到)对于正常使用是够了,但是对于程序来讲,就太少了。修改2个文件。1./etc/security/limits.confvi /etc/security/limits.conf加上:* soft nofile 8192* hard nofile 204802./etc/pam.d/loginsession required /lib/security/pam_limits.so/**********另外确保/etc/pam.d/system-auth文件有下面内容session required /lib/security/$ISA/pam_limits.so这一行确保系统会执行这个限制。/***********3.一般用户的.bash_profile#ulimit -n 1024重新登陆ok&ulimit 的作用& =======================&ulimit:显示(或设置)用户可以使用的资源的限制(limit),这限制分为软限制(当前限制)和硬限制(上限),其中硬限制是软限制的上限值,应用程序在运行过程中使用的系统资源不超过相应的软限制,任何的超越都导致进程的终止。参数 描述ulimited 不限制用户可以使用的资源,但本设置对可打开的最大文件数(max open files)和可同时运行的最大进程数(max user processes)无效-a 列出所有当前资源极限-c 设置core文件的最大值.单位:blocks-d 设置一个进程的数据段的最大值.单位:kbytes-f Shell 创建文件的文件大小的最大值,单位:blocks-h 指定设置某个给定资源的硬极限。如果用户拥有 root 用户权限,可以增大硬极限。任何用户均可减少硬极限-l 可以锁住的物理内存的最大值-m 可以使用的常驻内存的最大值,单位:kbytes-n 每个进程可以同时打开的最大文件数-p 设置管道的最大值,单位为block,1block=512bytes-s 指定堆栈的最大值:单位:kbytes-S 指定为给定的资源设置软极限。软极限可增大到硬极限的值。如果 -H 和 -S 标志均未指定,极限适用于以上二者-t 指定每个进程所使用的秒数,单位:seconds-u 可以运行的最大并发进程数-v Shell可使用的最大的虚拟内存,单位:kbytes-x范例1:[root@localhost proc]# ulimit -acore file size (blocks, -c) 100data seg size (kbytes, -d) unlimitedfile size (blocks, -f) unlimitedpending signals (-i) 2047max locked memory (kbytes, -l) 32max memory size (kbytes, -m) unlimitedopen files (-n) 1024pipe size (512 bytes, -p) 8POSIX message queues (bytes, -q) 819200stack size (kbytes, -s) 8192cpu time (seconds, -t) unlimitedmax user processes (-u) 2047virtual memory (kbytes, -v) unlimitedfile locks (-x) unlimited[root@localhost proc]#输出的每一行由资源名字、(单位,ulimit命令的参数)、软限制组成。详细解释:参数 描述core file size core文件的最大值为100 blocks,data seg size 进程的数据段可以任意大file size 文件可以任意大pending signals 最多有2047个待处理的信号max locked memory 一个任务锁住的物理内存的最大值为32kBmax memory size 一个任务的常驻物理内存的最大值open files 一个任务最多可以同时打开1024的文件pipe size 管道的最大空间为4096字节POSIX message queues POSIX的消息队列的最大值为819200字节stack size 进程的栈的最大值为8192字节cpu time 进程使用的CPU时间max user processes 当前用户同时打开的进程(包括线程)的最大个数为2047virtual memory 没有限制进程的最大地址空间file locks 所能锁住的文件的最大个数没有限制范例2:通过ulimit命令来限制文件的大小,从而导致拷贝命令的失败[root@localhost]ls temp.txtls: temp.txt: 没有那个文件或目录[root@localhost]ulimit -f 1 #设置创建文件的最大块(一块=512字节)[root@localhost]cat a.c > temp.txt文件大小超出限制文件a.c的大小是5002字节,而我们设定的创建文件的大小是512字节x1块=512字节&1、修改用戶進程可打開文件數限制在Linux平台上,無論編寫客戶端程序還是服務端程序,在進行高並發TCP連接處理時,最高的並發數量都要受到系統對用戶單一進程同時可打開文件數量的限制(這是因為系統為每個TCP連接都要創建一個socket句柄,每個socket句柄同時也是一個文件句柄)。可使用ulimit命令查看系統允許當前用戶進程打開的文件數限制:[speng@as4 ~]$ ulimit -n1024這表示當前用戶的每個進程最多允許同時打開1024個文件,這1024個文件中還得除去每個進程必然打開的標準輸入,標準輸出,標準錯誤,服務器監聽socket,進程間通訊的unix域socket等文件,那麼剩下的可用於客戶端socket連接的文件數就只有大概4個左右。也就是說缺省情況下,基於Linux的通訊程序最多允許同時1014個TCP並發連接。對於想支持更高數量的TCP並發連接的通訊處理程序,就必須修改Linux對當前用戶的進程同時打開的文件數量的軟限制(soft limit)和硬限制(hardlimit)。其中軟限制是指Linux在當前系統能夠承受的範圍內進一步限制用戶同時打開的文件數;硬限制則是根據系統硬件資源狀況(主要是系統內存)計算出來的系統最多可同時打開的文件數量。通常軟限制小於或等於硬限制。修改上述限制的最簡單的辦法就是使用ulimit命令:[speng@as4 ~]$ ulimit -n 上述命令中,在中指定要設置的單一進程允許打開的最大文件數。如果系統回顯類似於"Operation notpermitted"之類的話,說明上述限制修改失敗,實際上是因為在中指定的數值超過了Linux系統對該用戶打開文件數的軟限製或硬限制。因此,就需要修改Linux系統對用戶的關於打開文件數的軟限制和硬限制。第一步,修改/etc/security/limits.conf文件,在文件中添加如下行:speng soft nofile 10240speng hard nofile 10240其中speng指定了要修改哪個用戶的打開文件數限制,可用'*'號表示修改所有用戶的限制;soft或hard指定要修改軟限制還是硬限制;10240則指定了想要修改的新的限制值,即最大打開文件數(請注意軟限制值要小於或等於硬限制)。修改完後保存文件。第二步,修改/etc/pam.d/login文件,在文件中添加如下行:session required /lib/security/pam_limits.so這是告訴Linux在用戶完成系統登錄後,應該調用pam_limits.so模塊來設置系統對該用戶可使用的各種資源數量的最大限制(包括用戶可打開的最大文件數限制),而pam_limits.so模塊就會從/etc/security/limits.conf文件中讀取配置來設置這些限制值。修改完後保存此文件。第三步,查看Linux系統級的最大打開文件數限制,使用如下命令:[speng@as4 ~]$ cat /proc/sys/fs/file-max12158這表明這台Linux系統最多允許同時打開(即包含所有用戶打開文件數總和)12158個文件,是Linux系統級硬限制,所有用戶級的打開文件數限制都不應超過這個數值。通常這個系統級硬限制是Linux系統在啟動時根據系統硬件資源狀況計算出來的最佳的最大同時打開文件數限制,如果沒有特殊需要,不應該修改此限制,除非想為用戶級打開文件數限制設置超過此限制的值。修改此硬限制的方法是修改/etc/rc.local腳本,在腳本中添加如下行:echo 22158 > /proc/sys/fs/file-max這是讓Linux在啟動完成後強行將系統級打開文件數硬限制設置為22158。修改完後保存此文件。完成上述步驟後重啟系統,一般情況下就可以將Linux系統對指定用戶的單一進程允許同時打開的最大文件數限制設為指定的數值。如果重啟後用ulimit-n命令查看用戶可打開文件數限制仍然低於上述步驟中設置的最大值,這可能是因為在用戶登錄腳本/etc/profile中使用ulimit -n命令已經將用戶可同時打開的文件數做了限制。由於通過ulimit-n修改系統對用戶可同時打開文件的最大數限制時,新修改的值只能小於或等於上次ulimit-n設置的值,因此想用此命令增大這個限制值是不可能的。所以,如果有上述問題存在,就只能去打開/etc/profile腳本文件,在文件中查找是否使用了ulimit-n限制了用戶可同時打開的最大文件數量,如果找到,則刪除這行命令,或者將其設置的值改為合適的值,然後保存文件,用戶退出並重新登錄系統即可。通過上述步驟,就為支持高並發TCP連接處理的通訊處理程序解除關於打開文件數量方面的系統限制。2、修改網絡內核對TCP連接的有關限制在Linux上編寫支持高並發TCP連接的客戶端通訊處理程序時,有時會發現儘管已經解除了系統對用戶同時打開文件數的限制,但仍會出現並發TCP連接數增加到一定數量時,再也無法成功建立新的TCP連接的現象。出現這種現在的原因有多種。第一種原因可能是因為Linux網絡內核對本地端口號範圍有限制。此時,進一步分析為什麼無法建立TCP連接,會發現問題出在connect()調用返回失敗,查看系統錯誤提示消息是"Can't assign requestedaddress"。同時,如果在此時用tcpdump工具監視網絡,會發現根本沒有TCP連接時客戶端發SYN包的網絡流量。這些情況說明問題在於本地Linux系統內核中有限制。其實,問題的根本原因在於Linux內核的TCP/IP協議實現模塊對系統中所有的客戶端TCP連接對應的本地端口號的範圍進行了限制(例如,內核限製本地端口號的範圍為之間)。當系統中某一時刻同時存在太多的TCP客戶端連接時,由於每個TCP客戶端連接都要佔用一個唯一的本地端口號(此端口號在系統的本地端口號範圍限制中),如果現有的TCP客戶端連接已將所有的本地端口號佔滿,則此時就無法為新的TCP客戶端連接分配一個本地端口號了,因此系統會在這種情況下在connect()調用中返回失敗,並將錯誤提示消息設為"Can't assignrequested address"。有關這些控制邏輯可以查看Linux內核源代碼,以linux2.6內核為例,可以查看tcp_ipv4.c文件中如下函數:static int tcp_v4_hash_connect(struct sock *sk)請注意上述函數中對變量sysctl_local_port_range的訪問控制。變量sysctl_local_port_range的初始化則是在tcp.c文件中的如下函數中設置:void __init tcp_init(void)內核編譯時默認設置的本地端口號範圍可能太小,因此需要修改此本地端口範圍限制。第一步,修改/etc/sysctl.conf文件,在文件中添加如下行:net.ipv4.ip_local_port_range = 這表明將系統對本地端口範圍限制設置為之間。請注意,本地端口範圍的最小值必須大於或等於1024;而端口範圍的最大值則應小於或等於65535。修改完後保存此文件。第二步,執行sysctl命令:[speng@as4 ~]$ sysctl -p如果系統沒有錯誤提示,就表明新的本地端口範圍設置成功。如果按上述端口範圍進行設置,則理論上單獨一個進程最多可以同時建立60000多個TCP客戶端連接。第二種無法建立TCP連接的原因可能是因為Linux網絡內核的IP_TABLE防火牆對最大跟踪的TCP連接數有限制。此時程序會表現為在connect()調用中阻塞,如同死機,如果用tcpdump工具監視網絡,也會發現根本沒有TCP連接時客戶端發SYN包的網絡流量。由於IP_TABLE防火牆在內核中會對每個TCP連接的狀態進行跟踪,跟踪信息將會放在位於內核內存中的conntrackdatabase中,這個數據庫的大小有限,當系統中存在過多的TCP連接時,數據庫容量不足,IP_TABLE無法為新的TCP連接建立跟踪信息,於是表現為在connect()調用中阻塞。此時就必須修改內核對最大跟踪的TCP連接數的限制,方法同修改內核對本地端口號範圍的限制是類似的:第一步,修改/etc/sysctl.conf文件,在文件中添加如下行:net.ipv4.ip_conntrack_max = 10240這表明將系統對最大跟踪的TCP連接數限制設置為10240。請注意,此限制值要盡量小,以節省對內核內存的佔用。第二步,執行sysctl命令:[speng@as4 ~]$ sysctl -p如果系統沒有錯誤提示,就表明系統對新的最大跟踪的TCP連接數限制修改成功。如果按上述參數進行設置,則理論上單獨一個進程最多可以同時建立10000多個TCP客戶端連接。*******注意*******sysctl -p 報錯net.ipv4.ip_conntrack_max" is an unknown key 則:modprobe ip_conntrack
阅读(8889) | 评论(0) | 转发(0) |
相关热门文章
给主人留下些什么吧!~~
请登录后评论。linux 管道写入最大值pipe size是多少?
[问题点数:40分]
linux 管道写入最大值pipe size是多少?
[问题点数:40分]
不显示删除回复
显示所有回复
显示星级回复
显示得分回复
只显示楼主
2008年3月 Linux/Unix社区大版内专家分月排行榜第二
2012年9月 Linux/Unix社区大版内专家分月排行榜第三2007年6月 Linux/Unix社区大版内专家分月排行榜第三
匿名用户不能发表回复!|
每天回帖即可获得10分可用分!小技巧:
你还可以输入10000个字符
(Ctrl+Enter)
请遵守CSDN,不得违反国家法律法规。
转载文章请注明出自“CSDN(www.csdn.net)”。如是商业用途请联系原作者。}

我要回帖

更多关于 pipe size 的文章

更多推荐

版权声明:文章内容来源于网络,版权归原作者所有,如有侵权请点击这里与我们联系,我们将及时删除。

点击添加站长微信