当前位置: 技术问答>linux和unix
一个daemon+多线程的程序的设计问题
来源: 互联网 发布时间:2016-08-25
本文导语: 问题描述: 我想在main()里面fork()一个新进程,然后用daemon(1,0)把它后台化,然后在这个守护子进程中调用pthread_create创建多个子线程用来并行执行任务。 1。这几个线程要从一个文件夹里按照一定顺序(比...
问题描述:
我想在main()里面fork()一个新进程,然后用daemon(1,0)把它后台化,然后在这个守护子进程中调用pthread_create创建多个子线程用来并行执行任务。
1。这几个线程要从一个文件夹里按照一定顺序(比如threads创建的先后顺序)各自取得若干文件去处理,那么这个工作队列(给线程处理的文件)的分配工作是不是应该在主进程里进行,然后子进程中的新线程们去按规则取就可以了??或者直接在新的子进程中做这个分配工作也可以?
2。接下在父进程,也就是有控制终端的进程中控制子进程的结束,是应该调用kill(pid)吗?这样做会不会用什么问题?需不需要显式在子进程中调用pthread_exit()??怎么让子进程知道父进程让它停止,然后安全妥善地关掉它的子线程,然后退出??
刚接触linux编程,一上来就接触多线程,后台,进程信号处理,有点混乱,请高手指教!
我想在main()里面fork()一个新进程,然后用daemon(1,0)把它后台化,然后在这个守护子进程中调用pthread_create创建多个子线程用来并行执行任务。
1。这几个线程要从一个文件夹里按照一定顺序(比如threads创建的先后顺序)各自取得若干文件去处理,那么这个工作队列(给线程处理的文件)的分配工作是不是应该在主进程里进行,然后子进程中的新线程们去按规则取就可以了??或者直接在新的子进程中做这个分配工作也可以?
2。接下在父进程,也就是有控制终端的进程中控制子进程的结束,是应该调用kill(pid)吗?这样做会不会用什么问题?需不需要显式在子进程中调用pthread_exit()??怎么让子进程知道父进程让它停止,然后安全妥善地关掉它的子线程,然后退出??
刚接触linux编程,一上来就接触多线程,后台,进程信号处理,有点混乱,请高手指教!
|
1,这个工作队列可以在父进程建立,也可以在子进程中建立;但最好是在子进程建立,因为在父进程中建立的话,子进程有同样的一份copy,但是在整个程序退出时,父进程需要做些额外的清理工作,这样不好;
2, 因为子进程中有多个线程在运行,所以不能直接用kill(pid),如果你直接这样子,子进程直接退出,那么那些工作线程的状态会怎么样?也会直接退出,这样可能有些资源得不到正确释放,有些处理可能不完全.我的建议是用一信号,比如,SIGUSR1,子进程的主线程等待这个信号(sigwait,pthread_sigmask)子进程的工作线程用pthread_sigmask屏掉SIGUSR1信号;在子进程收到SIGUSR1信号时,通过某种机制告诉其工作线程让工作线程退出(你可以设某些变量,比如,设一个 int to_stop;初值为0;工作进程可以检查这个变量来决定是否退出,如果要退出,先作一些处理工作,然后退出;也可以用pthread_cancel来结束工作线程,当然,工作线程要用pthread_cleanup_push注册一些清理函数)
2, 因为子进程中有多个线程在运行,所以不能直接用kill(pid),如果你直接这样子,子进程直接退出,那么那些工作线程的状态会怎么样?也会直接退出,这样可能有些资源得不到正确释放,有些处理可能不完全.我的建议是用一信号,比如,SIGUSR1,子进程的主线程等待这个信号(sigwait,pthread_sigmask)子进程的工作线程用pthread_sigmask屏掉SIGUSR1信号;在子进程收到SIGUSR1信号时,通过某种机制告诉其工作线程让工作线程退出(你可以设某些变量,比如,设一个 int to_stop;初值为0;工作进程可以检查这个变量来决定是否退出,如果要退出,先作一些处理工作,然后退出;也可以用pthread_cancel来结束工作线程,当然,工作线程要用pthread_cleanup_push注册一些清理函数)