一个进程 fork 多个子进程
2011-07-07 09:04
204 查看
今天要做这么一件事情,一个主进程fork出N个子进程,然后主进程用roundrobin的策略通知各个子进程, 每通知一次,对应子进程就产生一个线程,去做一件事情。为啥要搞这么麻烦呢,主要是为了防止高并发的情况。其实用线程池应该可以搞定的,不过时间比较赶,能力不济,线程池实现进程来不及。而且一个进程,就算把线程的stack设小,最多也就1000多个线程吧, 多个进程就可以把 capacity 上升到10,000量级。 说穿了,还是为了防止高并发。
今天还学到 open 一个文件,加上 O_APPEND, 就是追加,而且是原子操作,以前前我多线程写文件还用了互斥锁,看来完全没有必要。
for (i = 0; i < PROCESS_NUM ; i++)
pid[i] = fork();
我就SB西西的向上面这样写,然后就挂了,问题是出在:当 i =0; fork出第一个子进程,但是循环没结束,所以子进程,会继续fork自己的子进程。 程序就抽风了。
改成下面这样就OK了, 因为fork返回给child process 0,所以用 break 防止child process keep forking .
for(i = 0; i < PROCESS_NUM; i++)
{
if(0 == (pid[i] = fork()))
break; // for child process
}
全部的代码:
#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
#include <sys/types.h>
#include <sys/stat.h>
#include <fcntl.h>
#define SIZE 20
#define PROCESS_NUM 10
int main(void)
{
int i;
pid_t pid[PROCESS_NUM];
int fd[PROCESS_NUM][2];
for(i = 0; i < PROCESS_NUM; i++)
{
pid[i] = -1;
pipe(fd[i]);
}
for(i = 0; i < PROCESS_NUM; i++)
{
if(0 == (pid[i] = fork()))
break; // for child process
}
for(i = 0; i < PROCESS_NUM; i++)
{
if(0 == pid[i])
{
close(fd[i][1]);
//child process add here
child(i, fd[i][0]);
return 0;
}
}
//father process
for(i = 0 ; i < PROCESS_NUM; i++)
close(fd[i][0]);
for(i = 0; i < PROCESS_NUM; i++)
notify_child(i, fd[i][1], 'a');
for(i = 0; i < PROCESS_NUM; i++)
notify_child(i, fd[i][1], 'q');
wait(NULL);
return 0;
}
child 和 notify_child就是简单的管道的读写操作,因为默认read pipe 是阻塞的,所以可以用作消息通知。
void child(int i, int readfd)
{
char flag;
while(1)
{
read(readfd, &flag, 1);
if(flag == 'q')
break;
else
//to do .....
}
}
void notify_child(int i, int writefd, chat flag)
{
write(writefd, &flag, 1);
}
今天还学到 open 一个文件,加上 O_APPEND, 就是追加,而且是原子操作,以前前我多线程写文件还用了互斥锁,看来完全没有必要。
for (i = 0; i < PROCESS_NUM ; i++)
pid[i] = fork();
我就SB西西的向上面这样写,然后就挂了,问题是出在:当 i =0; fork出第一个子进程,但是循环没结束,所以子进程,会继续fork自己的子进程。 程序就抽风了。
改成下面这样就OK了, 因为fork返回给child process 0,所以用 break 防止child process keep forking .
for(i = 0; i < PROCESS_NUM; i++)
{
if(0 == (pid[i] = fork()))
break; // for child process
}
全部的代码:
#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
#include <sys/types.h>
#include <sys/stat.h>
#include <fcntl.h>
#define SIZE 20
#define PROCESS_NUM 10
int main(void)
{
int i;
pid_t pid[PROCESS_NUM];
int fd[PROCESS_NUM][2];
for(i = 0; i < PROCESS_NUM; i++)
{
pid[i] = -1;
pipe(fd[i]);
}
for(i = 0; i < PROCESS_NUM; i++)
{
if(0 == (pid[i] = fork()))
break; // for child process
}
for(i = 0; i < PROCESS_NUM; i++)
{
if(0 == pid[i])
{
close(fd[i][1]);
//child process add here
child(i, fd[i][0]);
return 0;
}
}
//father process
for(i = 0 ; i < PROCESS_NUM; i++)
close(fd[i][0]);
for(i = 0; i < PROCESS_NUM; i++)
notify_child(i, fd[i][1], 'a');
for(i = 0; i < PROCESS_NUM; i++)
notify_child(i, fd[i][1], 'q');
wait(NULL);
return 0;
}
child 和 notify_child就是简单的管道的读写操作,因为默认read pipe 是阻塞的,所以可以用作消息通知。
void child(int i, int readfd)
{
char flag;
while(1)
{
read(readfd, &flag, 1);
if(flag == 'q')
break;
else
//to do .....
}
}
void notify_child(int i, int writefd, chat flag)
{
write(writefd, &flag, 1);
}
相关文章推荐
- 使用python的os.fork()为一个主进程生成多个子进程
- fork()调用的一个趣题--fork函数能生成几个子进程???
- 一个进程 fork 多个子进程
- fork()调用的一个趣题--fork函数能生成几个子进程???
- 同一个父进程的多个子进程之间的通信
- linux中fork同时创建多个子进程的方法
- 1.写多进程,一个父进程,两个子进程,一个运行ls –l, 另一个暂停5s,父进程先阻塞等待第一个子进程的结束,然后用非阻塞等另一个进程退出,收集到第二个子进程结束的信息,父进程就返回。
- php 快速fork出指定个子进程
- fork()子进程复制父进程的缓冲区的一个例子
- 关于连续使用fork()到底产生多少个子进程问题的实践
- fork同时创建多个子进程的方法
- 实验 9-1 1. 实现以下功能 a) 调用 pipe()创建无名管道 b) 调用 fork 创建一个子进程 c) 在子进程中向管道内写入 128k 数据,打印出进程号及成功写入的字节数 d) 在父
- 编写一个程序,使用fork函数来创建一个子进程,并分别输出父子进程的进程ID
- 如何用一个父进程创建多个子进程?
- ★实验 9-2 1. 补全代码,实现以下功能 a) 调用pipe()创建无名管道 b) 调用fork创建一个子进程 c) 在父进程中向管道写入 “helloworld”, 同时打印出PID和写入
- 编写一个程序,使用fork函数来创建一个子进程,并且说明父进程和子进程的随机返回问题
- fork多个子进程 二
- linux中fork同时创建多个子进程的方法(一)
- 进程控制:linux中fork同时创建多个子进程注意事项
- fork一个子进程会拷贝父进程的什么