Apache进程同步

Posted

技术标签:

【中文标题】Apache进程同步【英文标题】:Apache process synchronization 【发布时间】:2021-06-06 19:29:04 【问题描述】:

目标是阻止 Apache httpd 进程,直到 15 秒或另一个进程发出 SIGUSR1 信号。被阻塞进程的进程 ID 存储在其他进程可以访问的数据库中。我正在使用 pselect()/kill() 函数来尝试这样做。

从我的日志中,我知道kill(pid, SIGUSR1) 在 15 秒超时之前执行,并且使用了正确的 pid。但是,pselect() 总是超时(尽管发送了 SIGUSR1)。

这在 Apache HTTP 服务器架构中是不可能的吗?

这里是被阻塞进程的代码 sn-ps,以及试图解除阻塞的进程。

savePid(getpid());
struct timespec t = 15, 0;
sigset_t mask;
sigemptyset(&mask);
sigaddset(&mask, SIGUSR1);
res = pselect(0, NULL, NULL, NULL, &t, &mask);
if (res == 0) 
        /*
         *  timeout
         */
        ...
 else 
       /*
        * interrupted
        */
        ...

另一个进程已决定“解除阻塞”在 pselect 中阻塞的进程,并发出一个

pid = getStoredPid();
kill(pid, SIGUSR1)
Apacher Server Information:
Server version: Apache/2.4.41 (Unix)
Server built:   Aug  3 2020 16:34:41
Server's Module Magic Number: 20120211:88
Server loaded:  APR 1.7.0, APR-UTIL 1.6.1
Compiled using: APR 1.7.0, APR-UTIL 1.6.1
Architecture:   64-bit
Server MPM:     prefork
  threaded:     no
    forked:     yes (variable process count)
Server compiled with....
 -D APR_HAS_SENDFILE
 -D APR_HAS_MMAP
 -D APR_HAVE_IPV6 (IPv4-mapped addresses enabled)
 -D APR_USE_PROC_PTHREAD_SERIALIZE
 -D APR_USE_PTHREAD_SERIALIZE
 -D SINGLE_LISTEN_UNSERIALIZED_ACCEPT
 -D APR_HAS_OTHER_CHILD
 -D AP_HAVE_RELIABLE_PIPED_LOGS
 -D DYNAMIC_MODULE_LIMIT=256
 -D HTTPD_ROOT="/usr"
 -D SUEXEC_BIN="no"
 -D DEFAULT_PIDLOG="/var/logs/httpd.pid"
 -D DEFAULT_SCOREBOARD="logs/apache_runtime_status"
 -D DEFAULT_ERRORLOG="logs/error_log"
 -D AP_TYPES_CONFIG_FILE="/etc/apache/mime.types"
 -D SERVER_CONFIG_FILE="/etc/apache/httpd.conf"

【问题讨论】:

您是否尝试向 apache 进程发送信号 SIGSTOPSIGCONT 您认为 pselect 的掩码参数有什么作用?手册页对此有何评论? 【参考方案1】:

经过多一点测试,我发现这是可行的:

函数 dummy_handler 什么都不做:static void dummy_handler()

```
struct timespec t = 15, 0;
struct sigaction sa;
sa.sa_handler = dummy_handler;
sigemptyset(&sa.sa_mask);
sigaction(SIGUSR1, &sa, NULL);
res = pselect(0, NULL, NULL, NULL, &t, &sa.sa_mask);
```

【讨论】:

以上是关于Apache进程同步的主要内容,如果未能解决你的问题,请参考以下文章

进程同步详解(进程同步机制遵循规则信号量机制信号量的应用,经典进程同步问题)

进程同步为什么不叫进程协调?

linux 下进程间的同步机制都有哪些

进程同步

进程同步——经典的同步问题

10、同步互斥机制3(进程通信)(操作系统笔记)