星期二, 五月 08, 2007

Apache运行时库中的进程锁

#include
#include "apr_pools.h"
#include "apr_general.h"
#include "apr_pools.h"
#include "apr_errno.h"
#include "apr_file_io.h"

#include "apr.h"
#include "apr_shm.h"
#include "apr_file_io.h"
#include "apr_proc_mutex.h"
#include "apr_proc_mutex.h"
#include "apr_errno.h"
#include "apr_general.h"
#include "apr_getopt.h"
#include "errno.h"
#include
#include
#include


#define MAX_ITER 200
#define CHILDREN 6
#define MAX_COUNTER (MAX_ITER * CHILDREN)


int main(int argc, char* argv[])
{
apr_pool_t *pool;
apr_status_t rv;
const char* lockname = "/tmp/tlock";
apr_lockmech_e mech=APR_LOCK_DEFAULT;
/*
mech=APR_LOCK_POSIXSEM;
mech=APR_LOCK_FCNTL;
mech=APR_LOCK_FLOCK;
mech=APR_LOCK_SYSVSEM;
mech=APR_LOCK_POSIXSEM;
mech=APR_LOCK_PROC_PTHREAD;
*/

static apr_proc_mutex_t *proc_lock;

apr_initialize();

rv = apr_pool_create(&pool, NULL);
assert(rv==APR_SUCCESS);
rv = apr_proc_mutex_create(&proc_lock, lockname, mech, pool);
assert(rv==APR_SUCCESS);

printf("Init OK\ndefulat=%s\nmutex=%s\n",apr_proc_mutex_defname(),apr_proc_mutex_name(proc_lock));
#if USE_FORK
if(fork()!=0) {
#endif
if(argc==2 && strcmp(argv[1],"init")==0)
{
do{
printf("P Enter to lock\n");
getchar();
if (apr_proc_mutex_lock(proc_lock))
{
printf("P apr_proc_mutex_lock failed\n");
exit(1);
}
printf("P Enter to unlock\n");
getchar();
if (apr_proc_mutex_unlock(proc_lock))
{
printf("P apr_proc_mutex_unlock failed\n");
exit(1);
}
}while(1);
exit(0);
}
#if USE_FORK
}else {
#endif
printf("Child Mode\n");
if (apr_proc_mutex_child_init(&proc_lock, lockname, pool))
{
printf("C failed apr_proc_mutex_child_init\n");
exit(1);
}
do{
printf("C Enter to lock\n");
getchar();
if (apr_proc_mutex_lock(proc_lock))
{
printf("C apr_proc_mutex_lock failed\n");
exit(1);
}
printf("C Enter to unlock\n");
getchar();
if (apr_proc_mutex_unlock(proc_lock))
{
printf("apr_proc_mutex_unlock failed\n");
exit(1);
}
}while(1);

#if USE_FORK
}
#endif

exit(0);
return 0;
}

上面的程序如果不定义USE_FORK是没有办法正常用性的,通过通过test init启动一个进程,用test运行另外一个进程是无法完成互斥的。如果定义USE_FORK那么test init会创建父子两个进程,能够互斥。

原因时apr_proc_mutex其实用的是无名锁,所以只能在fork创建的进程之间通信,否则就会失败。只能老老实实地进行系统调用了!

没有评论: