怎么修改pipe_buf大小

太乙 2010-06-02 12:11:27
如何修改pipe_buf的大小呢?

1、修改limits.h里的#define PIPE_BUF 4096
重新编译内核?我看网上有人这么做了,但是没成功

2、直接修改/etc/security/limits.conf
???怎么修改?能行么?

3、其他??


有人能提供一个简单的方法么?最好不用重新编译内核的!
...全文
667 8 打赏 收藏 转发到动态 举报
AI 作业
写回复
用AI写文章
8 条回复
切换为时间正序
请发表友善的回复…
发表回复
太乙 2010-06-03
  • 打赏
  • 举报
回复
[Quote=引用 6 楼 hzcpig 的回复:]
严重怀疑是多进程同时读写造成的错乱问题。以前做日志系统的时候也是参考syslog,多进程的写日志动作只是发事件,由唯一的进程接收事件然后写入日志文件。

希望楼主解决后回头说说原因,关注。
[/Quote]呵呵,你的怀疑是对的!多进程同时写,而一条日志超长(大于了pipe_buf),所以不能保证原子性!就有可能错乱。。。
justin_luhui 2010-06-03
  • 打赏
  • 举报
回复
xuexi了
handledos 2010-06-02
  • 打赏
  • 举报
回复
ls说的很详细了
steptodream 2010-06-02
  • 打赏
  • 举报
回复
What good would it do you to rebuild your kernel with 'PIPE_BUF' set to
some value other than the number of bytes that one can write to a pipe
atomically?

Perhaps you are under the mistaken impression that 'PIPE_BUF'
determines how many bytes you can write to a pipe atomically (that is,
that the kernel accesses this value and uses it to influence how pipes
behave). It does not, it only *tells* you how many bytes you can write
to a pipe atomically. If you change it to something else, it will no
longer do so, making it useless.

PIPE_BUF is a consequence of other logic in the kernel, it is not a
configuration parameter.

http://software.itags.org/linux-unix/332459/
hzcpig 2010-06-02
  • 打赏
  • 举报
回复
严重怀疑是多进程同时读写造成的错乱问题。以前做日志系统的时候也是参考syslog,多进程的写日志动作只是发事件,由唯一的进程接收事件然后写入日志文件。

希望楼主解决后回头说说原因,关注。
太乙 2010-06-02
  • 打赏
  • 举报
回复
[Quote=引用 4 楼 steptodream 的回复:]
没遇到过 还真不知道如何解决
一条日志怎么那么大啊
我是觉得一条日志超过4k 这样详细的日志信息似乎没必要啊
[/Quote]呵呵,谢谢你的帮忙,我再找找~~~
steptodream 2010-06-02
  • 打赏
  • 举报
回复
没遇到过 还真不知道如何解决
一条日志怎么那么大啊
我是觉得一条日志超过4k 这样详细的日志信息似乎没必要啊
太乙 2010-06-02
  • 打赏
  • 举报
回复
[Quote=引用 1 楼 steptodream 的回复:]
What good would it do you to rebuild your kernel with 'PIPE_BUF' set to
some value other than the number of bytes that one can write to a pipe
atomically?

Perhaps you are under the mistaken impre……
[/Quote]

谢谢,现在我遇到一个问题,就是apache写日志的问题,具体可以参见:
http://topic.csdn.net/u/20100601/11/e9b8bc91-dae8-4672-8b20-cff4c71dee0f.html
http://topic.csdn.net/u/20100601/11/b6f12ee7-daf7-4518-a700-f268c74ce712.html
http://topic.csdn.net/u/20100601/11/0b4a79e2-3444-461c-a800-0802cd58d038.html

我测试了一下,如果apache的单条日志超过4k,就会有日志乱掉的情况!

而使用ulimit -p, 发现8*512=4096

而如果单条日志不超过4k,就没有日志乱掉的情况!

网上查了下,好像是apache在写入的时候,是用管道,而管道的原子操作,是由pipe_buf来决定大小的!

所有有此一问!

如果不修改这个值,那么我写日志的时候是不是必须加锁呢??apache本身有这个机制??

谢谢~~~
进程通信 Linux进程间通信 一、进程间通信概述 进程通信有如下一些目的: A、数据传输:一个进程需要将它的数据发送给另一个进程,发送的数据量在一个字节到几M字节之间 B、共享数据:多个进程想要操作共享数据,一个进程对共享数据的修改,别的进程应该立刻看到。 C、通知事件:一个进程需要向另一个或一组进程发送消息,通知它(它们)发生了某种事件(如进程终止时要通知父进程)。 D、资源共享:多个进程之间共享同样的资源。为了作到这一点,需要内核提供锁和同步机制。 E、进程控制:有些进程希望完全控制另一个进程的执行(如Debug进程),此时控制进程希望能够拦截另一个进程的所有陷入和异常,并能够及时知道它的状态改变。 Linux 进程间通信(IPC)以下以几部分发展而来: 早期UNIX进程间通信、基于System V进程间通信、基于Socket进程间通信和POSIX进程间通信。 UNIX进程间通信方式包括:管道、FIFO、信号。 System V进程间通信方式包括:System V消息队列、System V信号灯、System V共享内存、 POSIX进程间通信包括:posix消息队列、posix信号灯、posix共享内存。 现在linux使用的进程间通信方式: (1)管道(pipe)和有名管道(FIFO) (2)信号(signal) (3)消息队列 (4)共享内存 (5)信号量 (6)套接字(socket) 二、管道通信 普通的Linux shell都允许重定向,而重定向使用的就是管道。例如: ps | grep vsftpd .管道是单向的、先进先出的、无结构的、固定大小的字节流,它把一个进程的标准输出和另一个进程的标准输入连接在一起。写进程在管道的尾端写入数据,读进程在管道的道端读出数据。数据读出后将从管道中移走,其它读进程都不能再读到这些数据。管道提供了简单的流控制机制。进程试图读空管道时,在有数据写入管道前,进程将一直阻塞。同样,管道已经满时,进程再试图写管道,在其它进程从管道中移走数据之前,写进程将一直阻塞。管道主要用于不同进程间通信。 管道创建与关闭 创建一个简单的管道,可以使用系统调用pipe()。它接受一个参数,也就是一个包括两个整数的数组。如果系统调用成功,此数组将包括管道使用的两个文件描述符。创建一个管道之后,一般情况下进程将产生一个新的进程。 系统调用:pipe(); 原型:int pipe(int fd[2]); 返回值:如果系统调用成功,返回0。如果系统调用失败返回-1: errno=EMFILE(没有空亲的文件描述符) EMFILE(系统文件表已满) EFAULT(fd数组无效) 注意:fd[0]用于读取管道,fd[1]用于写入管道。 图见附件 管道的创建 #include #include #include #include int main() { int pipe_fd[2]; if(pipe(pipe_fd)<0){ printf("pipe create error\n"); return -1; } else printf("pipe create success\n"); close(pipe_fd[0]); close(pipe_fd[1]); } 管道的读写 管道主要用于不同进程间通信。实际上,通常先创建一个管道,再通过fork函数创建一个子进程。图见附件。 子进程写入和父进程读的命名管道:图见附件 管道读写注意事项: 可以通过打开两个管道来创建一个双向的管道。但需要在子理程中正确地设置文件描述符。必须在系统调用fork()中调用pipe(),否则子进程将不会继承文件描述符。当使用半双工管道时,任何关联的进程都必须共享一个相关的祖先进程。因为管道存在于系统内核之中,所以任何不在创建管道的进程的祖先进程之中的进程都将无法寻址它。而在命名管道中却不是这样。管道实例见:pipe_rw.c #include #include #include #include #include int main() { int pipe_fd[2]; pid_t pid; char buf_r[100]; char* p_wbuf; int r_num; memset(buf_r,0,sizeof(buf_r));数组中的数据清0; if(pipe(pipe_fd)<0){ printf("pipe create error\n"); return -1; } if((pid=fork())==0){ printf("\n"); close(pipe_fd[1]); sleep(2); if((r_num=read(pipe_fd[0],buf_r,100))>0){ printf("%d numbers read from be pipe is %s\n",r_num,buf_r); } close(pipe_fd[0]); exit(0); }else if(pid>0){ close(pipe_fd[0]); if(write(pipe_fd[1],"Hello",5)!=-1) printf("parent write success!\n"); if(write(pipe_fd[1]," Pipe",5)!=-1) printf("parent wirte2 succes!\n"); close(pipe_fd[1]); sleep(3); waitpid(pid,NULL,0); exit(0); } }

4,466

社区成员

发帖
与我相关
我的任务
社区描述
Linux/Unix社区 内核源代码研究区
社区管理员
  • 内核源代码研究区社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧