- 论坛徽章:
- 0
|
20可用积分
我的问题:
好久没有写程序了,最近公司的项目比较急,接到一个批处理多进程并发的任务。
我的主要设计是这样的:
1、以守护进程的方式运行主程序。
2、主程序根据数据库配置的作业列表,读取作业,产生一个进程去出去,直到最大如5个,就停止再产生进程。
3、如果一个子进程结束了,主程序就监控到,从数据库作业表再读取一个作业,产生一个进程去处理。
4、也就是总是保持5个进程同时运行,结束一个,主程序就再分配任务,产生一个新进程。
5、将运行的过程打到后台的log中,并且主进程终止时,各个子进程也相应跟着终止。
scutan (冬日夜雨) 大侠非常热心,给我如下架构,我试了一下,可以演示。
但我还是有几个问题:
1、我如何给子进程传递参数呢?我的设计如下:
(1) 主进程取得作业步骤
EXEC SQL SELECT rq, stepid into :srq, stepid from table_parrall;
(2) 作业的处理函数为: int f_dostep(const char * asrq, const char *asstepid);
我在fork是如何来传递参数呢?
2、我的日志如何来大呢?主进程和子进程都往一个日志文件中写可以吗?
3、我如何来停止我的主进程和进程呢?并保持里面对数据库的事务一致。
4、我如何来控制,主进程不被重复启动呢?通过锁pid文件?最好方案是什么呢?
问题很多,希望scutan (冬日夜雨) 等大侠多多帮忙,我周一就要拿出个版本,没时间研究了,只好请教了。
原来的积分已经送人了,现在也没多少积分送了:(
在如下的基础上,如何来继续完善呢?十分感谢
#include<stdio.h>
#include<stdlib.h>
#include<unistd.h>
#include<sys/types.h>
#include<sys/wait.h>
#include<signal.h>
#include<sys/resource.h>
#include<fcntl.h>
#include<sys/time.h>
#include<sys/stat.h>
void fun(int i)
{
while(1)
{
printf("i=%d\n", i);
sleep(1);
}
}
int daemon_init(void)
{
pid_t pid;
struct sigaction sa;
struct rlimit r1;
int i;
if ((pid = fork()) < 0)
return -1;
else if (pid != 0)
exit(0);
if (setsid() < 0)
exit(1);
sa.sa_handler = SIG_IGN;
sigemptyset(&sa.sa_mask);
sa.sa_flags = 0;
if (sigaction(SIGHUP, &sa, NULL) < 0)
{
printf("sigaction error\n");
exit(1);
}
if ((pid = fork()) < 0)
return -1;
else if (pid != 0)
exit(0);
if (chdir("/") < 0)
return -1;
umask(0);
if (getrlimit(RLIMIT_NOFILE, &r1) < 0)
{
printf("get file limit error\n");
exit(1);
}
if (r1.rlim_max == RLIM_INFINITY)
r1.rlim_max = 1024;
for(i = 0; i < r1.rlim_max; i++)
close(i);
return 0;
}
int main()
{
pid_t pid;
int i = 5;
int n;
int j = 0;
n = daemon_init();
if (n != 0)
{
printf("daemon error\n");
exit(1);
}
while (i--)
{
if ((pid = fork()) < 0)
{
printf("fork %d error\n", 5-i);
exit(1);
}
if (pid == 0)
{
fun(5-i-1);
exit(0);
}
}
j = 5;
while (wait(NULL) > 0)
{
if ((pid = fork()) < 0)
{
printf("fork %d error\n", j);
exit(1);
}
if (pid == 0)
{
fun(j);
exit(0);
}
j++;
}
return 0;
} |
[ 本帖最后由 flyhu 于 2007-8-24 22:02 编辑 ] |
最佳答案
查看完整内容
1.如果说你主进程是在取得了作业之后再进行fork的话,那就不需要向你的子进程传递参数了.因为你fork之后,你的子进程已经继承了父进程的所有东西,包括你需要传递的参数.如果说你是先fork了子进程,然后父进程再去取得作业的话,那就需要使用进程间通信的机制来传递参数了.考虑到你传递的参数应该不多,使用管道是最简单的方式.2.主进程和子进程可以同时向一个文件中写,使用write,一次一行.3.你可以自定义SIGUSR1之类的信号处理机制.如果 ...
|