void swSignalInit(void) { swSignalSet(SIGHUP, SIG_IGN, 1, 0); swSignalSet(SIGINT, SIG_IGN, 1, 0); swSignalSet(SIGQUIT, SIG_IGN, 1, 0); swSignalSet(SIGTERM, swSignalHanlde, 0, 0); swSignalSet(SIGCHLD, swSignalHanlde, 1, 0); }
static int swFactoryProcess_manager_loop(swFactory *factory) { int pid, new_pid; int i, writer_pti; int reload_worker_i = 0; int ret; swFactoryProcess *object = factory->object; swServer *serv = factory->ptr; swWorker *reload_workers; reload_workers = sw_calloc(object->worker_num, sizeof(swWorker)); if (reload_workers == NULL) { swError("[manager] malloc[reload_workers] fail.\n"); return SW_ERR; } //for reload swSignalSet(SIGUSR1, swManagerSignalHanlde, 1, 0); while (swoole_running > 0) { pid = wait(NULL); swTrace("[manager] worker stop.pid=%d\n", pid); if (pid < 0) { if (manager_worker_reloading == 0) { swTrace("[Manager] wait fail. Error: %s [%d]", strerror(errno), errno); } else if (manager_reload_flag == 0) { memcpy(reload_workers, object->workers, sizeof(swWorker) * object->worker_num); manager_reload_flag = 1; goto kill_worker; } } if (swoole_running == 1) { for (i = 0; i < object->worker_num; i++) { //对比pid if (pid != object->workers[i].pid) { continue; } else { pid = 0; new_pid = swFactoryProcess_worker_spawn(factory, i); if (new_pid < 0) { swWarn("Fork worker process fail. Error: %s [%d]", strerror(errno), errno); return SW_ERR; } else { object->workers[i].pid = new_pid; } } } //task worker if(pid > 0) { swWorker *exit_worker = swHashMap_find_int(&SwooleG.task_workers.map, pid); if (exit_worker != NULL) { swProcessPool_spawn(&SwooleG.task_workers, exit_worker); } } } //reload worker kill_worker: if (manager_worker_reloading == 1) { //reload finish if (reload_worker_i >= object->worker_num) { manager_worker_reloading = 0; reload_worker_i = 0; continue; } ret = kill(reload_workers[reload_worker_i].pid, SIGTERM); if (ret < 0) { swWarn("[Manager]kill fail.pid=%d. Error: %s [%d]", reload_workers[reload_worker_i].pid, strerror(errno), errno); continue; } reload_worker_i++; } } sw_free(reload_workers); return SW_OK; }
static int swFactoryProcess_manager_loop(swFactory *factory) { int pid, new_pid; int i, writer_pti; int reload_worker_i = 0; int ret; swFactoryProcess *this = factory->object; swWorkerChild *reload_workers; reload_workers = sw_calloc(this->worker_num, sizeof(swWorkerChild)); if (reload_workers == NULL ) { swError("[manager] malloc[reload_workers] fail.\n"); return SW_ERR; } //for reload swSignalSet(SIGUSR1, swManagerSignalHanlde, 1, 0); while (1) { pid = wait(NULL ); swTrace("[manager] worker stop.pid=%d\n", pid); if (pid < 0) { if (manager_worker_reloading == 0) { swTrace("wait fail.errno=%d\n", errno); } else if (manager_reload_flag == 0) { memcpy(reload_workers, this->workers, sizeof(swWorkerChild) * this->worker_num); manager_reload_flag = 1; goto kill_worker; } } for (i = 0; i < this->worker_num; i++) { if (pid != this->workers[i].pid) continue; writer_pti = (i % this->writer_num); new_pid = swFactoryProcess_worker_spawn(factory, writer_pti, i); if (new_pid < 0) { swWarn("Fork worker process fail.Errno=%d\n", errno); return SW_ERR; } else { this->workers[i].pid = new_pid; } } //reload worker kill_worker: if (manager_worker_reloading == 1) { //reload finish if (reload_worker_i >= this->worker_num) { manager_worker_reloading = 0; reload_worker_i = 0; continue; } ret = kill(reload_workers[reload_worker_i].pid, SIGTERM); if (ret < 0) { swWarn("kill fail.pid=%d|errno=%d\n", reload_workers[reload_worker_i].pid, errno); continue; } reload_worker_i++; } } return SW_OK; }