Mercurial > hg > nginx
comparison src/os/win32/ngx_process_cycle.c @ 2738:ae81441e23f4
implement "-s signal" option for Unix
author | Igor Sysoev <igor@sysoev.ru> |
---|---|
date | Tue, 21 Apr 2009 20:25:49 +0000 |
parents | d43d73277c5c |
children | 78342383cb6e |
comparison
equal
deleted
inserted
replaced
2737:d52cf82d0d77 | 2738:ae81441e23f4 |
---|---|
1004 WaitForSingleObject(ngx_stop_event, INFINITE); | 1004 WaitForSingleObject(ngx_stop_event, INFINITE); |
1005 } | 1005 } |
1006 | 1006 |
1007 | 1007 |
1008 ngx_int_t | 1008 ngx_int_t |
1009 ngx_signal_process(ngx_cycle_t *cycle, char *sig) | 1009 ngx_os_signal_process(ngx_cycle_t *cycle, char *sig, ngx_int_t pid) |
1010 { | 1010 { |
1011 size_t n; | 1011 HANDLE ev; |
1012 HANDLE ev; | 1012 ngx_int_t rc; |
1013 ngx_int_t rc, pid; | 1013 char evn[NGX_PROCESS_SYNC_NAME]; |
1014 ngx_file_t file; | |
1015 ngx_core_conf_t *ccf; | |
1016 u_char buf[NGX_INT64_LEN + 2]; | |
1017 char evn[NGX_PROCESS_SYNC_NAME]; | |
1018 | |
1019 ngx_log_error(NGX_LOG_NOTICE, cycle->log, 0, "signal process started"); | |
1020 | |
1021 ccf = (ngx_core_conf_t *) ngx_get_conf(cycle->conf_ctx, ngx_core_module); | |
1022 | |
1023 file.name = ccf->pid; | |
1024 file.log = cycle->log; | |
1025 | |
1026 file.fd = ngx_open_file(file.name.data, NGX_FILE_RDONLY, | |
1027 NGX_FILE_OPEN, NGX_FILE_DEFAULT_ACCESS); | |
1028 | |
1029 if (file.fd == NGX_INVALID_FILE) { | |
1030 ngx_log_error(NGX_LOG_ERR, cycle->log, ngx_errno, | |
1031 ngx_open_file_n " \"%s\" failed", file.name.data); | |
1032 return 1; | |
1033 } | |
1034 | |
1035 rc = 1; | |
1036 | |
1037 n = ngx_read_file(&file, buf, NGX_INT64_LEN + 2, 0); | |
1038 | |
1039 if (n == NGX_ERROR) { | |
1040 goto failed; | |
1041 } | |
1042 | |
1043 while (n-- && (buf[n] == CR || buf[n] == LF)) { /* void */ } | |
1044 | |
1045 pid = ngx_atoi(buf, ++n); | |
1046 | |
1047 if (pid == NGX_ERROR) { | |
1048 ngx_log_error(NGX_LOG_ERR, cycle->log, 0, | |
1049 "invalid PID number \"%*s\" in \"%s\"", | |
1050 n, buf, file.name.data); | |
1051 goto failed; | |
1052 } | |
1053 | 1014 |
1054 ngx_sprintf((u_char *) evn, "ngx_%s_%ul%Z", sig, pid); | 1015 ngx_sprintf((u_char *) evn, "ngx_%s_%ul%Z", sig, pid); |
1055 | 1016 |
1056 ev = OpenEvent(EVENT_MODIFY_STATE, 0, evn); | 1017 ev = OpenEvent(EVENT_MODIFY_STATE, 0, evn); |
1057 if (ev == NULL) { | 1018 if (ev == NULL) { |
1058 ngx_log_error(NGX_LOG_ERR, cycle->log, ngx_errno, | 1019 ngx_log_error(NGX_LOG_ERR, cycle->log, ngx_errno, |
1059 "OpenEvent(\"%s\") failed", evn); | 1020 "OpenEvent(\"%s\") failed", evn); |
1060 goto failed; | 1021 return 1; |
1061 } | 1022 } |
1062 | 1023 |
1063 if (SetEvent(ev) == 0) { | 1024 if (SetEvent(ev) == 0) { |
1064 ngx_log_error(NGX_LOG_ALERT, cycle->log, ngx_errno, | 1025 ngx_log_error(NGX_LOG_ALERT, cycle->log, ngx_errno, |
1065 "SetEvent(\"%s\") failed", evn); | 1026 "SetEvent(\"%s\") failed", evn); |
1027 rc = 1; | |
1028 | |
1066 } else { | 1029 } else { |
1067 rc = 0; | 1030 rc = 0; |
1068 } | 1031 } |
1069 | 1032 |
1070 ngx_close_handle(ev); | 1033 ngx_close_handle(ev); |
1071 | |
1072 failed: | |
1073 | |
1074 if (ngx_close_file(file.fd) == NGX_FILE_ERROR) { | |
1075 ngx_log_error(NGX_LOG_ALERT, cycle->log, ngx_errno, | |
1076 ngx_close_file_n " \"%s\" failed", file.name.data); | |
1077 } | |
1078 | 1034 |
1079 return rc; | 1035 return rc; |
1080 } | 1036 } |
1081 | 1037 |
1082 | 1038 |