近日,程序开发用到了第一个第三方库,我自己的程序在main里,直接fork了一个子进程,父进程退出,发现fork出来的进程无法正常工作,如果不fork一切正常。
经过研究第三方的代码,发现在第三方库里定义了一个全局变量,这个全局变量的初始化,启动了一个线程。
现在问题就比较明确了。
是我的程序在fork之前,主进程就有了其他的线程,主进程退出之后,线程即停止执行,造成子进程执行异常。示例代码如下:
- #include <stdio.h>
- #include <stdlib.h>
- #include <unistd.h>
- #include <string.h>
- #include <errno.h>
- #include <pthread.h>
- #include <signal.h>
- #include <semaphore.h>
- typedef struct _singletone_param{
- int running;
- sem_t sem;
- }singletone_param_t;
- void * singletone_func(void* param){
- singletone_param_t * pparam=(singletone_param_t*)param;
- sem_post(&(pparam->sem));
- while(pparam->running){
- printf("i am running[pid=%u,tid=%lu]\n",getpid(),pthread_self());
- sleep(1);
- }
- }
- class singletone_t{
- public:
- static singletone_t* Instance(){
- static singletone_t obj;
- return &obj;
- }
- ~singletone_t(){
- if(tid){
- param.running=0;
- pthread_join(tid,NULL);
- }
- sem_destroy(&(param.sem));
- }
- private:
- singletone_param_t param;
- pthread_t tid;
- singletone_t(){
- tid=0;
- param.running=1;
- sem_init(&(param.sem),0,0);
- if(pthread_create(&tid,NULL,singletone_func,¶m) !=0){
- param.running=0;
- printf("create thrad failed[%d(%s)]\n",errno,strerror(errno));
- }
- else{
- while ( sem_wait(&(param.sem)) == -1 && errno == EINTR){
- continue;
- }
- }
- }
- };
- int child_running=0;
- void sig_handler( int sig_no ){
- if(SIGINT==sig_no){
- child_running=0;
- }
- }
- singletone_t* obj = singletone_t::Instance();//全局变量
- int main(int argc,char **argv){
- pid_t pid=0;
- signal(SIGINT,sig_handler);
- if( (pid=fork()) > 0 ){
- printf("child process started:%u\n",pid);
- return 0;
- }
- else if( pid<0 ){
- printf("child process start failed[%d(%s)]\n",errno,strerror(errno));
- }
- else{
- //singletone_t* obj2 = singletone_t::Instance();如果放到这里,就没有问题了
- child_running=1;
- while(child_running){
- sleep(1);
- }
- }
- return 0;
- }
阅读(4089) | 评论(0) | 转发(1) |