4679 lines
149 KiB
C++
4679 lines
149 KiB
C++
|
|
|||
|
|
|||
|
#ifndef __ZCPPMAIN__PROCESS_LINUX_H__
|
|||
|
#define __ZCPPMAIN__PROCESS_LINUX_H__
|
|||
|
|
|||
|
|
|||
|
#include "ZCppMain/ZMainHead.H"
|
|||
|
|
|||
|
#include <fstream>
|
|||
|
#include <sys/time.h>
|
|||
|
#include <signal.h>
|
|||
|
#include <sys/shm.h>
|
|||
|
#include <sys/sem.h>
|
|||
|
#include <sys/mman.h>
|
|||
|
#include <unistd.h>
|
|||
|
#include <semaphore.h>
|
|||
|
#include <fcntl.h>
|
|||
|
#include <pthread.h>
|
|||
|
|
|||
|
|
|||
|
namespace ZNsMain
|
|||
|
{
|
|||
|
|
|||
|
/*////////////////////////////////////////////////////////////////////////
|
|||
|
|
|||
|
<EFBFBD><EFBFBD> <EFBFBD><EFBFBD><EFBFBD>κ<EFBFBD><EFBFBD><EFBFBD> <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <EFBFBD>Լ<EFBFBD><EFBFBD><EFBFBD> <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ϸ<EFBFBD> 0 <EFBFBD><EFBFBD> <EFBFBD><EFBFBD>ȯ<EFBFBD>ϴµ<EFBFBD> <EFBFBD><EFBFBD> <EFBFBD><EFBFBD><EFBFBD><EFBFBD> enum <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ѵ<EFBFBD>.
|
|||
|
|
|||
|
////////////////////////////////////////////////////////////////////////*/
|
|||
|
|
|||
|
namespace ZNsEnum
|
|||
|
{
|
|||
|
|
|||
|
// <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> <20>Լ<EFBFBD><D4BC><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD>쿡<EFBFBD><ECBFA1> <20><>å<EFBFBD><C3A5> <20><><EFBFBD><EFBFBD>, ZEThread_Invalid <20>̿<EFBFBD><CCBF><EFBFBD> <20><><EFBFBD><EFBFBD> <20><>ȯ<EFBFBD><C8AF> <20><><EFBFBD><EFBFBD> <20>ִ<EFBFBD>.
|
|||
|
|
|||
|
enum ZEThread
|
|||
|
{
|
|||
|
ZEThread_OK =0 ,
|
|||
|
ZEThread_Invalid=EINVAL , // <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> <20>Լ<EFBFBD> <20><><EFBFBD><EFBFBD>.
|
|||
|
ZEThread_TimeOut=ETIMEDOUT
|
|||
|
};/*
|
|||
|
enum ZEThread*/
|
|||
|
|
|||
|
|
|||
|
/*////////////////////////////////////////
|
|||
|
|
|||
|
<EFBFBD><EFBFBD> barrier <EFBFBD><EFBFBD> <EFBFBD><EFBFBD>ǥ<EFBFBD><EFBFBD><EFBFBD><EFBFBD> <EFBFBD><EFBFBD>ȯ<EFBFBD><EFBFBD>.
|
|||
|
|
|||
|
<EFBFBD><EFBFBD> barrier <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> üũ<EFBFBD><EFBFBD> <EFBFBD><EFBFBD>
|
|||
|
|
|||
|
BarrierClass VO_BarrierClass;
|
|||
|
|
|||
|
if(VO_BarrierClass.Init()==ZEBarrier_NO)
|
|||
|
{
|
|||
|
// some code
|
|||
|
}
|
|||
|
|
|||
|
<EFBFBD><EFBFBD> <EFBFBD><EFBFBD><EFBFBD><EFBFBD> <EFBFBD><EFBFBD><EFBFBD><EFBFBD>.
|
|||
|
|
|||
|
if(VO_BarrierClass.Init()!=ZEBarrier_OK)
|
|||
|
{
|
|||
|
// some code
|
|||
|
}
|
|||
|
|
|||
|
<EFBFBD><EFBFBD> <EFBFBD>ؾ<EFBFBD> <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ϴ<EFBFBD>.
|
|||
|
|
|||
|
////////////////////////////////////////*/
|
|||
|
|
|||
|
enum ZEBarrier
|
|||
|
{
|
|||
|
ZEBarrier_NO = -1,
|
|||
|
ZEBarrier_OK = 0
|
|||
|
};/*
|
|||
|
enum ZEBarrier*/
|
|||
|
|
|||
|
}/*
|
|||
|
namespace ZNsEnum*/
|
|||
|
|
|||
|
|
|||
|
/*/////////////////////////////////////////////////////////////////////////////////////
|
|||
|
|
|||
|
<EFBFBD><EFBFBD> <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> pthread <EFBFBD><EFBFBD><EFBFBD>̺귯<EFBFBD><EFBFBD><EFBFBD><EFBFBD> <EFBFBD><EFBFBD>ũ<EFBFBD><EFBFBD> <EFBFBD>ɾ<EFBFBD><EFBFBD><EFBFBD> <EFBFBD><EFBFBD>.
|
|||
|
|
|||
|
<EFBFBD><EFBFBD> <EFBFBD><EFBFBD><EFBFBD><EFBFBD> <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> 3.0 <EFBFBD><EFBFBD> <EFBFBD><EFBFBD><EFBFBD><EFBFBD> sys/sem.h <EFBFBD><EFBFBD><EFBFBD><EFBFBD> <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <EFBFBD><EFBFBD><EFBFBD><EFBFBD> <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <EFBFBD><EFBFBD><EFBFBD><EFBFBD> <EFBFBD>ִ<EFBFBD>.
|
|||
|
|
|||
|
The user should define a union like the following to use it for arguments
|
|||
|
for `semctl'.
|
|||
|
|
|||
|
union semun
|
|||
|
{
|
|||
|
int val; <= value for SETVAL
|
|||
|
struct semid_ds *buf; <= buffer for IPC_STAT & IPC_SET
|
|||
|
unsigned short int *array; <= array for GETALL & SETALL
|
|||
|
struct seminfo *__buf; <= buffer for IPC_INFO
|
|||
|
};
|
|||
|
|
|||
|
Previous versions of this file used to define this union but this is
|
|||
|
incorrect. One can test the macro _SEM_SEMUN_UNDEFINED to see whether
|
|||
|
one must define the union or not.
|
|||
|
|
|||
|
#define _SEM_SEMUN_UNDEFINED 1
|
|||
|
|
|||
|
<EFBFBD><EFBFBD> IPC object <EFBFBD><EFBFBD> <EFBFBD>÷<EFBFBD><EFBFBD>״<EFBFBD> IPC_CREAT, IPC_EXCL, 0 <EFBFBD><EFBFBD> <EFBFBD><EFBFBD> <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <EFBFBD>ϳ<EFBFBD><EFBFBD≯<EFBFBD>, 0 <EFBFBD≯<EFBFBD> <EFBFBD>ش<EFBFBD> <EFBFBD><EFBFBD>
|
|||
|
<EFBFBD><EFBFBD>ȭ object <EFBFBD><EFBFBD> <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <EFBFBD><EFBFBD><EFBFBD><EFBFBD> <EFBFBD><EFBFBD><EFBFBD><EFBFBD>.
|
|||
|
|
|||
|
<semaphore.h> <EFBFBD><EFBFBD><EFBFBD>Ͽ<EFBFBD> <EFBFBD>ִ<EFBFBD> <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <EFBFBD>Լ<EFBFBD><EFBFBD><EFBFBD> <EFBFBD><EFBFBD><EFBFBD>μ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <EFBFBD><EFBFBD><EFBFBD>쿡<EFBFBD><EFBFBD> <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <EFBFBD>ʰ<EFBFBD> <EFBFBD>ִ<EFBFBD>.
|
|||
|
<EFBFBD><EFBFBD><EFBFBD><EFBFBD> <EFBFBD><EFBFBD><EFBFBD>μ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <EFBFBD><EFBFBD><EFBFBD>쿡<EFBFBD><EFBFBD> <sys/sem.h> <EFBFBD><EFBFBD> <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <EFBFBD>Լ<EFBFBD><EFBFBD><EFBFBD> <EFBFBD><EFBFBD><EFBFBD><EFBFBD> <EFBFBD>Ѵ<EFBFBD>.
|
|||
|
|
|||
|
-- 2004-07-12
|
|||
|
|
|||
|
/////////////////////////////////////////////////////////////////////////////////////*/
|
|||
|
|
|||
|
union semun
|
|||
|
{
|
|||
|
int val ; // value for SETVAL
|
|||
|
struct semid_ds* buf ; // buffer for IPC_STAT & IPC_SET
|
|||
|
unsigned short int* array; // array for GETALL & SETALL
|
|||
|
struct seminfo* __buf ; // buffer for IPC_INFO
|
|||
|
};/*
|
|||
|
union semun*/
|
|||
|
|
|||
|
|
|||
|
/*//////////////////////////////////////////////////////////////////
|
|||
|
|
|||
|
<EFBFBD><EFBFBD> <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>쿡<EFBFBD><EFBFBD><EFBFBD><EFBFBD> <EFBFBD><EFBFBD><EFBFBD><EFBFBD>ȭ object <EFBFBD><EFBFBD> <EFBFBD≯<EFBFBD><EFBFBD><EFBFBD> <EFBFBD>ο<EFBFBD><EFBFBD><EFBFBD> <EFBFBD><EFBFBD> <EFBFBD>ִµ<EFBFBD>, <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
|
|||
|
<EFBFBD><EFBFBD><EFBFBD><EFBFBD> <EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ű<EFBFBD><EFBFBD> <EFBFBD>ο<EFBFBD><EFBFBD><EFBFBD> <EFBFBD><EFBFBD> <EFBFBD>ִ<EFBFBD>. <EFBFBD><EFBFBD><EFBFBD><EFBFBD> ȣȯ<EFBFBD><EFBFBD> <EFBFBD><EFBFBD><EFBFBD>Ͽ<EFBFBD> <EFBFBD≯<EFBFBD><EFBFBD><EFBFBD><EFBFBD>κ<EFBFBD><EFBFBD><EFBFBD>
|
|||
|
Ű<EFBFBD><EFBFBD> <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ϴ<EFBFBD> <EFBFBD>Լ<EFBFBD><EFBFBD><EFBFBD> <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>. <EFBFBD><EFBFBD><EFBFBD><EFBFBD> <EFBFBD≯<EFBFBD><EFBFBD><EFBFBD> <EFBFBD>ȴٸ<EFBFBD> ftok() <EFBFBD>Լ<EFBFBD>
|
|||
|
|
|||
|
key_t ftok(const char *path, int id);
|
|||
|
|
|||
|
<EFBFBD><EFBFBD> <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ϴ<EFBFBD> <EFBFBD>͵<EFBFBD> <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>̴<EFBFBD>.
|
|||
|
|
|||
|
//////////////////////////////////////////////////////////////////*/
|
|||
|
|
|||
|
static inline long ZfGetKeyNum(const char* const AP_Name)
|
|||
|
{
|
|||
|
int VI_Index =-1 ;
|
|||
|
long VL_KeyID = 1 ;
|
|||
|
|
|||
|
if(AP_Name!=0)
|
|||
|
{
|
|||
|
while(AP_Name[++VI_Index]!=0)
|
|||
|
{
|
|||
|
VL_KeyID += AP_Name[VI_Index]*(VI_Index+1) ;
|
|||
|
}/*
|
|||
|
while(AP_Name[++VI_Index]!=0)*/
|
|||
|
}/*
|
|||
|
if(AP_Name!=0)*/
|
|||
|
|
|||
|
return VL_KeyID;
|
|||
|
}/*
|
|||
|
static inline long ZfGetKeyNum(const char* const AP_Name)*/
|
|||
|
|
|||
|
|
|||
|
/*/////////////////////////////////////////////////////////////////////////////
|
|||
|
|
|||
|
<EFBFBD><EFBFBD> <EFBFBD>ñ׳<EFBFBD><EFBFBD><EFBFBD> <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <EFBFBD>ʴ´<EFBFBD>. <EFBFBD><EFBFBD> <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <EFBFBD>̺<EFBFBD>Ʈ<EFBFBD><EFBFBD> <EFBFBD><EFBFBD><EFBFBD>̾ <EFBFBD>ټ<EFBFBD> <EFBFBD><EFBFBD> <EFBFBD><EFBFBD><EFBFBD>ߴٰ<EFBFBD> <EFBFBD>ؼ<EFBFBD>
|
|||
|
<EFBFBD><EFBFBD><EFBFBD>μ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <EFBFBD>ñ׳<EFBFBD><EFBFBD><EFBFBD> <EFBFBD>ټ<EFBFBD> <EFBFBD><EFBFBD> <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <EFBFBD><EFBFBD><EFBFBD><EFBFBD> <EFBFBD>ʴ´<EFBFBD>. <EFBFBD>̷<EFBFBD><EFBFBD><EFBFBD> <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
|
|||
|
sa_mask <EFBFBD><EFBFBD> <EFBFBD><EFBFBD><EFBFBD><EFBFBD> <EFBFBD>ذ<EFBFBD><EFBFBD><EFBFBD> <EFBFBD><EFBFBD> <EFBFBD>ִ<EFBFBD>. sa_mask <EFBFBD><EFBFBD> <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <EFBFBD>ñ׳ε<EFBFBD><EFBFBD><EFBFBD> <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <EFBFBD>̺<EFBFBD>Ʈ<EFBFBD><EFBFBD>
|
|||
|
<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>̼<EFBFBD> <EFBFBD>ټ<EFBFBD><EFBFBD><EFBFBD> <EFBFBD><EFBFBD><EFBFBD>ϴ<EFBFBD> <EFBFBD><EFBFBD><EFBFBD><EFBFBD> <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <EFBFBD>ñ׳<EFBFBD><EFBFBD><EFBFBD> <EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ų<EFBFBD><EFBFBD>. <EFBFBD><EFBFBD> ù<EFBFBD><EFBFBD>° <EFBFBD>ñ<EFBFBD>
|
|||
|
<EFBFBD><EFBFBD><EFBFBD><EFBFBD> ó<EFBFBD><EFBFBD><EFBFBD>Ǵ<EFBFBD> <EFBFBD><EFBFBD><EFBFBD><EFBFBD> <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <EFBFBD>ñ׳ε<EFBFBD><EFBFBD><EFBFBD> <EFBFBD><EFBFBD><EFBFBD><EFBFBD>ŷ <EFBFBD><EFBFBD><EFBFBD>¿<EFBFBD> <EFBFBD>ְ<EFBFBD> <EFBFBD>ȴ<EFBFBD>.
|
|||
|
|
|||
|
-- TCP/IP <EFBFBD><EFBFBD><EFBFBD><EFBFBD> <EFBFBD><EFBFBD><EFBFBD>α<EFBFBD><EFBFBD><EFBFBD> (<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <EFBFBD><EFBFBD>) 245 Page
|
|||
|
|
|||
|
<EFBFBD><EFBFBD> <EFBFBD>߿<EFBFBD> Ansi, Posix <EFBFBD>ñ׳<EFBFBD> <EFBFBD><EFBFBD><EFBFBD><EFBFBD>
|
|||
|
|
|||
|
#define SIG_ERR ((__sighandler_t) -1) // Error return.
|
|||
|
#define SIG_DFL ((__sighandler_t) 0) // Default action.
|
|||
|
#define SIG_IGN ((__sighandler_t) 1) // Ignore signal.
|
|||
|
|
|||
|
#define SIGHUP 1 // Hangup (POSIX)
|
|||
|
#define SIGINT 2 // Interrupt (ANSI)
|
|||
|
#define SIGQUIT 3 // Quit (POSIX)
|
|||
|
#define SIGILL 4 // Illegal instruction (ANSI)
|
|||
|
#define SIGTRAP 5 // Trace trap (POSIX)
|
|||
|
#define SIGABRT 6 // Abort (ANSI)
|
|||
|
#define SIGFPE 8 // Floating-point exception (ANSI)
|
|||
|
#define SIGKILL 9 // Kill, unblockable (POSIX)
|
|||
|
#define SIGUSR1 10 // User-defined signal 1 (POSIX)
|
|||
|
#define SIGSEGV 11 // Segmentation violation (ANSI)
|
|||
|
#define SIGUSR2 12 // User-defined signal 2 (POSIX)
|
|||
|
#define SIGPIPE 13 // Broken pipe (POSIX)
|
|||
|
#define SIGALRM 14 // Alarm clock (POSIX)
|
|||
|
#define SIGTERM 15 // Termination (ANSI)
|
|||
|
#define SIGSTKFLT 16 // Stack fault
|
|||
|
#define SIGCHLD 17 // Child status has changed (POSIX)
|
|||
|
#define SIGCONT 18 // Continue (POSIX)
|
|||
|
#define SIGSTOP 19 // Stop, unblockable (POSIX)
|
|||
|
#define SIGTSTP 20 // Keyboard stop (POSIX)
|
|||
|
#define SIGTTIN 21 // Background read from tty (POSIX)
|
|||
|
#define SIGTTOU 22 // Background write to tty (POSIX)
|
|||
|
#define SIGSYS 31 // Bad system call
|
|||
|
#define SIGUNUSED 31
|
|||
|
|
|||
|
<EFBFBD><EFBFBD> SIGHUP
|
|||
|
|
|||
|
- <EFBFBD>̳<EFBFBD> <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>̽<EFBFBD><EFBFBD><EFBFBD> <EFBFBD><EFBFBD><EFBFBD><EFBFBD> <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ǹ<EFBFBD> <EFBFBD>ش<EFBFBD> <EFBFBD><EFBFBD><EFBFBD><EFBFBD> <EFBFBD>̳ΰ<EFBFBD> <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <EFBFBD><EFBFBD><EFBFBD><EFBFBD> <EFBFBD><EFBFBD><EFBFBD>μ<EFBFBD><EFBFBD><EFBFBD>(<EFBFBD><EFBFBD><EFBFBD><EFBFBD> <EFBFBD><EFBFBD><EFBFBD><EFBFBD>)<EFBFBD><EFBFBD><EFBFBD><EFBFBD> <EFBFBD><EFBFBD><EFBFBD><EFBFBD>
|
|||
|
- <EFBFBD><EFBFBD><EFBFBD><EFBFBD> <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <EFBFBD><EFBFBD><EFBFBD><EFBFBD> <EFBFBD><EFBFBD><EFBFBD>ϴµ<EFBFBD> <EFBFBD>̶<EFBFBD><EFBFBD><EFBFBD> foreground <EFBFBD><EFBFBD><EFBFBD>μ<EFBFBD><EFBFBD><EFBFBD> <EFBFBD>쳻<EFBFBD><EFBFBD> <EFBFBD><EFBFBD><EFBFBD><EFBFBD> <EFBFBD><EFBFBD><EFBFBD>μ<EFBFBD><EFBFBD><EFBFBD><EFBFBD>鿡<EFBFBD><EFBFBD> <EFBFBD><EFBFBD><EFBFBD><EFBFBD>
|
|||
|
- SIGHUP <EFBFBD>ñ׳<EFBFBD><EFBFBD><EFBFBD> <EFBFBD><EFBFBD><EFBFBD><EFBFBD> <EFBFBD><EFBFBD><EFBFBD><EFBFBD> <EFBFBD><EFBFBD><EFBFBD><EFBFBD> <EFBFBD><EFBFBD><EFBFBD><EFBFBD> <EFBFBD><EFBFBD><EFBFBD><EFBFBD> <EFBFBD>ø<EFBFBD><EFBFBD><EFBFBD> <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <EFBFBD><EFBFBD><EFBFBD>ϴ<EFBFBD> <EFBFBD>ñ׳<EFBFBD><EFBFBD>̴<EFBFBD>.
|
|||
|
- <EFBFBD≯<EFBFBD> <EFBFBD>ִ<EFBFBD> <EFBFBD>ý<EFBFBD><EFBFBD><EFBFBD> <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> SIGHUP <EFBFBD>ñ׳<EFBFBD><EFBFBD><EFBFBD> configure file<EFBFBD><EFBFBD> <EFBFBD>ٽ<EFBFBD> <EFBFBD>о<EFBFBD><EFBFBD><EFBFBD><EFBFBD>̴<EFBFBD> <EFBFBD><EFBFBD><EFBFBD><EFBFBD> <EFBFBD>ʱ<EFBFBD>ȭ <EFBFBD><EFBFBD>ȣ<EFBFBD><EFBFBD> <EFBFBD>ؼ<EFBFBD><EFBFBD>Ѵ<EFBFBD>.
|
|||
|
. bootp(8), gated(8), inetd(8), mountd(8), named(8), nfsd(8), ypbind(8)
|
|||
|
. pppd(8) ó<EFBFBD><EFBFBD> SIGHUP<EFBFBD><EFBFBD> <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <EFBFBD>ǵ<EFBFBD><EFBFBD><EFBFBD> <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ϰ<EFBFBD> <EFBFBD><EFBFBD><EFBFBD><EFBFBD> <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <EFBFBD>Ƶ<EFBFBD><EFBFBD>̴<EFBFBD> <EFBFBD><EFBFBD><EFBFBD>ʵ<EFBFBD> <EFBFBD><EFBFBD>Ȥ <EFBFBD>ִµ<EFBFBD>, <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <EFBFBD><EFBFBD> <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> SIGTERM<EFBFBD><EFBFBD> <EFBFBD>ô´<EFBFBD>.
|
|||
|
. daemon<EFBFBD><EFBFBD> <EFBFBD><EFBFBD><EFBFBD><EFBFBD> <EFBFBD>ܸ<EFBFBD><EFBFBD><EFBFBD> <EFBFBD><EFBFBD><EFBFBD><EFBFBD> <EFBFBD><EFBFBD><EFBFBD><EFBFBD> <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> kernel<EFBFBD>κ<EFBFBD><EFBFBD><EFBFBD> SIGHUP <EFBFBD><EFBFBD>ȣ<EFBFBD><EFBFBD> <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <EFBFBD><EFBFBD><EFBFBD>Ѵ<EFBFBD>.
|
|||
|
<EFBFBD><EFBFBD><EFBFBD>Ƿ<EFBFBD> <EFBFBD><EFBFBD><EFBFBD><EFBFBD> daemon<EFBFBD><EFBFBD> <EFBFBD><EFBFBD> <EFBFBD><EFBFBD>ȣ<EFBFBD><EFBFBD> daemon<EFBFBD><EFBFBD> <EFBFBD><EFBFBD><EFBFBD><EFBFBD> <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ǿ<EFBFBD> daemon<EFBFBD><EFBFBD> <EFBFBD><EFBFBD> <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <EFBFBD><EFBFBD><EFBFBD><EFBFBD> <EFBFBD>о<EFBFBD><EFBFBD><EFBFBD> <EFBFBD>ȴٴ<EFBFBD> <EFBFBD><EFBFBD><EFBFBD><EFBFBD> <EFBFBD>˷<EFBFBD><EFBFBD>ִ<EFBFBD> <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ڷκ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ѵ<EFBFBD>.
|
|||
|
. daemon<EFBFBD><EFBFBD> <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <EFBFBD><EFBFBD> <EFBFBD><EFBFBD><EFBFBD><EFBFBD> <EFBFBD>ٸ<EFBFBD> <EFBFBD><EFBFBD> <EFBFBD><EFBFBD><EFBFBD><EFBFBD> <EFBFBD><EFBFBD>ȣ<EFBFBD><EFBFBD> SIGINT<EFBFBD><EFBFBD> SIGWINCH<EFBFBD><EFBFBD> <EFBFBD>ְ<EFBFBD> <EFBFBD>̵鵵 <EFBFBD><EFBFBD><EFBFBD><EFBFBD> <EFBFBD> <EFBFBD><EFBFBD>ȭ<EFBFBD><EFBFBD> daemon<EFBFBD><EFBFBD><EFBFBD><EFBFBD> <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ϱ<EFBFBD> <EFBFBD><EFBFBD><EFBFBD><EFBFBD> <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <EFBFBD><EFBFBD> <EFBFBD>ִ<EFBFBD>.
|
|||
|
|
|||
|
<EFBFBD><EFBFBD> SIGINT
|
|||
|
|
|||
|
- <EFBFBD><EFBFBD><EFBFBD>ͷ<EFBFBD>Ʈ Ű (DELETE <EFBFBD>Ǵ<EFBFBD> Control-C)<EFBFBD><EFBFBD> <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <EFBFBD><EFBFBD> <EFBFBD><EFBFBD>
|
|||
|
|
|||
|
<EFBFBD><EFBFBD> SIGQUIT
|
|||
|
|
|||
|
- Control-backslash <EFBFBD><EFBFBD> <EFBFBD><EFBFBD><EFBFBD><EFBFBD> <EFBFBD><EFBFBD>
|
|||
|
|
|||
|
<EFBFBD><EFBFBD> SIGCHLD
|
|||
|
|
|||
|
- <EFBFBD><EFBFBD><EFBFBD>μ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ϰų<EFBFBD> <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ϸ<EFBFBD>, <EFBFBD>θ<EFBFBD> <EFBFBD><EFBFBD><EFBFBD>μ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <EFBFBD><EFBFBD><EFBFBD>ȴ<EFBFBD>.
|
|||
|
- <EFBFBD>θ<EFBFBD> <EFBFBD><EFBFBD><EFBFBD>μ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> wait() <EFBFBD>ý<EFBFBD><EFBFBD><EFBFBD> <EFBFBD><EFBFBD><EFBFBD><EFBFBD> <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ͽ<EFBFBD> <EFBFBD><EFBFBD><EFBFBD><EFBFBD> <EFBFBD><EFBFBD><EFBFBD><EFBFBD> <EFBFBD>Ͼ<EFBFBD><EFBFBD><EFBFBD><EFBFBD> <EFBFBD>˾ƺ<EFBFBD><EFBFBD><EFBFBD>.
|
|||
|
- <EFBFBD><EFBFBD> <EFBFBD>ñ׳ο<EFBFBD> <EFBFBD><EFBFBD><EFBFBD><EFBFBD> default ó<EFBFBD><EFBFBD><EFBFBD><EFBFBD> <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ϴ<EFBFBD> <EFBFBD><EFBFBD><EFBFBD>̴<EFBFBD>. <EFBFBD><EFBFBD> <EFBFBD><EFBFBD><EFBFBD>μ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <EFBFBD><EFBFBD> <EFBFBD><EFBFBD>ȣ<EFBFBD><EFBFBD> <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <EFBFBD><EFBFBD> <EFBFBD><EFBFBD><EFBFBD><EFBFBD> <EFBFBD><EFBFBD><EFBFBD>ȴ<EFBFBD>.
|
|||
|
|
|||
|
<EFBFBD><EFBFBD> SIGSEGV
|
|||
|
|
|||
|
- <EFBFBD><EFBFBD>ȿ<EFBFBD><EFBFBD><EFBFBD><EFBFBD> <EFBFBD><EFBFBD><EFBFBD><EFBFBD> <EFBFBD><EFBFBD><EFBFBD><EFBFBD> <EFBFBD><EFBFBD><EFBFBD><EFBFBD> <EFBFBD>ּҸ<EFBFBD> <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ϰų<EFBFBD> <EFBFBD><EFBFBD><EFBFBD><EFBFBD> <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <EFBFBD><EFBFBD><EFBFBD><EFBFBD> <EFBFBD><EFBFBD> <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <EFBFBD><EFBFBD> <EFBFBD><EFBFBD><EFBFBD>μ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <EFBFBD><EFBFBD><EFBFBD>ȴ<EFBFBD>.
|
|||
|
|
|||
|
<EFBFBD><EFBFBD> SIGTERM
|
|||
|
|
|||
|
- kill <EFBFBD><EFBFBD><EFBFBD>ɿ<EFBFBD> <EFBFBD><EFBFBD><EFBFBD><EFBFBD> <EFBFBD>⺻<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <EFBFBD><EFBFBD>
|
|||
|
|
|||
|
<EFBFBD><EFBFBD> SIGKILL
|
|||
|
|
|||
|
- "<EFBFBD>ش<EFBFBD><EFBFBD><EFBFBD> <20><>ġ(extreme prejudice)"<EFBFBD><EFBFBD> <EFBFBD><EFBFBD><EFBFBD>α<EFBFBD><EFBFBD><EFBFBD> <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ϴ<EFBFBD> <EFBFBD><EFBFBD> <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ȴ<EFBFBD>.
|
|||
|
- <EFBFBD>ñ׳<EFBFBD> catch <EFBFBD>ϰų<EFBFBD> <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <EFBFBD><EFBFBD> <EFBFBD><EFBFBD><EFBFBD><EFBFBD>.
|
|||
|
|
|||
|
<EFBFBD><EFBFBD> SIGALRM
|
|||
|
|
|||
|
- alarm()<EFBFBD>̳<EFBFBD> setitimer() <EFBFBD>ý<EFBFBD><EFBFBD><EFBFBD> <EFBFBD>ݷ<EFBFBD> <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <EFBFBD>˶<EFBFBD> <EFBFBD>ð<EFBFBD><EFBFBD><EFBFBD> <EFBFBD>ʰ<EFBFBD> <EFBFBD><EFBFBD><EFBFBD><EFBFBD> <EFBFBD><EFBFBD> <EFBFBD><EFBFBD><EFBFBD>μ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <EFBFBD><EFBFBD><EFBFBD>ȴ<EFBFBD>.
|
|||
|
|
|||
|
<EFBFBD><EFBFBD> SIGTSTP
|
|||
|
|
|||
|
- Control-Z Ű<EFBFBD><EFBFBD> <EFBFBD><EFBFBD><EFBFBD><EFBFBD> <EFBFBD><EFBFBD>
|
|||
|
- <EFBFBD>⺻ ó<EFBFBD><EFBFBD> <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> SIGCONT <EFBFBD><EFBFBD>ȣ<EFBFBD><EFBFBD> <EFBFBD><EFBFBD><EFBFBD><EFBFBD> <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <EFBFBD><EFBFBD><EFBFBD>μ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <EFBFBD>ߴ<EFBFBD><EFBFBD>Ѵ<EFBFBD>.
|
|||
|
|
|||
|
<EFBFBD><EFBFBD> SIGCONT
|
|||
|
|
|||
|
- <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <EFBFBD><EFBFBD><EFBFBD>μ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <EFBFBD><EFBFBD><EFBFBD><EFBFBD> <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ű<EFBFBD><EFBFBD> <EFBFBD><EFBFBD> <EFBFBD><EFBFBD> <EFBFBD><EFBFBD>
|
|||
|
- <EFBFBD><EFBFBD> <EFBFBD><EFBFBD>ȣ<EFBFBD><EFBFBD> <EFBFBD><EFBFBD><EFBFBD><EFBFBD> <EFBFBD><EFBFBD> <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ϰų<EFBFBD> <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <EFBFBD><EFBFBD> <EFBFBD><EFBFBD><EFBFBD><EFBFBD>.
|
|||
|
- <EFBFBD>⺻ ó<EFBFBD><EFBFBD> <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <EFBFBD>ߴܵ<EFBFBD> <EFBFBD><EFBFBD><EFBFBD>μ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ϴ<EFBFBD> <EFBFBD><EFBFBD><EFBFBD>̴<EFBFBD>. <EFBFBD><EFBFBD><EFBFBD><EFBFBD> <EFBFBD><EFBFBD><EFBFBD>μ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <EFBFBD><EFBFBD>ȣ<EFBFBD><EFBFBD> <EFBFBD><EFBFBD><EFBFBD><EFBFBD> <EFBFBD>ʴ´ٸ<EFBFBD> <EFBFBD><EFBFBD>ȣ<EFBFBD><EFBFBD> <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>.
|
|||
|
- vi <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <EFBFBD><EFBFBD>
|
|||
|
. Control-Z <EFBFBD><EFBFBD> <EFBFBD><EFBFBD><EFBFBD><EFBFBD> <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <EFBFBD><EFBFBD><EFBFBD><EFBFBD> <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ű<EFBFBD><EFBFBD> <EFBFBD><EFBFBD><EFBFBD><EFBFBD> Ű <EFBFBD>Է<EFBFBD><EFBFBD><EFBFBD> ó<EFBFBD><EFBFBD><EFBFBD>ϰ<EFBFBD> <EFBFBD>Ǵµ<EFBFBD>
|
|||
|
. <EFBFBD>̶<EFBFBD> fg <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ű<EFBFBD><EFBFBD> <EFBFBD><EFBFBD><EFBFBD><EFBFBD> vi <EFBFBD><EFBFBD><EFBFBD><EFBFBD> SIGCONT <EFBFBD>ñ׳<EFBFBD><EFBFBD><EFBFBD> <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ϸ<EFBFBD>
|
|||
|
. vi<EFBFBD><EFBFBD> <EFBFBD><EFBFBD> <EFBFBD>ñ׳ο<EFBFBD> <EFBFBD><EFBFBD><EFBFBD><EFBFBD> ó<EFBFBD><EFBFBD><EFBFBD><EFBFBD> ȭ<EFBFBD><EFBFBD><EFBFBD><EFBFBD> <EFBFBD>ٽ<EFBFBD> <EFBFBD><EFBFBD><EFBFBD><EFBFBD> <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> Ű <EFBFBD>Է<EFBFBD><EFBFBD><EFBFBD> <EFBFBD><EFBFBD> <EFBFBD><EFBFBD><EFBFBD>·<EFBFBD> <EFBFBD><EFBFBD><EFBFBD>ư<EFBFBD><EFBFBD><EFBFBD>.
|
|||
|
|
|||
|
<EFBFBD><EFBFBD> SIGSTOP
|
|||
|
|
|||
|
- SIGTSTP<EFBFBD><EFBFBD> <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ϳ<EFBFBD> catch <EFBFBD>ϰų<EFBFBD> <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <EFBFBD><EFBFBD> <EFBFBD><EFBFBD><EFBFBD><EFBFBD>.
|
|||
|
- <EFBFBD><EFBFBD> <EFBFBD><EFBFBD>ȣ<EFBFBD><EFBFBD> <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> SIGCONT <EFBFBD><EFBFBD>ȣ<EFBFBD><EFBFBD> <EFBFBD><EFBFBD><EFBFBD><EFBFBD> <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <EFBFBD><EFBFBD><EFBFBD>μ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <EFBFBD>ߴ<EFBFBD><EFBFBD>Ѵ<EFBFBD>.
|
|||
|
|
|||
|
<EFBFBD><EFBFBD> SIGABRT
|
|||
|
|
|||
|
- abort() <EFBFBD>Լ<EFBFBD><EFBFBD><EFBFBD> ȣ<EFBFBD><EFBFBD><EFBFBD><EFBFBD> <EFBFBD><EFBFBD>
|
|||
|
|
|||
|
<EFBFBD><EFBFBD> SIGBUS
|
|||
|
|
|||
|
- <EFBFBD>ϵ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <EFBFBD><EFBFBD>
|
|||
|
|
|||
|
<EFBFBD><EFBFBD> SIGEMT
|
|||
|
|
|||
|
- <EFBFBD>ϵ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <EFBFBD><EFBFBD>
|
|||
|
|
|||
|
<EFBFBD><EFBFBD> SIGFPE
|
|||
|
|
|||
|
- divide-by-0<EFBFBD><EFBFBD> <EFBFBD>ε<EFBFBD> <EFBFBD>Ҽ<EFBFBD><EFBFBD><EFBFBD> <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>÷ο<EFBFBD><EFBFBD><EFBFBD> <EFBFBD><EFBFBD><EFBFBD><EFBFBD> <EFBFBD><EFBFBD><EFBFBD><EFBFBD> <EFBFBD><EFBFBD><EFBFBD><EFBFBD> <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <EFBFBD><EFBFBD>
|
|||
|
|
|||
|
<EFBFBD><EFBFBD> SIGILL
|
|||
|
|
|||
|
<EFBFBD><EFBFBD> SIGINFO
|
|||
|
|
|||
|
<EFBFBD><EFBFBD> SIGIO
|
|||
|
|
|||
|
<EFBFBD><EFBFBD> SIGIOT
|
|||
|
|
|||
|
<EFBFBD><EFBFBD> SIGPIPE
|
|||
|
|
|||
|
- pipe <EFBFBD><EFBFBD><EFBFBD>ſ<EFBFBD><EFBFBD><EFBFBD> <EFBFBD><EFBFBD><EFBFBD><EFBFBD> <EFBFBD><EFBFBD><EFBFBD>μ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <EFBFBD><EFBFBD> <EFBFBD>۽<EFBFBD> <EFBFBD><EFBFBD><EFBFBD>μ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> write <EFBFBD>ϸ<EFBFBD> <EFBFBD><EFBFBD>
|
|||
|
- <EFBFBD><EFBFBD><EFBFBD>μ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> RST<EFBFBD><EFBFBD> <EFBFBD><EFBFBD><EFBFBD><EFBFBD> <EFBFBD><EFBFBD><EFBFBD>Ͽ<EFBFBD> <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <EFBFBD><EFBFBD><EFBFBD><EFBFBD>, Ŀ<EFBFBD><EFBFBD><EFBFBD><EFBFBD> <EFBFBD><EFBFBD> <EFBFBD><EFBFBD><EFBFBD>μ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> ISGPIPE <EFBFBD><EFBFBD>ȣ<EFBFBD><EFBFBD> <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>.
|
|||
|
- <EFBFBD><EFBFBD> <EFBFBD><EFBFBD>ȣ<EFBFBD><EFBFBD> <EFBFBD>⺻ <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <EFBFBD><EFBFBD><EFBFBD>μ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ű<EFBFBD><EFBFBD> <EFBFBD><EFBFBD><EFBFBD>̹Ƿ<EFBFBD>, <EFBFBD><EFBFBD><EFBFBD>μ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <EFBFBD>ʴ<EFBFBD> <EFBFBD><EFBFBD><EFBFBD>Ḧ <EFBFBD><EFBFBD><EFBFBD>ϱ<EFBFBD> <EFBFBD><EFBFBD><EFBFBD>ؼ<EFBFBD><EFBFBD><EFBFBD> <EFBFBD><EFBFBD> <EFBFBD><EFBFBD>ȣ<EFBFBD><EFBFBD> <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ؾ<EFBFBD> <EFBFBD>Ѵ<EFBFBD>.
|
|||
|
|
|||
|
<EFBFBD><EFBFBD> SIGPOLL
|
|||
|
|
|||
|
<EFBFBD><EFBFBD> SIGROF
|
|||
|
|
|||
|
<EFBFBD><EFBFBD> SIGPWR
|
|||
|
|
|||
|
<EFBFBD><EFBFBD> SIGSYS
|
|||
|
|
|||
|
<EFBFBD><EFBFBD> SIGTTIN
|
|||
|
|
|||
|
- background<EFBFBD><EFBFBD> <EFBFBD>ִ<EFBFBD> <EFBFBD><EFBFBD><EFBFBD>μ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <EFBFBD><EFBFBD><EFBFBD><EFBFBD> <EFBFBD>̳ηκ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <EFBFBD>б⸦ <EFBFBD>õ<EFBFBD><EFBFBD>Ѵ<EFBFBD>.
|
|||
|
|
|||
|
<EFBFBD><EFBFBD> SIGTTOU
|
|||
|
|
|||
|
- background<EFBFBD><EFBFBD> <EFBFBD>ִ<EFBFBD> <EFBFBD><EFBFBD><EFBFBD>μ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <EFBFBD><EFBFBD><EFBFBD><EFBFBD> <EFBFBD>̳ηκ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <EFBFBD><EFBFBD><EFBFBD>⸦ <EFBFBD>õ<EFBFBD><EFBFBD>Ѵ<EFBFBD>.
|
|||
|
|
|||
|
<EFBFBD><EFBFBD> SIGURG
|
|||
|
|
|||
|
- SIGIO<EFBFBD><EFBFBD> SIGURG <EFBFBD><EFBFBD><EFBFBD><EFBFBD> <EFBFBD><EFBFBD> <EFBFBD><EFBFBD><EFBFBD><EFBFBD> <EFBFBD><EFBFBD>ȣ<EFBFBD><EFBFBD> <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> F_SETOWN <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ֿ<EFBFBD><EFBFBD><EFBFBD> <EFBFBD>Ҵ<EFBFBD><EFBFBD>Ǿ<EFBFBD><EFBFBD><EFBFBD> <EFBFBD><EFBFBD><EFBFBD><EFBFBD> <EFBFBD><EFBFBD><EFBFBD>Ͽ<EFBFBD> <EFBFBD><EFBFBD><EFBFBD><EFBFBD> <EFBFBD><EFBFBD><EFBFBD>Ѵ<EFBFBD>.
|
|||
|
|
|||
|
<EFBFBD><EFBFBD> SIGUSR1
|
|||
|
|
|||
|
<EFBFBD><EFBFBD> SIGUSR2
|
|||
|
|
|||
|
<EFBFBD><EFBFBD> SIGVTALRM
|
|||
|
|
|||
|
<EFBFBD><EFBFBD> SIGWINCH
|
|||
|
|
|||
|
<EFBFBD><EFBFBD> SIGXCPU
|
|||
|
|
|||
|
<EFBFBD><EFBFBD> SIGXFSZ
|
|||
|
|
|||
|
<EFBFBD><EFBFBD> -- 2009-11-29 00:26:00
|
|||
|
|
|||
|
<EFBFBD><EFBFBD> linux <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> sigaction <EFBFBD><EFBFBD><EFBFBD><EFBFBD> -- 2011-06-05 22:55:00
|
|||
|
|
|||
|
struct sigaction {
|
|||
|
union {
|
|||
|
__sighandler_t _sa_handler;
|
|||
|
void (*_sa_sigaction)(int, struct siginfo *, void *);
|
|||
|
} _u;
|
|||
|
sigset_t sa_mask ;
|
|||
|
unsigned long sa_flags;
|
|||
|
void (*sa_restorer)(void);
|
|||
|
};
|
|||
|
|
|||
|
#define sa_handler _u._sa_handler
|
|||
|
#define sa_sigaction _u._sa_sigaction
|
|||
|
|
|||
|
<EFBFBD><EFBFBD> solaris <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> sigaction <EFBFBD><EFBFBD><EFBFBD><EFBFBD> -- 2011-06-05 22:56:00
|
|||
|
|
|||
|
struct sigaction {
|
|||
|
int sa_flags;
|
|||
|
union {
|
|||
|
#ifdef __cplusplus
|
|||
|
void (*_handler)(int);
|
|||
|
#else
|
|||
|
void (*_handler)();
|
|||
|
#endif
|
|||
|
#if defined(__EXTENSIONS__) || defined(_KERNEL) || \
|
|||
|
(!defined(_STRICT_STDC) && !defined(__XOPEN_OR_POSIX)) || \
|
|||
|
(_POSIX_C_SOURCE > 2) || defined(_XPG4_2)
|
|||
|
void (*_sigaction)(int, siginfo_t *, void *);
|
|||
|
#endif
|
|||
|
} _funcptr;
|
|||
|
sigset_t sa_mask;
|
|||
|
#ifndef _LP64
|
|||
|
int sa_resv[2];
|
|||
|
#endif
|
|||
|
};
|
|||
|
|
|||
|
#define sa_handler _funcptr._handler
|
|||
|
#define sa_sigaction _funcptr._sigaction
|
|||
|
|
|||
|
<EFBFBD><EFBFBD> freebsd <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> sigaction <EFBFBD><EFBFBD><EFBFBD><EFBFBD> -- 2011-06-05 22:59:00
|
|||
|
|
|||
|
struct sigaction {
|
|||
|
union { void (*__sa_handler)(int);
|
|||
|
void (*__sa_sigaction)(int, struct __siginfo *, void *);
|
|||
|
} __sigaction_u; // signal handler
|
|||
|
int sa_flags; // see signal options below
|
|||
|
sigset_t sa_mask; // signal mask to apply
|
|||
|
};
|
|||
|
|
|||
|
#define sa_handler __sigaction_u.__sa_handler
|
|||
|
|
|||
|
/////////////////////////////////////////////////////////////////////////////*/
|
|||
|
|
|||
|
|
|||
|
class ZCSigAction : public sigaction
|
|||
|
{
|
|||
|
public:
|
|||
|
typedef struct sigaction StSigAction;
|
|||
|
public:
|
|||
|
|
|||
|
ZCSigAction()
|
|||
|
{
|
|||
|
::memset((sigaction*)this, 0, sizeof(StSigAction));
|
|||
|
}/*
|
|||
|
ZCSigAction()*/
|
|||
|
|
|||
|
StSigAction& GetBaseObj()
|
|||
|
{
|
|||
|
return (StSigAction&)(*this);
|
|||
|
}/*
|
|||
|
StSigAction& GetBaseObj()*/
|
|||
|
|
|||
|
void SetFlags(int AI_Flags)
|
|||
|
{
|
|||
|
this->sa_flags=AI_Flags; // RTS <20><><EFBFBD><EFBFBD> SA_SIGINFO <20><> <20><><EFBFBD><EFBFBD>
|
|||
|
}/*
|
|||
|
void SetFlags(int AI_Flags)*/
|
|||
|
|
|||
|
void SetHandler(void (*APF_Handler)(int))
|
|||
|
{
|
|||
|
this->sa_handler=APF_Handler;
|
|||
|
}/*
|
|||
|
void SetHandler(void (*APF_Handler)(int))*/
|
|||
|
|
|||
|
void SetHandlerEx(void (*APF_Handler)(int, siginfo_t*, void*))
|
|||
|
{
|
|||
|
this->sa_sigaction=APF_Handler; // <20>ַ<EFBFBD> RTS <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
|
|||
|
}/*
|
|||
|
void SetHandlerEx(void (*APF_Handler)(int, siginfo_t*, void*))*/
|
|||
|
|
|||
|
bool EmptySet()
|
|||
|
{
|
|||
|
return sigemptyset(&this->sa_mask)==0 ;
|
|||
|
}/*
|
|||
|
bool EmptySet()*/
|
|||
|
|
|||
|
bool FillSet()
|
|||
|
{
|
|||
|
return sigfillset(&this->sa_mask)==0 ;
|
|||
|
}/*
|
|||
|
bool FillSet()*/
|
|||
|
|
|||
|
bool CutSet(int AI_SigNo)
|
|||
|
{
|
|||
|
return sigdelset(&this->sa_mask, AI_SigNo)==0 ;
|
|||
|
}/*
|
|||
|
bool CutSet(int AI_SigNo)*/
|
|||
|
|
|||
|
bool AddSet(int AI_SigNo)
|
|||
|
{
|
|||
|
return sigaddset(&this->sa_mask, AI_SigNo)==0 ;
|
|||
|
}/*
|
|||
|
bool AddSet(int AI_SigNo)*/
|
|||
|
|
|||
|
bool Act(int AI_SigNum, struct sigaction* AP_OldSigAction=0)
|
|||
|
{
|
|||
|
return ::sigaction(AI_SigNum, this, AP_OldSigAction)==0 ;
|
|||
|
}/*
|
|||
|
bool Act(int AI_SigNum, struct sigaction* AP_OldSigAction=0)*/
|
|||
|
|
|||
|
|
|||
|
static ZTypUInt Alarm(ZTypUInt AI_Sec)
|
|||
|
{
|
|||
|
return ::alarm(AI_Sec);
|
|||
|
|
|||
|
/* AI_Sec 0 <20><> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20>˶<EFBFBD> <20><>û<EFBFBD><C3BB> <20><><EFBFBD><EFBFBD>. <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20>˶<EFBFBD> ȣ<><C8A3>
|
|||
|
<EFBFBD><EFBFBD> <EFBFBD><EFBFBD><EFBFBD>DZ<EFBFBD> <EFBFBD><EFBFBD><EFBFBD><EFBFBD> <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ִ<EFBFBD> <EFBFBD>ð<EFBFBD><EFBFBD><EFBFBD> <EFBFBD><EFBFBD>ȯ<EFBFBD>ϰų<EFBFBD> ȣ<EFBFBD><EFBFBD><EFBFBD><EFBFBD>
|
|||
|
<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ϸ<EFBFBD> -1 <EFBFBD><EFBFBD> <EFBFBD><EFBFBD>ȯ<EFBFBD>Ѵ<EFBFBD>. */
|
|||
|
}/*
|
|||
|
static ZTypUInt Alarm(ZTypUInt AI_Sec)*/
|
|||
|
|
|||
|
static bool Kill(int AI_SigNo, pid_t AI_Pid=::getpid())
|
|||
|
{
|
|||
|
return ::kill(AI_Pid, AI_SigNo)==0 ;
|
|||
|
}/*
|
|||
|
static bool Kill(int AI_SigNo, pid_t AI_Pid=::getpid())*/
|
|||
|
|
|||
|
|
|||
|
#ifdef __linux__
|
|||
|
|
|||
|
/*/////////////////////////////////////////////////////////////////////////
|
|||
|
|
|||
|
<EFBFBD><EFBFBD> freebsd 8.2, solaris 5.11 <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> F_SETSIG <EFBFBD><EFBFBD> <EFBFBD><EFBFBD><EFBFBD>ǰ<EFBFBD> <EFBFBD>Ǿ<EFBFBD> <EFBFBD><EFBFBD><EFBFBD><EFBFBD> <EFBFBD>ʾƼ<EFBFBD>,
|
|||
|
<EFBFBD>Ʒ<EFBFBD> SetupRTS() <EFBFBD>Լ<EFBFBD><EFBFBD><EFBFBD> <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <EFBFBD><EFBFBD> <EFBFBD><EFBFBD><EFBFBD><EFBFBD>. <EFBFBD><EFBFBD> RTS <EFBFBD><EFBFBD> <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <EFBFBD><EFBFBD> <EFBFBD><EFBFBD><EFBFBD><EFBFBD>.
|
|||
|
|
|||
|
-- 2011-06-09 04:25:00
|
|||
|
|
|||
|
/////////////////////////////////////////////////////////////////////////*/
|
|||
|
|
|||
|
// <20>ַ<EFBFBD> SIGRTMIN ~ SIGRTMAX <20><><EFBFBD>̿<EFBFBD> <20>ִ<EFBFBD> RTS <20><> <20><><EFBFBD><EFBFBD><EFBFBD>Ѵ<EFBFBD>.
|
|||
|
|
|||
|
static bool SetupRTS(int AI_FileID, int AI_SigNo=SIGRTMIN, int AI_Flag=O_RDWR | /*O_NONBLOCK|*/O_ASYNC, pid_t AI_PId=::getpid())
|
|||
|
{
|
|||
|
if (::fcntl(AI_FileID, F_SETFL, AI_Flag) < 0)
|
|||
|
{
|
|||
|
return false;
|
|||
|
}
|
|||
|
if (::fcntl(AI_FileID, F_SETSIG, AI_SigNo) < 0)
|
|||
|
{
|
|||
|
return false;
|
|||
|
}
|
|||
|
if (::fcntl(AI_FileID, F_SETOWN, AI_PId) < 0)
|
|||
|
{
|
|||
|
return false;
|
|||
|
}/*
|
|||
|
if (::fcntl(AI_FileID, F_SETOWN, AI_PId) < 0)*/
|
|||
|
|
|||
|
return true;
|
|||
|
}/*
|
|||
|
static bool SetupRTS(int AI_FileID, int AI_SigNo=SIGRTMIN, int AI_Flag=O_RDWR | O_NONBLOCK| O_ASYNC, int pid_t=::getpid())*/
|
|||
|
|
|||
|
#endif //__linux__
|
|||
|
|
|||
|
|
|||
|
public:
|
|||
|
};/*
|
|||
|
class ZCSigAction*/
|
|||
|
|
|||
|
|
|||
|
class ZCSigSet
|
|||
|
{
|
|||
|
private:
|
|||
|
::sigset_t mi_SigSet;
|
|||
|
public :
|
|||
|
|
|||
|
::sigset_t& GetSigSet()
|
|||
|
{
|
|||
|
return mi_SigSet;
|
|||
|
}/*
|
|||
|
::sigset_t& GetSigSet()*/
|
|||
|
|
|||
|
bool Empty()
|
|||
|
{
|
|||
|
return ::sigemptyset(&mi_SigSet)==0;
|
|||
|
}/*
|
|||
|
bool Empty()*/
|
|||
|
|
|||
|
bool Fill()
|
|||
|
{
|
|||
|
return ::sigfillset(&mi_SigSet)==0;
|
|||
|
}/*
|
|||
|
bool Fill()*/
|
|||
|
|
|||
|
bool Add(int AI_SigNo)
|
|||
|
{
|
|||
|
return ::sigaddset(&mi_SigSet, AI_SigNo)==0;
|
|||
|
}/*
|
|||
|
bool Add(int AI_SigNo)*/
|
|||
|
|
|||
|
bool Cut(int AI_SigNo)
|
|||
|
{
|
|||
|
return ::sigdelset(&mi_SigSet, AI_SigNo)==0;
|
|||
|
}/*
|
|||
|
bool Cut(int AI_SigNo)*/
|
|||
|
|
|||
|
bool IsMember(int AI_SigNo)
|
|||
|
{
|
|||
|
return ::sigismember(&mi_SigSet, AI_SigNo)==1;
|
|||
|
}/*
|
|||
|
bool IsMember(int AI_SigNo)*/
|
|||
|
|
|||
|
bool ProcMask(int AI_How, sigset_t* AP_OldSigSet=0)
|
|||
|
{
|
|||
|
return ::sigprocmask(AI_How, &mi_SigSet, AP_OldSigSet)==0;
|
|||
|
}/*
|
|||
|
bool ProcMask(int AI_How, sigset_t* AP_OldSigSet=0)*/
|
|||
|
|
|||
|
/*//////////////////////////////////////////////////////////////
|
|||
|
|
|||
|
<EFBFBD><EFBFBD> int AI_How <EFBFBD><EFBFBD> <EFBFBD><EFBFBD><EFBFBD><EFBFBD> <EFBFBD><EFBFBD> <EFBFBD>ִ<EFBFBD> <EFBFBD><EFBFBD>.
|
|||
|
|
|||
|
SIG_BLOCK
|
|||
|
The set of blocked signals is the union of the current
|
|||
|
set and the set argument.
|
|||
|
|
|||
|
<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <EFBFBD>ñ׳<EFBFBD> <EFBFBD><EFBFBD><EFBFBD><EFBFBD>ũ<EFBFBD><EFBFBD> <EFBFBD><EFBFBD><EFBFBD><EFBFBD> <EFBFBD>ñ׳<EFBFBD> <EFBFBD><EFBFBD><EFBFBD><EFBFBD> <EFBFBD><EFBFBD><EFBFBD><EFBFBD>ũ<EFBFBD><EFBFBD> <EFBFBD>߰<EFBFBD><EFBFBD>Ѵ<EFBFBD>.
|
|||
|
<EFBFBD><EFBFBD><EFBFBD>ϵ<EFBFBD> <EFBFBD>ñ׳<EFBFBD><EFBFBD><EFBFBD> <EFBFBD>ش<EFBFBD> <EFBFBD>ñ׳<EFBFBD><EFBFBD><EFBFBD> <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>, <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <EFBFBD>ñ׳<EFBFBD> <EFBFBD><EFBFBD>
|
|||
|
<EFBFBD>鷯<EFBFBD><EFBFBD> <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <EFBFBD>Ϸ<EFBFBD><EFBFBD><EFBFBD> <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ȴ<EFBFBD>.
|
|||
|
|
|||
|
<EFBFBD><EFBFBD><EFBFBD>ϵ<EFBFBD><EFBFBD><EFBFBD> <EFBFBD><EFBFBD><EFBFBD><EFBFBD> <EFBFBD>ñ׳<EFBFBD><EFBFBD>̶<EFBFBD><EFBFBD><EFBFBD>, <EFBFBD>ش<EFBFBD> <EFBFBD>ñ׳<EFBFBD><EFBFBD><EFBFBD> <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>, <EFBFBD><EFBFBD><EFBFBD><EFBFBD>
|
|||
|
<EFBFBD><EFBFBD> <EFBFBD>ñ׳<EFBFBD> <EFBFBD>ڵ鷯<EFBFBD><EFBFBD> <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ϴٰ<EFBFBD>, <EFBFBD>ٸ<EFBFBD> <EFBFBD>ñ׳<EFBFBD><EFBFBD><EFBFBD> <EFBFBD><EFBFBD><EFBFBD>ϸ<EFBFBD>, <EFBFBD><EFBFBD><EFBFBD><EFBFBD>
|
|||
|
<EFBFBD><EFBFBD> <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ϰ<EFBFBD>, <EFBFBD><EFBFBD> <EFBFBD>ñ׳<EFBFBD><EFBFBD><EFBFBD> <EFBFBD>ڵ鷯<EFBFBD><EFBFBD> <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <EFBFBD><EFBFBD><EFBFBD><EFBFBD> <EFBFBD>Ŀ<EFBFBD>, <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
|
|||
|
<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ϰ<EFBFBD> <EFBFBD>ȴ<EFBFBD>.
|
|||
|
|
|||
|
SIG_UNBLOCK
|
|||
|
The signals in set are removed from the current set of
|
|||
|
blocked signals. It is legal to attempt to unblock a
|
|||
|
signal which is not blocked.
|
|||
|
|
|||
|
<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <EFBFBD>ñ׳<EFBFBD> <EFBFBD><EFBFBD><EFBFBD><EFBFBD>ũ<EFBFBD><EFBFBD> <EFBFBD><EFBFBD><EFBFBD><EFBFBD> <EFBFBD>ñ׳<EFBFBD> <EFBFBD><EFBFBD><EFBFBD><EFBFBD> <EFBFBD><EFBFBD><EFBFBD><EFBFBD>ũ<EFBFBD><EFBFBD><EFBFBD><EFBFBD> <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ѵ<EFBFBD>.
|
|||
|
|
|||
|
SIG_SETMASK
|
|||
|
The set of blocked signals is set to the argument set.
|
|||
|
|
|||
|
-- 2011-06-09 21:37:00
|
|||
|
|
|||
|
//////////////////////////////////////////////////////////////*/
|
|||
|
|
|||
|
|
|||
|
bool Wait(int& ARRI_SigNo)
|
|||
|
{
|
|||
|
return ::sigwait(&mi_SigSet, &ARRI_SigNo)==0;
|
|||
|
}/*
|
|||
|
bool Wait(int& ARRI_SigNo)*/
|
|||
|
|
|||
|
int WaitInfo(siginfo_t& ARR_StSigInfo)
|
|||
|
{
|
|||
|
return ::sigwaitinfo(&mi_SigSet, &ARR_StSigInfo);
|
|||
|
}/*
|
|||
|
int WaitInfo(siginfo_t& ARR_StSigInfo)*/
|
|||
|
|
|||
|
/*//////////////////////////////////////////////////////////////////
|
|||
|
|
|||
|
<EFBFBD><EFBFBD> SYNOPSIS
|
|||
|
|
|||
|
#include <signal.h>
|
|||
|
|
|||
|
int sigwaitinfo(const sigset_t *restrict set,
|
|||
|
siginfo_t *restrict info);
|
|||
|
|
|||
|
int sigtimedwait( const sigset_t *restrict set ,
|
|||
|
siginfo_t *restrict info,
|
|||
|
const struct timespec *restrict timeout);
|
|||
|
|
|||
|
<EFBFBD><EFBFBD> RETURN VALUES
|
|||
|
|
|||
|
Upon successful completion (that is, one of the signals
|
|||
|
specified by set is pending or is generated) sigwaitinfo()
|
|||
|
and sigtimedwait() will return the selected signal number.
|
|||
|
Otherwise, the function returns -1 and sets errno to indi-
|
|||
|
cate the error.
|
|||
|
|
|||
|
<EFBFBD><EFBFBD> ERRORS
|
|||
|
|
|||
|
The sigwaitinfo() and sigtimedwait() functions will fail if:
|
|||
|
|
|||
|
EINTR The wait was interrupted by an unblocked, caught
|
|||
|
signal.
|
|||
|
|
|||
|
ENOSYS The sigwaitinfo() and sigtimedwait() functions are
|
|||
|
not supported.
|
|||
|
|
|||
|
The sigtimedwait() function will fail if:
|
|||
|
|
|||
|
EAGAIN No signal specified by set was generated within
|
|||
|
the specified timeout period.
|
|||
|
|
|||
|
The sigwaitinfo() and sigtimedwait() functions may fail if:
|
|||
|
|
|||
|
EFAULT The set, info, or timeout argument points to an
|
|||
|
invalid address.
|
|||
|
|
|||
|
The sigtimedwait() function may fail if:
|
|||
|
|
|||
|
EINVAL The timeout argument specified a tv_nsec value
|
|||
|
less than zero or greater than or equal to 1000
|
|||
|
million. The system only checks for this error if
|
|||
|
no signal is pending in set and it is necessary to
|
|||
|
wait.
|
|||
|
|
|||
|
<EFBFBD><EFBFBD> -- 2011-06-02 01:14:00
|
|||
|
|
|||
|
//////////////////////////////////////////////////////////////////*/
|
|||
|
|
|||
|
|
|||
|
static bool AddInfo(int AI_SignalNo, const union sigval AI_SigVal, int AI_ProcessID=::getpid())
|
|||
|
{
|
|||
|
return ::sigqueue(AI_ProcessID, AI_SignalNo, AI_SigVal)==0;
|
|||
|
}/*
|
|||
|
static bool AddInfo(int AI_SignalNo, const union sigval AI_SigVal, int AI_ProcessID=::getpid())*/
|
|||
|
|
|||
|
/*//////////////////////////////////////////////////////////////////
|
|||
|
|
|||
|
<EFBFBD><EFBFBD> SYNOPSIS
|
|||
|
|
|||
|
#include <sys/types.h>
|
|||
|
#include <signal.h>
|
|||
|
|
|||
|
union sigval{int sival_int; void* sival_ptr;};
|
|||
|
|
|||
|
int sigqueue(pid_t pid, int signo, const union sigval value);
|
|||
|
|
|||
|
<EFBFBD><EFBFBD> RETURN VALUES
|
|||
|
|
|||
|
Upon successful completion, the specified signal will have
|
|||
|
been queued, and the sigqueue() function returns 0. Other-
|
|||
|
wise, the function returns -1 and sets errno to indicate the
|
|||
|
error.
|
|||
|
|
|||
|
<EFBFBD><EFBFBD> ERRORS
|
|||
|
|
|||
|
The sigqueue() function will fail if:
|
|||
|
|
|||
|
EAGAIN No resources are available to queue the signal.
|
|||
|
The process has already queued SIGQUEUE_MAX sig-
|
|||
|
nals that are still pending at the receiver(s),
|
|||
|
or a system wide resource limit has been
|
|||
|
exceeded.
|
|||
|
|
|||
|
EINVAL The value of signo is an invalid or unsupported
|
|||
|
signal number.
|
|||
|
|
|||
|
ENOSYS The sigqueue() function is not supported by the
|
|||
|
system.
|
|||
|
|
|||
|
EPERM The process does not have the appropriate
|
|||
|
privilege to send the signal to the receiving
|
|||
|
process.
|
|||
|
|
|||
|
ESRCH The process pid does not exist.
|
|||
|
|
|||
|
<EFBFBD><EFBFBD> -- 2011-06-02 01:40:00
|
|||
|
|
|||
|
//////////////////////////////////////////////////////////////////*/
|
|||
|
|
|||
|
public:
|
|||
|
};/*
|
|||
|
class ZCSigSet*/
|
|||
|
|
|||
|
|
|||
|
|
|||
|
class ZCProcess
|
|||
|
{
|
|||
|
public:
|
|||
|
|
|||
|
// cf) typedef int pid_t
|
|||
|
|
|||
|
// <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20>뵵<EFBFBD>ε<EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20>Լ<EFBFBD><D4BC>̴<EFBFBD>.
|
|||
|
|
|||
|
bool Exec(const char* AP_ExeName, bool AB_DoCloseStdInOut=true)
|
|||
|
{
|
|||
|
return this->Exec(AP_ExeName, NULL, AB_DoCloseStdInOut);
|
|||
|
}/*
|
|||
|
bool Exec(const char* AP_ExeName, bool AB_DoCloseStdInOut=true)*/
|
|||
|
|
|||
|
bool Exec(const char* AP_ExeName, char* const APA_Arg[], bool AB_DoCloseStdInOut=true)
|
|||
|
{
|
|||
|
/*/////////////////////////////////////////////////////////////////
|
|||
|
|
|||
|
<EFBFBD><EFBFBD> APA_Arg <EFBFBD><EFBFBD> <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <EFBFBD><EFBFBD><EFBFBD>Ҵ<EFBFBD> NULL <EFBFBD><EFBFBD> <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <EFBFBD>Ѵ<EFBFBD>.
|
|||
|
|
|||
|
char *aRgu[4];
|
|||
|
|
|||
|
aRgu[0] = "/test/test.exe";
|
|||
|
aRgu[1] = "ABC"; // Argu 1
|
|||
|
aRgu[2] = "10" ; // Argu 2
|
|||
|
aRgu[3] = 0 ; // <20>ƱԸ<C6B1>Ʈ<EFBFBD><C6AE> <20><><EFBFBD>̶<EFBFBD><CCB6><EFBFBD> <20><EFBFBD> <20><> <20><><EFBFBD><EFBFBD><EFBFBD>Ͽ<EFBFBD><CFBF><EFBFBD> <20>Ѵ<EFBFBD>.
|
|||
|
|
|||
|
execvp(aRgu[0] , aRgu);
|
|||
|
|
|||
|
<EFBFBD><EFBFBD> execl <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
|
|||
|
|
|||
|
::execl( "./WinSEC_D.exe" ,
|
|||
|
"./WinSEC_D.exe" ,
|
|||
|
"WinSEC_Conf.txt",
|
|||
|
NULL
|
|||
|
////// );
|
|||
|
|
|||
|
/////////////////////////////////////////////////////////////////*/
|
|||
|
|
|||
|
if(AP_ExeName==0 || AP_ExeName[0]==0) return false;
|
|||
|
|
|||
|
int VI_ForkNum = ::fork(); /*####################*/
|
|||
|
|
|||
|
if(VI_ForkNum==0) // child
|
|||
|
{
|
|||
|
if(AB_DoCloseStdInOut==true)
|
|||
|
{
|
|||
|
::close(0);
|
|||
|
::close(1);
|
|||
|
}/*
|
|||
|
if(AB_DoCloseStdInOut==true)*/
|
|||
|
|
|||
|
::setsid(); // <20>ڱ<EFBFBD> <20>ڽ<EFBFBD><DABD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>.
|
|||
|
::execvp(AP_ExeName, APA_Arg);
|
|||
|
|
|||
|
return true;
|
|||
|
}
|
|||
|
else if(VI_ForkNum==-1) // error
|
|||
|
{
|
|||
|
return false;
|
|||
|
}
|
|||
|
else // <20>θ<EFBFBD><CEB8><EFBFBD> <20><><EFBFBD><EFBFBD>
|
|||
|
{
|
|||
|
return true;
|
|||
|
}/*
|
|||
|
else*/
|
|||
|
}/*
|
|||
|
bool Exec(const char* AP_ExeName, char* const APA_Arg[], bool AB_DoCloseStdInOut=true)*/
|
|||
|
|
|||
|
static pid_t Fork (){return ::fork ();}
|
|||
|
static int GetPPID(){return ::getppid();}
|
|||
|
static int GetUID (){return ::getuid ();}
|
|||
|
static int GetGID (){return ::getgid ();}
|
|||
|
static long GetPID (){return ::getpid ();}
|
|||
|
|
|||
|
public:
|
|||
|
};/*
|
|||
|
class ZCProcess*/
|
|||
|
|
|||
|
|
|||
|
class ZCMemMap
|
|||
|
{
|
|||
|
public:
|
|||
|
|
|||
|
static void* LinkMap(
|
|||
|
int AI_FileDesc, off_t AL_Offset=0, size_t AL_MapSize=0, int AI_Protect=PROT_READ | PROT_WRITE, int AI_Flags=MAP_SHARED, void* AP_BaseAddress=NULL)
|
|||
|
{
|
|||
|
return ::mmap(AP_BaseAddress, AL_MapSize, AI_Protect, AI_Flags, AI_FileDesc, AL_Offset);
|
|||
|
}/*
|
|||
|
static void* LinkMap(
|
|||
|
int AI_FileDesc, off_t AL_Offset=0, size_t AL_MapSize=0, int AI_Protect=PROT_READ | PROT_WRITE, int AI_Flags=MAP_SHARED, void* AP_BaseAddress=NULL) */
|
|||
|
|
|||
|
/* munmap(void*,size_t)
|
|||
|
|
|||
|
Upon successful completion, munmap() returns 0. Otherwise,
|
|||
|
it returns -1 and sets errno to indicate the error */
|
|||
|
|
|||
|
static bool UnMap(void* AP_BaseAddress, size_t AL_Size)
|
|||
|
{
|
|||
|
return ::munmap(AP_BaseAddress, AL_Size)==0;
|
|||
|
}/*
|
|||
|
static bool UnMap(void* AP_BaseAddress, size_t AL_Size)*/
|
|||
|
|
|||
|
public:
|
|||
|
};/*
|
|||
|
class ZCMemMap*/
|
|||
|
|
|||
|
|
|||
|
/*/////////////////////////////////////////////////////////////////////////////
|
|||
|
|
|||
|
SHMGET(2) <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <EFBFBD><EFBFBD><EFBFBD>α<EFBFBD><EFBFBD><EFBFBD> <EFBFBD><EFBFBD><EFBFBD><EFBFBD> SHMGET(2)
|
|||
|
|
|||
|
<EFBFBD><EFBFBD> <EFBFBD≯<EFBFBD>
|
|||
|
|
|||
|
shmget - <EFBFBD><EFBFBD><EFBFBD><EFBFBD> <EFBFBD><EFBFBD><EFBFBD><EFBFBD> <EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ʈ<EFBFBD><EFBFBD> <EFBFBD>Ҵ<EFBFBD><EFBFBD>Ѵ<EFBFBD>.
|
|||
|
|
|||
|
<EFBFBD><EFBFBD> <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
|
|||
|
|
|||
|
#include <sys/ipc.h>
|
|||
|
#include <sys/shm.h>
|
|||
|
|
|||
|
int shmget(key_t key, int size, int shmflg);
|
|||
|
|
|||
|
<EFBFBD><EFBFBD> <EFBFBD><EFBFBD><EFBFBD><EFBFBD>
|
|||
|
shmget() <EFBFBD><EFBFBD> key <EFBFBD><EFBFBD><EFBFBD>ڰ<EFBFBD><EFBFBD><EFBFBD> <EFBFBD><EFBFBD><EFBFBD>õ<EFBFBD> <EFBFBD><EFBFBD><EFBFBD><EFBFBD> <EFBFBD><EFBFBD><EFBFBD><EFBFBD> <EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ʈ <EFBFBD>ĺ<EFBFBD><EFBFBD>ڸ<EFBFBD> <EFBFBD><EFBFBD>ȯ<EFBFBD>Ѵ<EFBFBD>.
|
|||
|
<EFBFBD><EFBFBD><EFBFBD><EFBFBD>, key <EFBFBD><EFBFBD> IPC_PRIVATE <EFBFBD><EFBFBD><EFBFBD><EFBFBD> <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <EFBFBD>ְų<EFBFBD> <EFBFBD>Ǵ<EFBFBD> key <EFBFBD><EFBFBD> IPC_PRIVATE <EFBFBD><EFBFBD>
|
|||
|
<EFBFBD><EFBFBD> <EFBFBD>ϰ<EFBFBD>, key <EFBFBD><EFBFBD> <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ǿ<EFBFBD> <EFBFBD>ִ<EFBFBD> <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ʈ<EFBFBD><EFBFBD> <EFBFBD><EFBFBD><EFBFBD>ٸ<EFBFBD> PAGE_SIZE <EFBFBD><EFBFBD>
|
|||
|
<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ŭ<EFBFBD><EFBFBD> size <EFBFBD><EFBFBD> <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <EFBFBD>ִ<EFBFBD> <EFBFBD><EFBFBD><EFBFBD>ο<EFBFBD> <EFBFBD><EFBFBD><EFBFBD><EFBFBD> <EFBFBD><EFBFBD><EFBFBD><EFBFBD> <EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ʈ<EFBFBD><EFBFBD> <EFBFBD><EFBFBD><EFBFBD><EFBFBD> <EFBFBD><EFBFBD> <EFBFBD><EFBFBD>
|
|||
|
<EFBFBD><EFBFBD>. IPC_CREAT <EFBFBD><EFBFBD> shmflg <EFBFBD><EFBFBD> <EFBFBD><EFBFBD><EFBFBD>õǾ<EFBFBD> <EFBFBD>ִ<EFBFBD>. (i.e. shmflg&IPC_CREAT <EFBFBD><EFBFBD>
|
|||
|
0<EFBFBD><EFBFBD> <EFBFBD>ƴϴ<EFBFBD>.)
|
|||
|
|
|||
|
shmflg <EFBFBD><EFBFBD> <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <EFBFBD><EFBFBD><EFBFBD><EFBFBD>:
|
|||
|
|
|||
|
IPC_CREAT <EFBFBD><EFBFBD><EFBFBD>ο<EFBFBD> <EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ʈ<EFBFBD><EFBFBD> <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>. <EFBFBD><EFBFBD><EFBFBD><EFBFBD> <EFBFBD><EFBFBD> <EFBFBD>÷<EFBFBD><EFBFBD>װ<EFBFBD> <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <EFBFBD>ʴ<EFBFBD> <EFBFBD><EFBFBD>
|
|||
|
<EFBFBD><EFBFBD>, shmget() <EFBFBD><EFBFBD> key<EFBFBD><EFBFBD> <EFBFBD><EFBFBD><EFBFBD>õ<EFBFBD> <EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ʈ<EFBFBD><EFBFBD> ã<EFBFBD><EFBFBD> <EFBFBD><EFBFBD><EFBFBD≯<EFBFBD>, <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
|
|||
|
<EFBFBD><EFBFBD> <EFBFBD><EFBFBD> <EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ʈ<EFBFBD><EFBFBD> <EFBFBD><EFBFBD><EFBFBD>õ<EFBFBD> shmid <EFBFBD><EFBFBD> <EFBFBD><EFBFBD><EFBFBD><EFBFBD> <EFBFBD>㰡<EFBFBD><EFBFBD><EFBFBD><EFBFBD> <EFBFBD>ִ<EFBFBD><EFBFBD><EFBFBD> <EFBFBD><EFBFBD> <EFBFBD><EFBFBD>
|
|||
|
<EFBFBD><EFBFBD><EFBFBD>ؼ<EFBFBD> <EFBFBD>˻<EFBFBD><EFBFBD>Ѵ<EFBFBD>. <EFBFBD><EFBFBD><EFBFBD><EFBFBD> <EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ʈ<EFBFBD><EFBFBD> <EFBFBD>ı<EFBFBD><EFBFBD>Ǿ<EFBFBD><EFBFBD>ٴ<EFBFBD> ǥ<EFBFBD>ø<EFBFBD> <EFBFBD><EFBFBD><EFBFBD><EFBFBD>
|
|||
|
<EFBFBD>ʵ<EFBFBD><EFBFBD><EFBFBD> <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ѵ<EFBFBD>.
|
|||
|
|
|||
|
IPC_EXCL <EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ʈ<EFBFBD><EFBFBD> <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ұ<EFBFBD><EFBFBD><EFBFBD> <EFBFBD><EFBFBD><EFBFBD>и<EFBFBD> <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ϱ<EFBFBD> <EFBFBD><EFBFBD><EFBFBD><EFBFBD> IPC_CREAT<EFBFBD><EFBFBD> <EFBFBD>Բ<EFBFBD>
|
|||
|
<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ȴ<EFBFBD>.
|
|||
|
|
|||
|
mode_flags (lowest 9 bits)
|
|||
|
<EFBFBD><EFBFBD> <EFBFBD><EFBFBD> <EFBFBD><EFBFBD>, <EFBFBD><EFBFBD>, <EFBFBD><EFBFBD> <EFBFBD>ܵ<EFBFBD><EFBFBD><EFBFBD> <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ϱ<EFBFBD> <EFBFBD><EFBFBD><EFBFBD><EFBFBD> <EFBFBD>㰡<EFBFBD><EFBFBD><EFBFBD><EFBFBD> <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ѵ<EFBFBD>.
|
|||
|
<EFBFBD><EFBFBD><EFBFBD><EFBFBD>, <EFBFBD><EFBFBD><EFBFBD><EFBFBD> <EFBFBD>㰡<EFBFBD><EFBFBD><EFBFBD><EFBFBD> <EFBFBD>ý<EFBFBD><EFBFBD>ۿ<EFBFBD> <EFBFBD><EFBFBD><EFBFBD><EFBFBD> <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <EFBFBD>ʴ´<EFBFBD>.
|
|||
|
|
|||
|
<EFBFBD><EFBFBD><EFBFBD>ο<EFBFBD> <EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ʈ<EFBFBD><EFBFBD> <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ȴٸ<EFBFBD>, shmflg <EFBFBD><EFBFBD> <EFBFBD><EFBFBD><EFBFBD><EFBFBD> <EFBFBD>㰡<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ʈ<EFBFBD><EFBFBD> <EFBFBD><EFBFBD><EFBFBD><EFBFBD> <EFBFBD><EFBFBD>
|
|||
|
<EFBFBD><EFBFBD> <EFBFBD>ִ<EFBFBD> shmid_ds <EFBFBD><EFBFBD> shm_perm <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ȴ<EFBFBD>. shmid_ds <EFBFBD><EFBFBD><EFBFBD><EFBFBD>ü:
|
|||
|
|
|||
|
struct shmid_ds {
|
|||
|
struct ipc_perm shm_perm; // <20>۹̼<DBB9>
|
|||
|
int shm_segsz; // <20><><EFBFBD><EFBFBD>Ʈ<EFBFBD><C6AE> ũ<><C5A9>(bytes)
|
|||
|
time_t shm_atime; // <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> <20>ð<EFBFBD>
|
|||
|
time_t shm_dtime; // <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> <20>ð<EFBFBD>
|
|||
|
time_t shm_ctime; // <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> <20>ð<EFBFBD>
|
|||
|
unsigned short shm_cpid; // <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> pid
|
|||
|
unsigned short shm_lpid; // <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20>۵<EFBFBD><DBB5><EFBFBD> <20><><EFBFBD>μ<EFBFBD><CEBC><EFBFBD> pid
|
|||
|
short shm_nattch; // <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD>μ<EFBFBD><CEBC><EFBFBD><EFBFBD><EFBFBD> <20><>
|
|||
|
};
|
|||
|
|
|||
|
|
|||
|
struct ipc_perm
|
|||
|
{
|
|||
|
key_t key;
|
|||
|
ushort uid; // <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> euid <20><> egid
|
|||
|
ushort gid;
|
|||
|
ushort cuid; // <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> euid <20><> egid
|
|||
|
ushort cgid;
|
|||
|
ushort mode; // shmflg<6C><67> <20><><EFBFBD><EFBFBD> 9<><39>Ʈ
|
|||
|
ushort seq; // <20><><EFBFBD><EFBFBD> <20><>(sequence number)
|
|||
|
};
|
|||
|
|
|||
|
<EFBFBD>Դٰ<EFBFBD>, <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ǵ<EFBFBD> <EFBFBD><EFBFBD><EFBFBD><EFBFBD> <EFBFBD>ý<EFBFBD><EFBFBD><EFBFBD> <EFBFBD><EFBFBD><EFBFBD><EFBFBD> <EFBFBD>ý<EFBFBD><EFBFBD><EFBFBD> <EFBFBD><EFBFBD><EFBFBD><EFBFBD> <EFBFBD><EFBFBD><EFBFBD><EFBFBD> <EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ʈ <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <EFBFBD><EFBFBD>
|
|||
|
<EFBFBD><EFBFBD> shmid_ds <EFBFBD><EFBFBD> <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <EFBFBD><EFBFBD><EFBFBD><EFBFBD> <EFBFBD>ʱ<EFBFBD>ȭ<EFBFBD>Ѵ<EFBFBD>.
|
|||
|
|
|||
|
shm_perm.cuid <EFBFBD><EFBFBD> shm_perm.uid <EFBFBD><EFBFBD> ȣ<EFBFBD><EFBFBD> <EFBFBD><EFBFBD><EFBFBD>μ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <EFBFBD><EFBFBD>ȿ user-ID <EFBFBD><EFBFBD>
|
|||
|
<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ȴ<EFBFBD>.
|
|||
|
|
|||
|
shm_perm.cgid <EFBFBD><EFBFBD> shm_perm.gid <EFBFBD><EFBFBD> ȣ<EFBFBD><EFBFBD> <EFBFBD><EFBFBD><EFBFBD>μ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <EFBFBD><EFBFBD>ȿ group-ID<EFBFBD><EFBFBD>
|
|||
|
<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ȴ<EFBFBD>.
|
|||
|
|
|||
|
shm_perm.mode <EFBFBD><EFBFBD> <EFBFBD><EFBFBD><EFBFBD><EFBFBD> 9<EFBFBD><EFBFBD>Ʈ<EFBFBD><EFBFBD><EFBFBD><EFBFBD> shmflg <EFBFBD><EFBFBD> <EFBFBD><EFBFBD><EFBFBD><EFBFBD> 9<EFBFBD><EFBFBD>Ʈ<EFBFBD><EFBFBD><EFBFBD><EFBFBD> <EFBFBD><EFBFBD><EFBFBD><EFBFBD> <EFBFBD><EFBFBD>
|
|||
|
<EFBFBD><EFBFBD>.
|
|||
|
|
|||
|
shm_segsz <EFBFBD><EFBFBD> size <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ȴ<EFBFBD>.
|
|||
|
|
|||
|
shm_lpid, shm_nattch, shm_atime <EFBFBD><EFBFBD><EFBFBD><EFBFBD> shm_dtime <EFBFBD><EFBFBD> 0 <EFBFBD><EFBFBD><EFBFBD><EFBFBD> <EFBFBD><EFBFBD><EFBFBD><EFBFBD>
|
|||
|
<EFBFBD>ȴ<EFBFBD>.
|
|||
|
|
|||
|
shm_ctime <EFBFBD><EFBFBD> <EFBFBD><EFBFBD><EFBFBD><EFBFBD> <EFBFBD>ð<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ȴ<EFBFBD>.
|
|||
|
|
|||
|
<EFBFBD><EFBFBD><EFBFBD><EFBFBD> <EFBFBD><EFBFBD><EFBFBD><EFBFBD> <EFBFBD><EFBFBD><EFBFBD><EFBFBD> <EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ʈ<EFBFBD><EFBFBD> <EFBFBD>̹<EFBFBD> <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ѵٸ<EFBFBD>, <EFBFBD><EFBFBD><EFBFBD><EFBFBD> <EFBFBD>㰡<EFBFBD><EFBFBD><EFBFBD><EFBFBD> <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ǹ<EFBFBD>, <EFBFBD><EFBFBD>
|
|||
|
<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> ǥ<EFBFBD>õǾ<EFBFBD> <EFBFBD>ִ<EFBFBD><EFBFBD><EFBFBD> <EFBFBD>˾ƺ<EFBFBD><EFBFBD><EFBFBD> <EFBFBD><EFBFBD><EFBFBD><EFBFBD> <EFBFBD>˻<EFBFBD><EFBFBD>Ѵ<EFBFBD>.
|
|||
|
|
|||
|
<EFBFBD><EFBFBD> SYSTEM CALLS
|
|||
|
|
|||
|
fork() fork() <EFBFBD>Ŀ<EFBFBD> <EFBFBD>ڽ<EFBFBD> <EFBFBD><EFBFBD><EFBFBD>μ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <EFBFBD><EFBFBD><EFBFBD><EFBFBD> <EFBFBD><EFBFBD><EFBFBD><EFBFBD> <EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ʈ<EFBFBD><EFBFBD><EFBFBD><EFBFBD> <EFBFBD><EFBFBD><EFBFBD><EFBFBD>
|
|||
|
<EFBFBD>Ѵ<EFBFBD>.
|
|||
|
|
|||
|
exec() exec() <EFBFBD>Ŀ<EFBFBD> <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <EFBFBD><EFBFBD><EFBFBD><EFBFBD> <EFBFBD><EFBFBD><EFBFBD><EFBFBD> <EFBFBD><EFBFBD><EFBFBD><EFBFBD> <EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ʈ<EFBFBD><EFBFBD> <EFBFBD>и<EFBFBD><EFBFBD>ȴ<EFBFBD>.(<EFBFBD>ı<EFBFBD> <EFBFBD><EFBFBD>
|
|||
|
<EFBFBD>°<EFBFBD><EFBFBD><EFBFBD> <EFBFBD>ƴϴ<EFBFBD>)
|
|||
|
|
|||
|
exit() exit() <EFBFBD><EFBFBD> <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <EFBFBD><EFBFBD><EFBFBD><EFBFBD> <EFBFBD><EFBFBD><EFBFBD><EFBFBD> <EFBFBD><EFBFBD><EFBFBD><EFBFBD> <EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ʈ<EFBFBD><EFBFBD> <EFBFBD>и<EFBFBD><EFBFBD>ȴ<EFBFBD>.(<EFBFBD>ı<EFBFBD><EFBFBD>Ǵ<EFBFBD>
|
|||
|
<EFBFBD><EFBFBD><EFBFBD><EFBFBD> <EFBFBD>ƴϴ<EFBFBD>)
|
|||
|
|
|||
|
<EFBFBD><EFBFBD> <EFBFBD><EFBFBD>ȯ<EFBFBD><EFBFBD>
|
|||
|
|
|||
|
<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <EFBFBD><EFBFBD>ȿ<EFBFBD><EFBFBD> <EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ʈ <EFBFBD>ĺ<EFBFBD><EFBFBD><EFBFBD> shmid <EFBFBD><EFBFBD> <EFBFBD><EFBFBD>ȯ<EFBFBD>Ǹ<EFBFBD>, <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> -1<EFBFBD><EFBFBD> <EFBFBD><EFBFBD>ȯ<EFBFBD><EFBFBD> <EFBFBD><EFBFBD>.
|
|||
|
|
|||
|
<EFBFBD><EFBFBD> <EFBFBD><EFBFBD><EFBFBD><EFBFBD>
|
|||
|
|
|||
|
<EFBFBD><EFBFBD><EFBFBD>н<EFBFBD>, errno <EFBFBD><EFBFBD> <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <EFBFBD>ϳ<EFBFBD><EFBFBD><EFBFBD> <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ȴ<EFBFBD>:
|
|||
|
|
|||
|
EINVAL <EFBFBD><EFBFBD><EFBFBD><EFBFBD> SHMMIN > size, <EFBFBD>Ǵ<EFBFBD> size > SHMMAX, <EFBFBD>Ǵ<EFBFBD> size<EFBFBD><EFBFBD> <EFBFBD><EFBFBD><EFBFBD><EFBFBD>
|
|||
|
Ʈ<EFBFBD><EFBFBD> ũ<EFBFBD>⺸<EFBFBD><EFBFBD> ũ<EFBFBD>ٸ<EFBFBD> <EFBFBD>̿<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <EFBFBD><EFBFBD>ȯ<EFBFBD>ȴ<EFBFBD>.
|
|||
|
|
|||
|
EEXIST IPC_CREAT | IPC_EXCL <EFBFBD><EFBFBD> <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ǿ<EFBFBD> <EFBFBD>ְ<EFBFBD>,
|
|||
|
<EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ʈ<EFBFBD><EFBFBD> <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <EFBFBD><EFBFBD> <EFBFBD><EFBFBD> <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <EFBFBD><EFBFBD>ȯ<EFBFBD>ȴ<EFBFBD>.
|
|||
|
|
|||
|
EIDRM <EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ʈ<EFBFBD><EFBFBD> <EFBFBD>ı<EFBFBD><EFBFBD><EFBFBD> <EFBFBD><EFBFBD><EFBFBD>ŵǵ<EFBFBD><EFBFBD><EFBFBD> ǥ<EFBFBD>õǾ<EFBFBD> <EFBFBD>ִٸ<EFBFBD> <EFBFBD><EFBFBD> <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <EFBFBD><EFBFBD>ȯ<EFBFBD>ȴ<EFBFBD>.
|
|||
|
|
|||
|
ENOSPC <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <EFBFBD><EFBFBD><EFBFBD><EFBFBD> <EFBFBD><EFBFBD><EFBFBD><EFBFBD> <EFBFBD><EFBFBD><EFBFBD><EFBFBD> id (SHMMNI) <EFBFBD><EFBFBD> <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ų<EFBFBD> <EFBFBD><EFBFBD>û<EFBFBD><EFBFBD> size <EFBFBD><EFBFBD>
|
|||
|
<EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ʈ <EFBFBD>Ҵ<EFBFBD><EFBFBD><EFBFBD> <EFBFBD>ý<EFBFBD><EFBFBD><EFBFBD> <EFBFBD><EFBFBD>ü <EFBFBD><EFBFBD><EFBFBD><EFBFBD> <EFBFBD><EFBFBD><EFBFBD><EFBFBD> <EFBFBD><EFBFBD><EFBFBD>Ѱ<EFBFBD> (SHMALL) <EFBFBD><EFBFBD> <EFBFBD>ʰ<EFBFBD><EFBFBD>Ұ<EFBFBD><EFBFBD><EFBFBD> <EFBFBD><EFBFBD>ȯ<EFBFBD>ȴ<EFBFBD>.
|
|||
|
|
|||
|
ENOENT <EFBFBD>־<EFBFBD><EFBFBD><EFBFBD> key<EFBFBD><EFBFBD> <EFBFBD>ش<EFBFBD><EFBFBD>ϴ<EFBFBD> <EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ʈ<EFBFBD><EFBFBD> <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <EFBFBD>ʰ<EFBFBD>,
|
|||
|
IPC_CREAT <EFBFBD><EFBFBD> <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <EFBFBD>ʾҴٸ<EFBFBD> <EFBFBD><EFBFBD>ȯ<EFBFBD>ȴ<EFBFBD>.
|
|||
|
|
|||
|
EACCES <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ڰ<EFBFBD> <EFBFBD><EFBFBD><EFBFBD><EFBFBD> <EFBFBD><EFBFBD><EFBFBD><EFBFBD> <EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ʈ<EFBFBD><EFBFBD> <EFBFBD><EFBFBD><EFBFBD><EFBFBD> <EFBFBD><EFBFBD><EFBFBD><EFBFBD> <EFBFBD>㰡<EFBFBD><EFBFBD><EFBFBD><EFBFBD> <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <EFBFBD><EFBFBD>ȯ<EFBFBD>ȴ<EFBFBD>.
|
|||
|
|
|||
|
ENOMEM <EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ʈ<EFBFBD><EFBFBD> <EFBFBD><EFBFBD><EFBFBD><EFBFBD> <EFBFBD>Ҵ<EFBFBD><EFBFBD><EFBFBD> <EFBFBD><EFBFBD> <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <EFBFBD><EFBFBD>ȯ<EFBFBD>ȴ<EFBFBD>.
|
|||
|
|
|||
|
<EFBFBD><EFBFBD> <EFBFBD><EFBFBD><EFBFBD><EFBFBD>
|
|||
|
|
|||
|
IPC_PRIVATE <EFBFBD><EFBFBD> <EFBFBD>÷<EFBFBD><EFBFBD><EFBFBD> <EFBFBD>ʵ尡 <EFBFBD>ƴ϶<EFBFBD> key_t Ÿ<EFBFBD><EFBFBD><EFBFBD>̴<EFBFBD>. <EFBFBD><EFBFBD> Ư<EFBFBD><EFBFBD><EFBFBD><EFBFBD> <EFBFBD><EFBFBD><EFBFBD><EFBFBD> key<EFBFBD><EFBFBD>
|
|||
|
<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ȴٸ<EFBFBD>, <EFBFBD>ý<EFBFBD><EFBFBD><EFBFBD> <EFBFBD><EFBFBD><EFBFBD><EFBFBD> shmflg <EFBFBD><EFBFBD> <EFBFBD><EFBFBD><EFBFBD><EFBFBD> 9<EFBFBD><EFBFBD>Ʈ<EFBFBD><EFBFBD><EFBFBD><EFBFBD> <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ѵ<EFBFBD>.
|
|||
|
<EFBFBD><EFBFBD><EFBFBD><EFBFBD> <EFBFBD><EFBFBD> <EFBFBD><EFBFBD><EFBFBD><EFBFBD> <EFBFBD><EFBFBD><EFBFBD><EFBFBD> <EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ʈ<EFBFBD><EFBFBD> <EFBFBD><EFBFBD><EFBFBD><EFBFBD>(<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>)<EFBFBD>Ѵ<EFBFBD>.
|
|||
|
|
|||
|
<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> shmget <EFBFBD>ý<EFBFBD><EFBFBD><EFBFBD> <EFBFBD>ݿ<EFBFBD> <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <EFBFBD>ִ<EFBFBD> <EFBFBD><EFBFBD><EFBFBD><EFBFBD> <EFBFBD><EFBFBD><EFBFBD><EFBFBD> <EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ʈ <EFBFBD>ڿ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <EFBFBD><EFBFBD><EFBFBD>Ѱ<EFBFBD><EFBFBD><EFBFBD><EFBFBD>̴<EFBFBD>:
|
|||
|
|
|||
|
SHMALL <EFBFBD>ý<EFBFBD><EFBFBD><EFBFBD> <EFBFBD><EFBFBD>ü<EFBFBD><EFBFBD> <EFBFBD><EFBFBD><EFBFBD><EFBFBD> <EFBFBD><EFBFBD><EFBFBD><EFBFBD> <EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ʈ <EFBFBD>ִ<EFBFBD> <EFBFBD><EFBFBD>: <EFBFBD><EFBFBD>å <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>̴<EFBFBD>.
|
|||
|
SHMMAX <EFBFBD><EFBFBD><EFBFBD><EFBFBD> <EFBFBD><EFBFBD><EFBFBD><EFBFBD> <EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ʈ<EFBFBD><EFBFBD> <EFBFBD>ִ<EFBFBD> ũ<EFBFBD><EFBFBD>(<EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ʈ<EFBFBD><EFBFBD>): <EFBFBD><EFBFBD><EFBFBD><EFBFBD> <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>̴<EFBFBD>.(<EFBFBD><EFBFBD><EFBFBD><EFBFBD> 4M)
|
|||
|
SHMMIN <EFBFBD><EFBFBD><EFBFBD><EFBFBD> <EFBFBD><EFBFBD><EFBFBD><EFBFBD> <EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ʈ<EFBFBD><EFBFBD> <EFBFBD>ּ<EFBFBD> ũ<EFBFBD><EFBFBD>(<EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ʈ<EFBFBD><EFBFBD>): <EFBFBD><EFBFBD><EFBFBD><EFBFBD> <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>̴<EFBFBD>.
|
|||
|
(PAGE_SIZE <EFBFBD><EFBFBD> <EFBFBD><EFBFBD>ȿ<EFBFBD><EFBFBD> <EFBFBD>ּ<EFBFBD> ũ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>, <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> 1byte<EFBFBD>̴<EFBFBD>.)
|
|||
|
SHMMNI <EFBFBD>ý<EFBFBD><EFBFBD><EFBFBD> <EFBFBD><EFBFBD>ü<EFBFBD><EFBFBD> <EFBFBD><EFBFBD><EFBFBD><EFBFBD> <EFBFBD><EFBFBD><EFBFBD><EFBFBD> <EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ʈ <EFBFBD>ִ<EFBFBD> <EFBFBD><EFBFBD>: <EFBFBD><EFBFBD><EFBFBD><EFBFBD> <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>̴<EFBFBD>(<EFBFBD><EFBFBD><EFBFBD><EFBFBD> 4096)
|
|||
|
|
|||
|
<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <EFBFBD><EFBFBD><EFBFBD>μ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <EFBFBD><EFBFBD><EFBFBD><EFBFBD> <EFBFBD><EFBFBD><EFBFBD><EFBFBD> <EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ʈ<EFBFBD><EFBFBD> Ư<EFBFBD><EFBFBD><EFBFBD><EFBFBD> <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <EFBFBD><EFBFBD><EFBFBD><EFBFBD>. (SHMSEG)
|
|||
|
|
|||
|
/////////////////////////////////////////////////////////////////////////////*/
|
|||
|
|
|||
|
|
|||
|
// <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><DEB8><EFBFBD> Ŭ<><C5AC><EFBFBD><EFBFBD>
|
|||
|
|
|||
|
class ZCShareMemory
|
|||
|
{
|
|||
|
private:
|
|||
|
enum{EInvalidID=-1};
|
|||
|
private:
|
|||
|
ZTypeID mh_FileMap;
|
|||
|
void* mp_Address;
|
|||
|
public :
|
|||
|
|
|||
|
ZCShareMemory()
|
|||
|
{
|
|||
|
mh_FileMap= EInvalidID;
|
|||
|
mp_Address= 0 ;
|
|||
|
}/*
|
|||
|
ZCShareMemory()*/
|
|||
|
|
|||
|
ZTypeID GetID() const
|
|||
|
{
|
|||
|
return mh_FileMap;
|
|||
|
}/*
|
|||
|
ZTypeID GetID() const*/
|
|||
|
|
|||
|
bool IsValidID() const
|
|||
|
{
|
|||
|
return mh_FileMap != -1;
|
|||
|
}/*
|
|||
|
bool IsValidID() const*/
|
|||
|
|
|||
|
void* GetStartAddress() const
|
|||
|
{
|
|||
|
return mp_Address;
|
|||
|
}/*
|
|||
|
void* GetStartAddress() const*/
|
|||
|
|
|||
|
bool Create(const char* AP_MapName, long AL_MapSize, int AI_Flag=IPC_CREAT | IPC_EXCL | 0664)
|
|||
|
{
|
|||
|
return Create((key_t)(ZNsMain::ZfGetKeyNum(AP_MapName)), AL_MapSize, AI_Flag);
|
|||
|
}/*
|
|||
|
bool Create(const char* AP_MapName, long AL_MapSize, int AI_Flag=IPC_CREAT | IPC_EXCL | 0664)*/
|
|||
|
|
|||
|
bool Create(long AL_MapID, long AL_MapSize, int AI_Flag=IPC_CREAT | IPC_EXCL | 0664)
|
|||
|
{
|
|||
|
if((mh_FileMap=::shmget((key_t)AL_MapID, AL_MapSize, AI_Flag))==-1)
|
|||
|
{
|
|||
|
if(errno==EEXIST)
|
|||
|
{
|
|||
|
return (mh_FileMap=::shmget(AL_MapID, 0, 0)) != -1;
|
|||
|
}/*
|
|||
|
if(errno==EEXIST)*/
|
|||
|
|
|||
|
return false;
|
|||
|
}/*
|
|||
|
if((mh_FileMap=::shmget((key_t)AL_MapID, AL_MapSize, AI_Flag))==-1)*/
|
|||
|
|
|||
|
return true;
|
|||
|
}/*
|
|||
|
bool Create(long AL_MapID, long AL_MapSize, int AI_Flag=IPC_CREAT | IPC_EXCL | 0664)*/
|
|||
|
|
|||
|
|
|||
|
bool ShmGet(const char* AP_MapName, long AL_MapSize, int AI_Flag=IPC_CREAT | IPC_EXCL | 0664)
|
|||
|
{
|
|||
|
return (mh_FileMap=::shmget((key_t)(ZNsMain::ZfGetKeyNum(AP_MapName)), AL_MapSize, AI_Flag))!=-1 ;
|
|||
|
}/*
|
|||
|
bool ShmGet(const char* AP_MapName, long AL_MapSize, int AI_Flag=IPC_CREAT | IPC_EXCL | 0664)*/
|
|||
|
|
|||
|
bool ShmGet(const char* AP_MapName)
|
|||
|
{
|
|||
|
return (mh_FileMap=::shmget((key_t)(ZNsMain::ZfGetKeyNum(AP_MapName)), 0 ,0))!=-1 ;
|
|||
|
}/*
|
|||
|
bool ShmGet(const char* AP_MapName)*/
|
|||
|
|
|||
|
bool ShmGet(long AL_MapID, long AL_MapSize, int AI_Flag=IPC_CREAT | IPC_EXCL | 0664)
|
|||
|
{
|
|||
|
return (mh_FileMap=::shmget((key_t)AL_MapID, AL_MapSize, AI_Flag))!=-1 ;
|
|||
|
}/*
|
|||
|
bool ShmGet(long AL_MapID, long AL_MapSize, int AI_Flag=IPC_CREAT | IPC_EXCL | 0664)*/
|
|||
|
|
|||
|
bool ShmGet(long AL_MapID)
|
|||
|
{
|
|||
|
// key <20><> AL_MapID <20><> <20><><EFBFBD><EFBFBD><EFBFBD><DEB8> <20>ִ<EFBFBD><D6B4><EFBFBD> <20><><EFBFBD><EFBFBD>
|
|||
|
|
|||
|
return (mh_FileMap=::shmget((key_t)AL_MapID, 0, 0))!=-1 ;
|
|||
|
}/*
|
|||
|
bool ShmGet(long AL_MapID)*/
|
|||
|
|
|||
|
|
|||
|
bool LinkMap()
|
|||
|
{
|
|||
|
// void *shmat(int shmid, const void *shmaddr, int shmflg);
|
|||
|
|
|||
|
return (mp_Address=::shmat(mh_FileMap, (void*)0, 0))!=NULL ;
|
|||
|
|
|||
|
// shmat() <20><> 3 <20><>° <20>μ<EFBFBD><CEBC><EFBFBD> SHM_RDONLY <20>÷<EFBFBD><C3B7><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD>ϸ<EFBFBD>
|
|||
|
// <20><><EFBFBD><EFBFBD> <20><EFBFBD><DEB8><EFBFBD> <20><><EFBFBD><EFBFBD>Ʈ<EFBFBD><C6AE> <20><><EFBFBD>εǾ<CEB5><C7BE><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>, <20>б<EFBFBD><D0B1><EFBFBD><EFBFBD><EFBFBD>(readonly)<29><> ǥ<>õȴ<C3B5>
|
|||
|
}/*
|
|||
|
bool LinkMap()*/
|
|||
|
|
|||
|
bool UnMap()
|
|||
|
{
|
|||
|
// cf) In Window : BOOL UnmapViewOfFile(LPCVOID lpBaseAddress);
|
|||
|
|
|||
|
bool VB_IsOK=(::shmdt(mp_Address)!=-1); mp_Address=0; return VB_IsOK;
|
|||
|
}/*
|
|||
|
bool UnMap()*/
|
|||
|
|
|||
|
bool Close()
|
|||
|
{
|
|||
|
bool VB_IsOK=(::shmctl(mh_FileMap, IPC_RMID, 0)!=-1) ;
|
|||
|
|
|||
|
mh_FileMap=EInvalidID; return VB_IsOK;
|
|||
|
|
|||
|
/* IPC_RMID <20><><EFBFBD>ɾ<EFBFBD><C9BE><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> Ŀ<>η<EFBFBD> <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD>Ʈ<EFBFBD><C6AE> <20><><EFBFBD><EFBFBD><EFBFBD>ϴ<EFBFBD> <20><><EFBFBD><EFBFBD> <20>ƴϴ<C6B4>.
|
|||
|
<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ϱ<EFBFBD> <EFBFBD><EFBFBD><EFBFBD><EFBFBD> <EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ʈ<EFBFBD><EFBFBD> ǥ<EFBFBD>ø<EFBFBD> <EFBFBD>صд<EFBFBD>. <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <EFBFBD><EFBFBD><EFBFBD><EFBFBD> <EFBFBD><EFBFBD>ü<EFBFBD><EFBFBD> <EFBFBD><EFBFBD><EFBFBD><EFBFBD> <EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ʈ<EFBFBD><EFBFBD>
|
|||
|
<EFBFBD>پ<EFBFBD> <EFBFBD>ִ<EFBFBD>(attached) <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <EFBFBD><EFBFBD><EFBFBD>μ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <EFBFBD>и<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>(detached) <EFBFBD><EFBFBD> <EFBFBD>Ͼ<EFBFBD><EFBFBD>.
|
|||
|
<EFBFBD><EFBFBD><EFBFBD><EFBFBD>, <EFBFBD><EFBFBD><EFBFBD><EFBFBD> <EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ʈ<EFBFBD><EFBFBD> <EFBFBD>پ<EFBFBD><EFBFBD>ִ<EFBFBD> (attached) <EFBFBD><EFBFBD><EFBFBD>μ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>, <EFBFBD><EFBFBD><EFBFBD>Ŵ<EFBFBD> <EFBFBD><EFBFBD><EFBFBD><EFBFBD>
|
|||
|
<EFBFBD>̷<EFBFBD><EFBFBD><EFBFBD> <EFBFBD><EFBFBD><EFBFBD><EFBFBD>. */
|
|||
|
}/*
|
|||
|
bool Close()*/
|
|||
|
|
|||
|
public:
|
|||
|
};/*
|
|||
|
class ZCShareMemory*/
|
|||
|
|
|||
|
|
|||
|
/*////////////////////////////////////////////////////////////////////////////////////////
|
|||
|
|
|||
|
<EFBFBD><EFBFBD> class ZCProcessMutex <EFBFBD><EFBFBD> <EFBFBD><EFBFBD><EFBFBD>μ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <EFBFBD><EFBFBD><EFBFBD>ؽ<EFBFBD>.
|
|||
|
|
|||
|
Window <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <EFBFBD≯<EFBFBD><EFBFBD>ִ<EFBFBD> mutex <EFBFBD><EFBFBD> <EFBFBD><EFBFBD><EFBFBD><EFBFBD> <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>, Linux <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <EFBFBD><EFBFBD> <EFBFBD><EFBFBD><EFBFBD><EFBFBD> <EFBFBD>ִ<EFBFBD>.
|
|||
|
pthread <EFBFBD><EFBFBD><EFBFBD>̺귯<EFBFBD><EFBFBD><EFBFBD><EFBFBD> <EFBFBD>Ἥ <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> mutex <EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ÿ<EFBFBD><EFBFBD> <EFBFBD>־ <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <EFBFBD><EFBFBD>ŭ <EFBFBD>ܼ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
|
|||
|
<EFBFBD>ʿ<EFBFBD><EFBFBD>ϴ<EFBFBD>.
|
|||
|
|
|||
|
Linux <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <EFBFBD><EFBFBD><EFBFBD>߾<EFBFBD><EFBFBD><EFBFBD><EFBFBD>忡<EFBFBD><EFBFBD> <EFBFBD><EFBFBD><EFBFBD><EFBFBD> <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <EFBFBD><EFBFBD><EFBFBD><EFBFBD> <EFBFBD><EFBFBD><EFBFBD>μ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <EFBFBD><EFBFBD><EFBFBD><EFBFBD> <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <EFBFBD>ٸ<EFBFBD><EFBFBD><EFBFBD>.
|
|||
|
<EFBFBD><EFBFBD>Ȯ<EFBFBD><EFBFBD><EFBFBD><EFBFBD> pthread <EFBFBD><EFBFBD> <EFBFBD><EFBFBD><EFBFBD>μ<EFBFBD><EFBFBD><EFBFBD> <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <EFBFBD><EFBFBD><EFBFBD><EFBFBD> <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <EFBFBD>ʴ´<EFBFBD>. (2006-12-28 16:02:00)
|
|||
|
|
|||
|
////////////////////////////////////////////////////////////////////////////////////////*/
|
|||
|
|
|||
|
class ZCProcessMutex
|
|||
|
{
|
|||
|
private:
|
|||
|
ZTypeID mh_Mutex;
|
|||
|
private:
|
|||
|
|
|||
|
bool Init(int AI_InitNum=1)
|
|||
|
{
|
|||
|
// <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD>
|
|||
|
// <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> <20>ʱ<EFBFBD>ȭ<EFBFBD>Ѵ<EFBFBD>.
|
|||
|
|
|||
|
union semun SemUnion; SemUnion.val=AI_InitNum;
|
|||
|
|
|||
|
return ::semctl(mh_Mutex, 0, SETVAL, SemUnion)!=-1 ;
|
|||
|
|
|||
|
/*//////////////////////////////////////////////////////////
|
|||
|
|
|||
|
int semctl(int semid, int semnum, int cmd, ...)
|
|||
|
|
|||
|
If successful, the value returned by semctl() depends on cmd as follows:
|
|||
|
GETVAL
|
|||
|
The value of semval.
|
|||
|
GETPID
|
|||
|
The value of sempid.
|
|||
|
GETNCNT
|
|||
|
The value of semncnt.
|
|||
|
GETZCNT
|
|||
|
The value of semzcnt.
|
|||
|
All others
|
|||
|
0.
|
|||
|
Otherwise, semctl() returns -1 and errno indicates the error
|
|||
|
|
|||
|
//////////////////////////////////////////////////////////*/
|
|||
|
}/*
|
|||
|
bool Init(int AI_InitNum=1)*/
|
|||
|
|
|||
|
/*private:*/
|
|||
|
public :
|
|||
|
|
|||
|
ZCProcessMutex()
|
|||
|
{
|
|||
|
mh_Mutex=0;
|
|||
|
}/*
|
|||
|
ZCProcessMutex()*/
|
|||
|
|
|||
|
ZTypeID GetHandle() const
|
|||
|
{
|
|||
|
return mh_Mutex;
|
|||
|
}/*
|
|||
|
ZTypeID GetHandle() const*/
|
|||
|
|
|||
|
|
|||
|
// Linux <20><> <20><><EFBFBD><EFBFBD> <20><><EFBFBD>μ<EFBFBD><CEBC><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> Window <20><> <20><><EFBFBD>μ<EFBFBD><CEBC><EFBFBD> <20><><EFBFBD>ؽ<EFBFBD><D8BD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD>Ѵ<EFBFBD>.
|
|||
|
// Window <20><> <20><><EFBFBD>ؽ<EFBFBD><D8BD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD>μ<EFBFBD><CEBC><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> Linux <20><>
|
|||
|
// <20><><EFBFBD>쿡<EFBFBD><ECBFA1> <20><EFBFBD><D7B7><EFBFBD> <20>ʴ<EFBFBD>. 2006-08-06 15:55:00
|
|||
|
|
|||
|
bool Make(const char* AP_MutexName, int AI_Flag=IPC_CREAT | IPC_EXCL | 0664)
|
|||
|
{
|
|||
|
return this->Make(ZNsMain::ZfGetKeyNum(AP_MutexName), AI_Flag);
|
|||
|
}/*
|
|||
|
bool Make(const char* AP_MutexName, int AI_Flag=IPC_CREAT | IPC_EXCL | 0664)*/
|
|||
|
|
|||
|
bool Make(long AL_KeyID, int AI_Flag=IPC_CREAT | IPC_EXCL | 0664)
|
|||
|
{
|
|||
|
// AI_Flag <20><> IPC_CREAT,IPC_EXCL,0 <20><> <20><> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20>ϳ<EFBFBD><CFB3≯<EFBFBD>
|
|||
|
// 0 <20≯<EFBFBD> <20>ش<EFBFBD> <20><><EFBFBD><EFBFBD>ȭobject <20><> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD>.
|
|||
|
|
|||
|
// int semget(key_t key,int nsems,int semflg)
|
|||
|
|
|||
|
if((mh_Mutex=::semget((key_t)AL_KeyID, 1, AI_Flag))==-1)
|
|||
|
{
|
|||
|
if(errno==EEXIST)
|
|||
|
{
|
|||
|
return (mh_Mutex=::semget((key_t)AL_KeyID, 1, 0)) != -1;
|
|||
|
}/*
|
|||
|
if(errno==EEXIST)*/
|
|||
|
|
|||
|
return false;
|
|||
|
}/*
|
|||
|
if((mh_Mutex=::semget((key_t)AL_KeyID, 1, AI_Flag))==-1)*/
|
|||
|
|
|||
|
this->Init(); return true;
|
|||
|
}/*
|
|||
|
bool Make(long AL_KeyID, int AI_Flag=IPC_CREAT | IPC_EXCL | 0664)*/
|
|||
|
|
|||
|
bool Lock()
|
|||
|
{
|
|||
|
struct sembuf sembuf_Obj;
|
|||
|
sembuf_Obj.sem_num= 0; // semaphore <20>迭<EFBFBD><E8BFAD><EFBFBD><EFBFBD> <20><> <20><>° semaphore <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD>
|
|||
|
sembuf_Obj.sem_op =-1;
|
|||
|
sembuf_Obj.sem_flg=SEM_UNDO;
|
|||
|
|
|||
|
return ::semop(mh_Mutex, &sembuf_Obj, 1)==0 ;
|
|||
|
}/*
|
|||
|
bool Lock()*/
|
|||
|
|
|||
|
bool UnLock()
|
|||
|
{
|
|||
|
struct sembuf sembuf_Obj;
|
|||
|
sembuf_Obj.sem_num=0 ; // semaphore <20>迭<EFBFBD><E8BFAD><EFBFBD><EFBFBD> <20><> <20><>° semaphore <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD>
|
|||
|
sembuf_Obj.sem_op =1 ;
|
|||
|
sembuf_Obj.sem_flg=SEM_UNDO;
|
|||
|
|
|||
|
return ::semop(mh_Mutex,&sembuf_Obj, 1)==0 ;
|
|||
|
}/*
|
|||
|
bool UnLock()*/
|
|||
|
|
|||
|
bool Close()
|
|||
|
{
|
|||
|
// Ŀ<>ο<EFBFBD><CEBF><EFBFBD> semaphore <20><> <20><><EFBFBD>ŵȴ<C5B5>. <20><> <20>Լ<EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD>Ŀ<EFBFBD> ipcs <20><> <20><><EFBFBD><EFBFBD>
|
|||
|
// semaphore <20><><EFBFBD>Ͽ<EFBFBD> <20><>Ÿ<EFBFBD><C5B8><EFBFBD><EFBFBD> <20>ʴ´<CAB4>. <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><> <20><> <20><><EFBFBD><EFBFBD> <20>Ŀ<EFBFBD><C4BF><EFBFBD> Lock()
|
|||
|
// <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD>ϰ<EFBFBD> <20>ִ<EFBFBD> <20><><EFBFBD>μ<EFBFBD><CEBC><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20>Ѳ<EFBFBD><D1B2><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EEB3AA> <20><><EFBFBD>̻<EFBFBD>
|
|||
|
// <20><><EFBFBD><EFBFBD>ȭ<EFBFBD><C8AD><EFBFBD><EFBFBD> <20>ʴ´<CAB4>. <20><><EFBFBD>μ<EFBFBD><CEBC><EFBFBD><EFBFBD><EFBFBD> <20><> <20>Լ<EFBFBD><D4BC><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20>ʰ<EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD>ص<EFBFBD> Ŀ
|
|||
|
// <20><><EFBFBD><EFBFBD> <20>ڵ<EFBFBD><DAB5><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> semaphore <20><> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20>ʴ´<CAB4>.
|
|||
|
|
|||
|
union semun SemUnion;
|
|||
|
|
|||
|
const bool CB_IsOK =
|
|||
|
(::semctl(mh_Mutex, 0, IPC_RMID, SemUnion)!=-1);
|
|||
|
|
|||
|
mh_Mutex=0; return CB_IsOK;
|
|||
|
}/*
|
|||
|
bool Close()*/
|
|||
|
|
|||
|
public:
|
|||
|
};/*
|
|||
|
class ZCProcessMutex*/
|
|||
|
|
|||
|
|
|||
|
|
|||
|
///////////////////////////////////////////////
|
|||
|
|
|||
|
/////////// end class ZCProcessMutex ///////////
|
|||
|
|
|||
|
///////////////////////////////////////////////
|
|||
|
|
|||
|
|
|||
|
|
|||
|
// posix mutex <20><> <20><><EFBFBD>μ<EFBFBD><CEBC><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD>ȭ<EFBFBD><C8AD> <20>ϴ<EFBFBD> Ŭ<><C5AC><EFBFBD><EFBFBD>
|
|||
|
|
|||
|
|
|||
|
class ZCProcessMutexPosix
|
|||
|
{
|
|||
|
private:
|
|||
|
|
|||
|
class ZCMutexData
|
|||
|
{
|
|||
|
protected:
|
|||
|
friend class ZCProcessMutexPosix;
|
|||
|
protected:
|
|||
|
pthread_mutex_t mo_PThreadMutex ;
|
|||
|
pthread_mutexattr_t mo_PThreadMutexAttr;
|
|||
|
protected:
|
|||
|
};/*
|
|||
|
class ZCMutexData*/
|
|||
|
|
|||
|
private:
|
|||
|
ZCMutexData* mp_MutexData ;
|
|||
|
ZCShareMemory mo_CShareMemory;
|
|||
|
public :
|
|||
|
|
|||
|
ZCProcessMutexPosix()
|
|||
|
{
|
|||
|
mp_MutexData=0;
|
|||
|
}/*
|
|||
|
ZCProcessMutexPosix()*/
|
|||
|
|
|||
|
bool Make(LPCTSTR AP_MapName)
|
|||
|
{
|
|||
|
return Make( ZNsMain::ZfGetKeyNum(AP_MapName) );
|
|||
|
}/*
|
|||
|
bool Make(LPCTSTR AP_MapName)*/
|
|||
|
|
|||
|
bool Make(long AL_MapKey)
|
|||
|
{
|
|||
|
if(mo_CShareMemory.ShmGet(AL_MapKey,sizeof(ZCMutexData))==false)
|
|||
|
{
|
|||
|
if(errno!=EEXIST || mo_CShareMemory.ShmGet(AL_MapKey)!=true)
|
|||
|
{
|
|||
|
return false;
|
|||
|
}
|
|||
|
if(mo_CShareMemory.LinkMap()==false)
|
|||
|
{
|
|||
|
mo_CShareMemory.Close(); return false;
|
|||
|
}/*
|
|||
|
if(mo_CShareMemory.LinkMap()==false)*/
|
|||
|
|
|||
|
mp_MutexData=(ZCMutexData*)mo_CShareMemory.GetStartAddress();
|
|||
|
}
|
|||
|
else // mo_CShareMemory.ShmGet(AL_MapKey,sizeof(ZCMutexData))==true
|
|||
|
{
|
|||
|
if(mo_CShareMemory.LinkMap()==false)
|
|||
|
{
|
|||
|
mo_CShareMemory.Close(); return false;
|
|||
|
}/*
|
|||
|
if(mo_CShareMemory.LinkMap()==false)*/
|
|||
|
|
|||
|
mp_MutexData=(ZCMutexData*)mo_CShareMemory.GetStartAddress();
|
|||
|
|
|||
|
::memset(mp_MutexData, 0x00, sizeof(ZCMutexData));
|
|||
|
|
|||
|
::pthread_mutexattr_init (&mp_MutexData->mo_PThreadMutexAttr);
|
|||
|
::pthread_mutexattr_settype (&mp_MutexData->mo_PThreadMutexAttr, PTHREAD_MUTEX_RECURSIVE); // <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> PTHREAD_MUTEX_ERRORCHECK <20><> <20><><EFBFBD><EFBFBD><EFBFBD>߾<EFBFBD><DFBE><EFBFBD>. 2007-05-24 20:04:00
|
|||
|
::pthread_mutexattr_setpshared(&mp_MutexData->mo_PThreadMutexAttr, PTHREAD_PROCESS_SHARED);
|
|||
|
::pthread_mutex_init (&mp_MutexData->mo_PThreadMutex, (const pthread_mutexattr_t*)&mp_MutexData->mo_PThreadMutexAttr);
|
|||
|
}/*
|
|||
|
else // mo_CShareMemory.ShmGet(AL_MapKey,sizeof(ZCMutexData))==true*/
|
|||
|
|
|||
|
return true;
|
|||
|
}/*
|
|||
|
bool Make(long AL_MapKey)*/
|
|||
|
|
|||
|
|
|||
|
bool Lock()
|
|||
|
{
|
|||
|
return this->LockRaw()==0;
|
|||
|
}/*
|
|||
|
int Lock()*/
|
|||
|
|
|||
|
int LockRaw()
|
|||
|
{
|
|||
|
return ::pthread_mutex_lock(&mp_MutexData->mo_PThreadMutex);
|
|||
|
|
|||
|
// EDEADLK <20><> <20><>ȯ<EFBFBD>ϴ<EFBFBD> <20><><EFBFBD>츦 üũ<C3BC><C5A9> <20><>.
|
|||
|
}/*
|
|||
|
int Lock()*/
|
|||
|
|
|||
|
#ifdef __USE_XOPEN2K
|
|||
|
|
|||
|
bool Lock(const struct timespec& AR_TimeSpec)
|
|||
|
{
|
|||
|
return this->LockRaw(AR_TimeSpec)==0;
|
|||
|
}/*
|
|||
|
int Lock(const struct timespec& AR_TimeSpec)*/
|
|||
|
|
|||
|
bool Lock(long AL_MiliSec)
|
|||
|
{
|
|||
|
return this->LockRaw(AL_MiliSec)==0;
|
|||
|
}/*
|
|||
|
int Lock(long AL_MiliSec)*/
|
|||
|
|
|||
|
int LockRaw(const struct timespec& AR_TimeSpec)
|
|||
|
{
|
|||
|
return ::pthread_mutex_timedlock(&mp_MutexData->mo_PThreadMutex, &AR_TimeSpec);
|
|||
|
|
|||
|
// <20><><EFBFBD><EFBFBD><EFBFBD≯<EFBFBD> ZNsEnum::ZEThread_OK <20><>
|
|||
|
// <20>ð<EFBFBD><C3B0>ʰ<EFBFBD><CAB0≯<EFBFBD> ZNsEnum::ZEThread_TimeOut <20><> <20><><EFBFBD><EFBFBD>
|
|||
|
//
|
|||
|
// EDEADLK <20><> <20><>ȯ<EFBFBD>ϴ<EFBFBD> <20><><EFBFBD>츦 üũ<C3BC><C5A9> <20><>.
|
|||
|
}/*
|
|||
|
int Lock(const struct timespec& AR_TimeSpec)*/
|
|||
|
|
|||
|
int LockRaw(long AL_MiliSec)
|
|||
|
{
|
|||
|
timespec VO_TimeSpec;
|
|||
|
|
|||
|
VO_TimeSpec.tv_sec =time(NULL)+AL_MiliSec/1000;
|
|||
|
VO_TimeSpec.tv_nsec=(AL_MiliSec%1000)*1000*1000;
|
|||
|
|
|||
|
return ::pthread_mutex_timedlock(&mp_MutexData->mo_PThreadMutex, &VO_TimeSpec);
|
|||
|
}/*
|
|||
|
int Lock(long AL_MiliSec)*/
|
|||
|
|
|||
|
int LockTime(long AL_MiliSec)
|
|||
|
{
|
|||
|
return LockRaw(AL_MiliSec);
|
|||
|
}/*
|
|||
|
int LockTime(long AL_MiliSec)*/
|
|||
|
|
|||
|
#endif // __USE_XOPEN2K
|
|||
|
|
|||
|
bool UnLock()
|
|||
|
{
|
|||
|
return ::pthread_mutex_unlock(&mp_MutexData->mo_PThreadMutex)==0;
|
|||
|
}/*
|
|||
|
bool UnLock()*/
|
|||
|
|
|||
|
void Close()
|
|||
|
{
|
|||
|
::pthread_mutex_destroy(&mp_MutexData->mo_PThreadMutex);
|
|||
|
|
|||
|
mo_CShareMemory.UnMap();
|
|||
|
mo_CShareMemory.Close();
|
|||
|
}/*
|
|||
|
void Close()*/
|
|||
|
|
|||
|
public:
|
|||
|
};/*
|
|||
|
class ZCProcessMutexPosix*/
|
|||
|
|
|||
|
|
|||
|
#ifdef __USE_XOPEN2K
|
|||
|
|
|||
|
|
|||
|
/*////////////////////////////////////////////////////////////////////////////////
|
|||
|
|
|||
|
<EFBFBD><EFBFBD> <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>/<EFBFBD>ǵ<EFBFBD><EFBFBD><EFBFBD> lock(read-write lock) <EFBFBD><EFBFBD><EFBFBD><EFBFBD> Window <EFBFBD><EFBFBD> <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <EFBFBD>̺<EFBFBD>Ʈ<EFBFBD><EFBFBD> <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <EFBFBD><EFBFBD>
|
|||
|
<EFBFBD>ִ<EFBFBD>. <EFBFBD><EFBFBD> Ư<EFBFBD><EFBFBD> <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <EFBFBD>ټ<EFBFBD><EFBFBD><EFBFBD> <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>尡 <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ϴٰ<EFBFBD> <EFBFBD><EFBFBD><EFBFBD>ÿ<EFBFBD> <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
|
|||
|
<EFBFBD><EFBFBD>. <EFBFBD><EFBFBD><EFBFBD><EFBFBD> <EFBFBD><EFBFBD><EFBFBD>ؽ<EFBFBD> <EFBFBD><EFBFBD><EFBFBD>Ǻ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <EFBFBD>̺<EFBFBD>Ʈ<EFBFBD><EFBFBD> <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ϴ<EFBFBD> <EFBFBD><EFBFBD><EFBFBD><EFBFBD> <EFBFBD><EFBFBD> ȿ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>̴<EFBFBD>.
|
|||
|
|
|||
|
<EFBFBD><EFBFBD> POSIX.1b structure for a time value.
|
|||
|
This is like a `struct timeval' but has nanoseconds instead of microseconds.
|
|||
|
|
|||
|
struct timespec
|
|||
|
{
|
|||
|
__time_t tv_sec ; // Seconds.
|
|||
|
long int tv_nsec; // Nanoseconds. 10 <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> 1 <20><>, 1 <20>и<EFBFBD><D0B8><EFBFBD>=1000*1000 <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
|
|||
|
};
|
|||
|
|
|||
|
////////////////////////////////////////////////////////////////////////////////*/
|
|||
|
|
|||
|
class ZCLockRW_Base
|
|||
|
{
|
|||
|
protected:
|
|||
|
pthread_rwlock_t mo_pthread_rwlock_t;
|
|||
|
public:
|
|||
|
|
|||
|
int Init()
|
|||
|
{
|
|||
|
return ::pthread_rwlock_init(&mo_pthread_rwlock_t, NULL);
|
|||
|
}/*
|
|||
|
int Init()*/
|
|||
|
|
|||
|
int LockRead()
|
|||
|
{
|
|||
|
return ::pthread_rwlock_rdlock(&mo_pthread_rwlock_t);
|
|||
|
}/*
|
|||
|
int LockRead()*/
|
|||
|
|
|||
|
int LockRead(const struct timespec& AR_TimeSpec)
|
|||
|
{
|
|||
|
return ::pthread_rwlock_timedrdlock(&mo_pthread_rwlock_t, &AR_TimeSpec);
|
|||
|
}/*
|
|||
|
int LockRead(const struct timespec& AR_TimeSpec)*/
|
|||
|
|
|||
|
int LockRead(long AL_MiliSec)
|
|||
|
{
|
|||
|
timespec VO_TimeSpec;
|
|||
|
|
|||
|
VO_TimeSpec.tv_sec =time(NULL)+AL_MiliSec/1000;
|
|||
|
VO_TimeSpec.tv_nsec=(AL_MiliSec%1000)*1000*1000;
|
|||
|
|
|||
|
return ::pthread_rwlock_timedrdlock(&mo_pthread_rwlock_t, &VO_TimeSpec);
|
|||
|
}/*
|
|||
|
int LockRead(long AL_MiliSec)*/
|
|||
|
|
|||
|
int TryLockRead()
|
|||
|
{
|
|||
|
return ::pthread_rwlock_tryrdlock(&mo_pthread_rwlock_t);
|
|||
|
}/*
|
|||
|
int TryLockRead()*/
|
|||
|
|
|||
|
int LockWrite()
|
|||
|
{
|
|||
|
return ::pthread_rwlock_wrlock(&mo_pthread_rwlock_t);
|
|||
|
}/*
|
|||
|
int LockRead()*/
|
|||
|
|
|||
|
int LockWrite(const struct timespec& AR_TimeSpec)
|
|||
|
{
|
|||
|
return ::pthread_rwlock_timedwrlock(&mo_pthread_rwlock_t,&AR_TimeSpec);
|
|||
|
}/*
|
|||
|
int LockWrite(const struct timespec& AR_TimeSpec)*/
|
|||
|
|
|||
|
int LockWrite(long AL_MiliSec)
|
|||
|
{
|
|||
|
timespec VO_TimeSpec;
|
|||
|
|
|||
|
VO_TimeSpec.tv_sec =time(NULL)+AL_MiliSec/1000;
|
|||
|
VO_TimeSpec.tv_nsec=(AL_MiliSec%1000)*1000*1000;
|
|||
|
|
|||
|
return ::pthread_rwlock_timedwrlock(&mo_pthread_rwlock_t, &VO_TimeSpec);
|
|||
|
}/*
|
|||
|
int LockWrite(long AL_MiliSec)*/
|
|||
|
|
|||
|
int TryLockWrite()
|
|||
|
{
|
|||
|
return ::pthread_rwlock_trywrlock(&mo_pthread_rwlock_t);
|
|||
|
}/*
|
|||
|
int TryLockWrite()*/
|
|||
|
|
|||
|
int UnLock()
|
|||
|
{
|
|||
|
return ::pthread_rwlock_unlock(&mo_pthread_rwlock_t);
|
|||
|
}/*
|
|||
|
int UnLock()*/
|
|||
|
|
|||
|
int Close()
|
|||
|
{
|
|||
|
return ::pthread_rwlock_destroy(&mo_pthread_rwlock_t);
|
|||
|
}/*
|
|||
|
int Close()*/
|
|||
|
|
|||
|
public:
|
|||
|
};/*
|
|||
|
class ZCLockRW_Base*/
|
|||
|
|
|||
|
|
|||
|
class ZCLockRW : public ZCLockRW_Base
|
|||
|
{
|
|||
|
protected:
|
|||
|
pthread_rwlockattr_t mo_pthread_rwlockattr_t;
|
|||
|
public :
|
|||
|
|
|||
|
int InitAttr()
|
|||
|
{
|
|||
|
return ::pthread_rwlockattr_init(&mo_pthread_rwlockattr_t);
|
|||
|
}/*
|
|||
|
int InitAttr()*/
|
|||
|
|
|||
|
int Init()
|
|||
|
{
|
|||
|
return ::pthread_rwlock_init(&mo_pthread_rwlock_t, &mo_pthread_rwlockattr_t);
|
|||
|
}/*
|
|||
|
int Init()*/
|
|||
|
|
|||
|
bool SetShared(int AI_PShared=PTHREAD_PROCESS_PRIVATE)
|
|||
|
{
|
|||
|
return ::pthread_rwlockattr_setpshared(&mo_pthread_rwlockattr_t, AI_PShared)==ZNsEnum::ZEThread_OK;
|
|||
|
}/*
|
|||
|
bool SetShared(int AI_PShared=PTHREAD_PROCESS_PRIVATE)*/
|
|||
|
|
|||
|
bool GetShared(int& ARRI_PShared)
|
|||
|
{
|
|||
|
return ::pthread_rwlockattr_getpshared(&mo_pthread_rwlockattr_t, &ARRI_PShared)==ZNsEnum::ZEThread_OK;
|
|||
|
}/*
|
|||
|
bool GetShared(int& ARRI_PShared)*/
|
|||
|
|
|||
|
|
|||
|
// <20>ǵ<EFBFBD><C7B5><EFBFBD>,<2C><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> lock <20><> <20>켱<EFBFBD><ECBCB1><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> <20>Լ<EFBFBD>, <20><><EFBFBD><EFBFBD> Posix ǥ<><C7A5><EFBFBD><EFBFBD> <20>ƴϴ<C6B4>.
|
|||
|
// <20><> <20>Լ<EFBFBD><D4BC><EFBFBD> <20>켱<EFBFBD><ECBCB1><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20>ʾҴٸ<D2B4> <20>⺻<EFBFBD><E2BABB><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> lock <20><>
|
|||
|
// <20>켱<EFBFBD><ECBCB1><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20>δ<EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ִ<EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD>. -- 2006-12-30 16:21:00
|
|||
|
|
|||
|
int GetKind(int& ARRI_Kind) const
|
|||
|
{
|
|||
|
return ::pthread_rwlockattr_getkind_np(&mo_pthread_rwlockattr_t, &ARRI_Kind);
|
|||
|
}/*
|
|||
|
int GetKind(int& ARRI_Kind) const*/
|
|||
|
|
|||
|
int SetKind(int AI_Kind=PTHREAD_RWLOCK_PREFER_READER_NP)
|
|||
|
{
|
|||
|
return ::pthread_rwlockattr_setkind_np(&mo_pthread_rwlockattr_t, AI_Kind);
|
|||
|
}/*
|
|||
|
int SetKind(int AI_Kind=PTHREAD_RWLOCK_PREFER_READER_NP)*/
|
|||
|
|
|||
|
|
|||
|
int CloseAttr()
|
|||
|
{
|
|||
|
return ::pthread_rwlockattr_destroy(&mo_pthread_rwlockattr_t);
|
|||
|
}/*
|
|||
|
int CloseAttr()*/
|
|||
|
|
|||
|
int Close()
|
|||
|
{
|
|||
|
return (ZCLockRW_Base::Close(), CloseAttr());
|
|||
|
}/*
|
|||
|
int Close()*/
|
|||
|
|
|||
|
public:
|
|||
|
};/*
|
|||
|
class ZCLockRW*/
|
|||
|
|
|||
|
|
|||
|
class ZCLockRW_Process
|
|||
|
{
|
|||
|
protected:
|
|||
|
ZCLockRW* mp_CLockRW ;
|
|||
|
ZCShareMemory mo_CShareMemory;
|
|||
|
public :
|
|||
|
|
|||
|
ZCLockRW_Process()
|
|||
|
{
|
|||
|
mp_CLockRW=0;
|
|||
|
}/*
|
|||
|
ZCLockRW_Process()*/
|
|||
|
|
|||
|
bool Make(long AL_MapKey)
|
|||
|
{
|
|||
|
if(mo_CShareMemory.ShmGet(AL_MapKey,sizeof(ZCLockRW))==false)
|
|||
|
{
|
|||
|
if(errno!=EEXIST || mo_CShareMemory.ShmGet(AL_MapKey)!=true)
|
|||
|
{
|
|||
|
return false;
|
|||
|
}
|
|||
|
if(mo_CShareMemory.LinkMap()==false)
|
|||
|
{
|
|||
|
mo_CShareMemory.Close(); return false;
|
|||
|
}/*
|
|||
|
if(mo_CShareMemory.LinkMap()==false)*/
|
|||
|
|
|||
|
mp_CLockRW=(ZCLockRW*)mo_CShareMemory.GetStartAddress();
|
|||
|
}
|
|||
|
else //!(mo_CShareMemory.ShmGet(AL_MapKey,sizeof(ZCLockRW))==false)
|
|||
|
{
|
|||
|
if(mo_CShareMemory.LinkMap()==false)
|
|||
|
{
|
|||
|
mo_CShareMemory.Close(); return false;
|
|||
|
}/*
|
|||
|
if(mo_CShareMemory.LinkMap()==false)*/
|
|||
|
|
|||
|
mp_CLockRW=(ZCLockRW*)mo_CShareMemory.GetStartAddress();
|
|||
|
|
|||
|
::memset(mp_CLockRW,0x00,sizeof(ZCLockRW));
|
|||
|
|
|||
|
mp_CLockRW->InitAttr();
|
|||
|
mp_CLockRW->SetShared(PTHREAD_PROCESS_SHARED);
|
|||
|
mp_CLockRW->Init();
|
|||
|
}/*
|
|||
|
else //!(mo_CShareMemory.ShmGet(AL_MapKey,sizeof(ZCLockRW))==false)*/
|
|||
|
|
|||
|
return true;
|
|||
|
}/*
|
|||
|
bool Make(long AL_MapKey)*/
|
|||
|
|
|||
|
bool Make(const char* AP_KeyName)
|
|||
|
{
|
|||
|
int Index =-1 ;
|
|||
|
long VL_KeyID = 10 ;
|
|||
|
|
|||
|
if(AP_KeyName!=0)
|
|||
|
{
|
|||
|
while(AP_KeyName[++Index]!=0)
|
|||
|
{
|
|||
|
VL_KeyID += AP_KeyName[Index]*(Index+1) ;
|
|||
|
}/*
|
|||
|
while(AP_KeyName[++Index]!=0)*/
|
|||
|
}/*
|
|||
|
if(AP_KeyName!=0)*/
|
|||
|
|
|||
|
return this->Make(VL_KeyID);
|
|||
|
}/*
|
|||
|
bool Make(const char* AP_KeyName)*/
|
|||
|
|
|||
|
int LockRead()
|
|||
|
{
|
|||
|
return mp_CLockRW->LockRead();
|
|||
|
}/*
|
|||
|
int LockRead()*/
|
|||
|
|
|||
|
int LockRead(const struct timespec& AR_TimeSpec)
|
|||
|
{
|
|||
|
return mp_CLockRW->LockRead(AR_TimeSpec);
|
|||
|
}/*
|
|||
|
int LockRead(const struct timespec& AR_TimeSpec)*/
|
|||
|
|
|||
|
int TryLockRead()
|
|||
|
{
|
|||
|
return mp_CLockRW->TryLockRead();
|
|||
|
}/*
|
|||
|
int TryLockRead()*/
|
|||
|
|
|||
|
int LockWrite()
|
|||
|
{
|
|||
|
return mp_CLockRW->LockWrite();
|
|||
|
}/*
|
|||
|
int LockRead()*/
|
|||
|
|
|||
|
int LockWrite(const struct timespec& AR_TimeSpec)
|
|||
|
{
|
|||
|
return mp_CLockRW->LockWrite(AR_TimeSpec);
|
|||
|
}/*
|
|||
|
int LockWrite(const struct timespec& AR_TimeSpec)*/
|
|||
|
|
|||
|
int TryLockWrite()
|
|||
|
{
|
|||
|
return mp_CLockRW->TryLockWrite();
|
|||
|
}/*
|
|||
|
int TryLockWrite()*/
|
|||
|
|
|||
|
int UnLock()
|
|||
|
{
|
|||
|
return mp_CLockRW->UnLock();
|
|||
|
}/*
|
|||
|
int UnLock()*/
|
|||
|
|
|||
|
int GetKind(int& ARRI_Kind) const
|
|||
|
{
|
|||
|
return mp_CLockRW->GetKind(RR(ARRI_Kind));
|
|||
|
}/*
|
|||
|
int GetKind(int& ARRI_Kind) const*/
|
|||
|
|
|||
|
int SetKind(int AI_Kind=PTHREAD_RWLOCK_PREFER_READER_NP)
|
|||
|
{
|
|||
|
return mp_CLockRW->SetKind(AI_Kind);
|
|||
|
}/*
|
|||
|
int SetKind(int AI_Kind=PTHREAD_RWLOCK_PREFER_READER_NP)*/
|
|||
|
|
|||
|
int Close()
|
|||
|
{
|
|||
|
int VI_Resutl=mp_CLockRW->Close();
|
|||
|
|
|||
|
mo_CShareMemory.UnMap();
|
|||
|
mo_CShareMemory.Close();
|
|||
|
|
|||
|
return VI_Resutl;
|
|||
|
}/*
|
|||
|
int Close()*/
|
|||
|
|
|||
|
public:
|
|||
|
};/*
|
|||
|
class ZCLockRW_Process*/
|
|||
|
|
|||
|
|
|||
|
#endif //__USE_XOPEN2K
|
|||
|
|
|||
|
|
|||
|
/*//////////////////////////////////////////////////////////////////////////////////
|
|||
|
|
|||
|
<EFBFBD><EFBFBD> class ZCProcessSemaphore <EFBFBD><EFBFBD> <EFBFBD><EFBFBD><EFBFBD>μ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <EFBFBD><EFBFBD><EFBFBD><EFBFBD> <EFBFBD><EFBFBD><EFBFBD><EFBFBD>ȭ object. <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <EFBFBD><EFBFBD><EFBFBD>μ<EFBFBD><EFBFBD><EFBFBD>
|
|||
|
<EFBFBD><EFBFBD><EFBFBD><EFBFBD>ȭ<EFBFBD><EFBFBD> Semaphore <EFBFBD><EFBFBD> <EFBFBD><EFBFBD> <EFBFBD><EFBFBD> <EFBFBD>ְ<EFBFBD>, Window <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <EFBFBD><EFBFBD><EFBFBD>μ<EFBFBD><EFBFBD><EFBFBD> <EFBFBD><EFBFBD><EFBFBD><EFBFBD>ȭ<EFBFBD><EFBFBD> Mutex <EFBFBD><EFBFBD> <EFBFBD><EFBFBD> <EFBFBD><EFBFBD>
|
|||
|
<EFBFBD>ִ<EFBFBD>. <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <EFBFBD><EFBFBD><EFBFBD>μ<EFBFBD><EFBFBD><EFBFBD> <EFBFBD><EFBFBD><EFBFBD><EFBFBD>ȭ<EFBFBD><EFBFBD> <EFBFBD><EFBFBD><EFBFBD>̴<EFBFBD> Semaphore <EFBFBD><EFBFBD> <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <EFBFBD><EFBFBD><EFBFBD><EFBFBD>ȭ<EFBFBD><EFBFBD> <EFBFBD><EFBFBD><EFBFBD>̴<EFBFBD>
|
|||
|
<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <EFBFBD>Լ<EFBFBD><EFBFBD><EFBFBD> <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <EFBFBD>ٸ<EFBFBD><EFBFBD><EFBFBD>.
|
|||
|
|
|||
|
<EFBFBD><EFBFBD> <EFBFBD>ý<EFBFBD><EFBFBD><EFBFBD> ȣ<EFBFBD><EFBFBD> : semget() (SYSTEM CALL:semget())
|
|||
|
|
|||
|
<EFBFBD><EFBFBD><EFBFBD>ο<EFBFBD> <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ų<EFBFBD> <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ϴ<EFBFBD> <EFBFBD><EFBFBD><EFBFBD>տ<EFBFBD> <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ϱ<EFBFBD> <EFBFBD><EFBFBD><EFBFBD>Ͽ<EFBFBD>, semget() <EFBFBD>ý<EFBFBD><EFBFBD><EFBFBD> ȣ<EFBFBD><EFBFBD>
|
|||
|
<EFBFBD><EFBFBD> <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ѵ<EFBFBD>.
|
|||
|
|
|||
|
SYSTEM CALL: semget();
|
|||
|
|
|||
|
PROTOTYPE: int semget ( key_t key, int nsems, int semflg );
|
|||
|
RETURNS: semaphore set IPC identifier on success
|
|||
|
-1 on error: errno = EACCESS (permission denied)
|
|||
|
EEXIST (set exists, cannot create (IPC_EXCL))
|
|||
|
EIDRM (set is marked for deletion)
|
|||
|
ENOENT (set does not exist, no IPC_CREAT was used)
|
|||
|
ENOMEM (Not enough memory to create new set)
|
|||
|
ENOSPC (Maximum set limit exceeded)
|
|||
|
<EFBFBD><EFBFBD> NOTES:
|
|||
|
|
|||
|
semget()<EFBFBD><EFBFBD> ù<EFBFBD><EFBFBD>° <EFBFBD>ƱԸ<EFBFBD>Ʈ<EFBFBD><EFBFBD> ftok()<EFBFBD><EFBFBD> ȣ<EFBFBD> <EFBFBD><EFBFBD><EFBFBD><EFBFBD> <EFBFBD><EFBFBD>ȯ<EFBFBD><EFBFBD> Ű<EFBFBD><EFBFBD><EFBFBD>̴<EFBFBD>.
|
|||
|
<EFBFBD><EFBFBD> Ű<EFBFBD><EFBFBD><EFBFBD><EFBFBD> Ŀ<EFBFBD>ξȿ<EFBFBD> <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ϴ<EFBFBD> <EFBFBD>ٸ<EFBFBD> <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> Ű<EFBFBD><EFBFBD><EFBFBD><EFBFBD> <EFBFBD>ȴ<EFBFBD>. <EFBFBD>̶<EFBFBD> <EFBFBD><EFBFBD><EFBFBD>ų<EFBFBD> <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ϴ<EFBFBD> <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> semflg <EFBFBD>ƱԸ<EFBFBD>Ʈ<EFBFBD><EFBFBD> <EFBFBD><EFBFBD><EFBFBD>뿡 <EFBFBD><EFBFBD><EFBFBD><EFBFBD> <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ȴ<EFBFBD>.
|
|||
|
|
|||
|
IPC_CREAT
|
|||
|
Ŀ<EFBFBD>ξȿ<EFBFBD> <EFBFBD>̹<EFBFBD> <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <EFBFBD>ʴ´ٸ<EFBFBD> <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>.
|
|||
|
IPC_EXCL
|
|||
|
IPC_CREAT<EFBFBD><EFBFBD> <EFBFBD><EFBFBD><EFBFBD><EFBFBD> <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ǿ<EFBFBD>, <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>۰<EFBFBD> <EFBFBD>̹<EFBFBD> <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ϸ<EFBFBD> <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ѵ<EFBFBD>.
|
|||
|
|
|||
|
IPC_CREAT<EFBFBD><EFBFBD> ȥ<EFBFBD><EFBFBD> <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ȴٸ<EFBFBD>, semget()<EFBFBD><EFBFBD> <EFBFBD><EFBFBD><EFBFBD><EFBFBD> <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <EFBFBD><EFBFBD><EFBFBD><EFBFBD> Ȯ<EFBFBD><EFBFBD><EFBFBD><EFBFBD>
|
|||
|
(the semaphore set identifier)<EFBFBD><EFBFBD> <EFBFBD><EFBFBD>ȯ<EFBFBD>ϰų<EFBFBD> <EFBFBD><EFBFBD><EFBFBD><EFBFBD> Ű<EFBFBD><EFBFBD><EFBFBD><EFBFBD> <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <EFBFBD>̹<EFBFBD> <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ϴ<EFBFBD>
|
|||
|
<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> Ȯ<EFBFBD><EFBFBD><EFBFBD>ڸ<EFBFBD> <EFBFBD><EFBFBD>ȯ<EFBFBD>Ѵ<EFBFBD>. IPC_EXCL<EFBFBD><EFBFBD> IPC_CREAT<EFBFBD><EFBFBD> <EFBFBD>Բ<EFBFBD> <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ٸ<EFBFBD>,
|
|||
|
<EFBFBD><EFBFBD> <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ų<EFBFBD> <EFBFBD>̹<EFBFBD> <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ѵٸ<EFBFBD> -1 <EFBFBD><EFBFBD><EFBFBD><EFBFBD> <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> ȣ<EFBFBD> <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ѵ<EFBFBD>.
|
|||
|
IPC_EXCL<EFBFBD><EFBFBD> <EFBFBD><EFBFBD> <EFBFBD><EFBFBD>ü<EFBFBD>δ<EFBFBD> <EFBFBD>ǹ̰<EFBFBD> <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>, IPC_CREAT<EFBFBD><EFBFBD> <EFBFBD><EFBFBD><EFBFBD>յǾ<EFBFBD> <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <EFBFBD><EFBFBD>
|
|||
|
<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ʴ<EFBFBD> <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>۸<EFBFBD> <EFBFBD><EFBFBD><EFBFBD><EFBFBD>(access)<EFBFBD>ϱ<EFBFBD> <EFBFBD><EFBFBD><EFBFBD><EFBFBD> <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <EFBFBD><EFBFBD><EFBFBD><EFBFBD> <EFBFBD><EFBFBD><EFBFBD><EFBFBD> <EFBFBD><EFBFBD>ġ<EFBFBD><EFBFBD> <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <EFBFBD><EFBFBD> <EFBFBD>ִ<EFBFBD>.
|
|||
|
<EFBFBD>ý<EFBFBD><EFBFBD><EFBFBD> V IPC<EFBFBD><EFBFBD> <EFBFBD>ٸ<EFBFBD> <EFBFBD><EFBFBD><EFBFBD>µ<EFBFBD>ó<EFBFBD><EFBFBD> <EFBFBD>ΰ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> 8<EFBFBD><EFBFBD> <EFBFBD><EFBFBD><EFBFBD>尡 <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <EFBFBD>㰡<EFBFBD><EFBFBD><EFBFBD><EFBFBD> <EFBFBD><EFBFBD><EFBFBD>¿<EFBFBD> <EFBFBD><EFBFBD><EFBFBD><EFBFBD>ũ<EFBFBD><EFBFBD> OR<EFBFBD><EFBFBD> <EFBFBD><EFBFBD> <EFBFBD>ִ<EFBFBD>.
|
|||
|
|
|||
|
nsems <EFBFBD>ƱԸ<EFBFBD>Ʈ<EFBFBD><EFBFBD> <EFBFBD><EFBFBD> <EFBFBD><EFBFBD><EFBFBD>վȿ<EFBFBD><EFBFBD><EFBFBD> <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <EFBFBD>ϴ<EFBFBD> <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ѵ<EFBFBD>.
|
|||
|
<EFBFBD>̰<EFBFBD><EFBFBD><EFBFBD> <EFBFBD>տ<EFBFBD><EFBFBD><EFBFBD> <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ߴ<EFBFBD> <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <EFBFBD>μ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <EFBFBD>ǹ<EFBFBD><EFBFBD>Ѵ<EFBFBD>.
|
|||
|
<EFBFBD><EFBFBD><EFBFBD>վ<EFBFBD><EFBFBD><EFBFBD> <EFBFBD>ִ<EFBFBD> <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> linux/sem.h<EFBFBD><EFBFBD> <EFBFBD><EFBFBD><EFBFBD><EFBFBD> <EFBFBD>Ǿ<EFBFBD><EFBFBD>ִ<EFBFBD>.
|
|||
|
|
|||
|
#define SEMMSL 32 // <=512 id<69><64> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20>ִ<EFBFBD> <20><><EFBFBD><EFBFBD>
|
|||
|
|
|||
|
<EFBFBD>̹<EFBFBD> <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ϴ<EFBFBD> <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <EFBFBD><EFBFBD>Ȯ<EFBFBD><EFBFBD> <EFBFBD><EFBFBD><EFBFBD><EFBFBD> <EFBFBD>ִٸ<EFBFBD>, nsems <EFBFBD>ƱԸ<EFBFBD>Ʈ<EFBFBD><EFBFBD> <EFBFBD><EFBFBD><EFBFBD>õʿ<EFBFBD> <EFBFBD>ָ<EFBFBD><EFBFBD>ض<EFBFBD>.
|
|||
|
<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <EFBFBD><EFBFBD><EFBFBD><EFBFBD> wrapper <EFBFBD>Լ<EFBFBD><EFBFBD><EFBFBD> <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <EFBFBD><EFBFBD><EFBFBD><EFBFBD>:
|
|||
|
|
|||
|
int open_semaphore_set( key_t keyval, int numsems )
|
|||
|
{
|
|||
|
int sid;
|
|||
|
|
|||
|
if ( ! numsems )
|
|||
|
return(-1);
|
|||
|
if((sid = semget( mykey, numsems, IPC_CREAT | 0660 )) == -1)
|
|||
|
return(-1);
|
|||
|
//endif
|
|||
|
|
|||
|
return(sid);
|
|||
|
}
|
|||
|
//int open_semaphore_set( key_t keyval, int numsems )
|
|||
|
|
|||
|
0600<EFBFBD><EFBFBD> <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <EFBFBD>㰡<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Կ<EFBFBD> <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ض<EFBFBD>.
|
|||
|
<EFBFBD><EFBFBD> <EFBFBD><EFBFBD><EFBFBD><EFBFBD> <EFBFBD>Լ<EFBFBD><EFBFBD><EFBFBD> <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <EFBFBD><EFBFBD><EFBFBD><EFBFBD> Ȯ<EFBFBD><EFBFBD><EFBFBD><EFBFBD>(int)<EFBFBD><EFBFBD> <EFBFBD><EFBFBD>ȯ<EFBFBD>ϰų<EFBFBD> <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> -1<EFBFBD><EFBFBD> <EFBFBD><EFBFBD>ȯ<EFBFBD>Ѵ<EFBFBD>.
|
|||
|
<EFBFBD><EFBFBD> <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ٸ<EFBFBD>, <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <EFBFBD>Ҵ<EFBFBD><EFBFBD>ϱ<EFBFBD> <EFBFBD><EFBFBD><EFBFBD><EFBFBD> <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> Ű<EFBFBD><EFBFBD><EFBFBD><EFBFBD> <EFBFBD>Ѱ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <EFBFBD>Ѵ<EFBFBD>.
|
|||
|
<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> ǥ<EFBFBD><EFBFBD><EFBFBD><EFBFBD> <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>, <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ϴ<EFBFBD><EFBFBD><EFBFBD> <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <EFBFBD>ʴ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
|
|||
|
<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ϱ<EFBFBD> <EFBFBD><EFBFBD><EFBFBD><EFBFBD> IPC_EXCL <EFBFBD>÷<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <EFBFBD><EFBFBD><EFBFBD>뿡 <EFBFBD>ָ<EFBFBD><EFBFBD>ض<EFBFBD>
|
|||
|
|
|||
|
<EFBFBD><EFBFBD> -- NOTES --
|
|||
|
|
|||
|
<EFBFBD><EFBFBD> int semctl ( int semid, int semnum, int cmd, union semun arg );
|
|||
|
|
|||
|
-1 on error: errno = EACCESS (permission denied)
|
|||
|
EFAULT(invalid address pointed to by arg argument)
|
|||
|
EIDRM (semaphore set was removed)
|
|||
|
EINVAL(set doesn't exist, or semid is invalid)
|
|||
|
EPERM (EUID has no privileges for cmd in arg)
|
|||
|
ERANGE(semaphore value out of range)
|
|||
|
|
|||
|
<EFBFBD><EFBFBD> semctl() <EFBFBD>Լ<EFBFBD><EFBFBD><EFBFBD> 3 <EFBFBD><EFBFBD>° <EFBFBD>μ<EFBFBD><EFBFBD><EFBFBD> <EFBFBD><EFBFBD><EFBFBD><EFBFBD> <EFBFBD><EFBFBD> <EFBFBD>ִ<EFBFBD> <EFBFBD><EFBFBD><EFBFBD><EFBFBD> <EFBFBD><EFBFBD>
|
|||
|
|
|||
|
IPC_STAT
|
|||
|
<EFBFBD><EFBFBD><EFBFBD>տ<EFBFBD> <EFBFBD><EFBFBD><EFBFBD><EFBFBD> semid_ds <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <EFBFBD><EFBFBD>ȸ<EFBFBD>ϰ<EFBFBD>,
|
|||
|
semun union<EFBFBD><EFBFBD><EFBFBD><EFBFBD> buf <EFBFBD>ƱԸ<EFBFBD>Ʈ<EFBFBD><EFBFBD> <EFBFBD>ּ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ѵ<EFBFBD>.
|
|||
|
|
|||
|
IPC_SET
|
|||
|
<EFBFBD><EFBFBD><EFBFBD>տ<EFBFBD> <EFBFBD><EFBFBD><EFBFBD><EFBFBD> semid_ds <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> ipc_perm <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <EFBFBD><EFBFBD><EFBFBD><EFBFBD> <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ѵ<EFBFBD>.
|
|||
|
semum union<EFBFBD><EFBFBD> buf <EFBFBD>ƱԸ<EFBFBD>Ʈ<EFBFBD><EFBFBD> <EFBFBD><EFBFBD><EFBFBD><EFBFBD> <EFBFBD><EFBFBD><EFBFBD><EFBFBD> <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>´<EFBFBD>.
|
|||
|
|
|||
|
IPC_RMID
|
|||
|
Ŀ<EFBFBD>η<EFBFBD> <EFBFBD><EFBFBD><EFBFBD><EFBFBD> <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ѵ<EFBFBD>.
|
|||
|
|
|||
|
GETALL
|
|||
|
<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <EFBFBD><EFBFBD><EFBFBD><EFBFBD> <EFBFBD><EFBFBD><EFBFBD><EFBFBD> <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <EFBFBD><EFBFBD><EFBFBD><EFBFBD> <EFBFBD><EFBFBD><EFBFBD>µ<EFBFBD> <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ȴ<EFBFBD>.
|
|||
|
<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> union<EFBFBD><EFBFBD> <EFBFBD>迭 <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <EFBFBD><EFBFBD><EFBFBD><EFBFBD> <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> unsigned short integer <EFBFBD>迭<EFBFBD><EFBFBD> <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ȴ<EFBFBD>.
|
|||
|
|
|||
|
GETCNT
|
|||
|
<EFBFBD>ڿ<EFBFBD><EFBFBD><EFBFBD> <EFBFBD><EFBFBD><EFBFBD><EFBFBD> <EFBFBD><EFBFBD><EFBFBD><EFBFBD> <EFBFBD><EFBFBD><EFBFBD>ٸ<EFBFBD><EFBFBD><EFBFBD> <EFBFBD>ִ<EFBFBD> <EFBFBD><EFBFBD><EFBFBD>μ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <EFBFBD><EFBFBD><EFBFBD><EFBFBD> <EFBFBD><EFBFBD>ȯ<EFBFBD>Ѵ<EFBFBD>.
|
|||
|
|
|||
|
GETPID
|
|||
|
<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> semop ȣ<EFBFBD><EFBFBD><EFBFBD><EFBFBD> <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <EFBFBD><EFBFBD><EFBFBD>μ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> PID<EFBFBD><EFBFBD> <EFBFBD><EFBFBD>ȯ<EFBFBD>Ѵ<EFBFBD>.
|
|||
|
|
|||
|
GETZCNT
|
|||
|
100% <EFBFBD>ڿ<EFBFBD> Ȱ<EFBFBD><EFBFBD><EFBFBD><EFBFBD> <EFBFBD><EFBFBD><EFBFBD><EFBFBD> <EFBFBD><EFBFBD><EFBFBD><EFBFBD> <EFBFBD><EFBFBD><EFBFBD>ٸ<EFBFBD><EFBFBD><EFBFBD> <EFBFBD>ִ<EFBFBD> <EFBFBD><EFBFBD><EFBFBD>μ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <EFBFBD><EFBFBD><EFBFBD><EFBFBD> <EFBFBD><EFBFBD>ȯ<EFBFBD>Ѵ<EFBFBD>.
|
|||
|
|
|||
|
SETALL
|
|||
|
<EFBFBD><EFBFBD><EFBFBD>վ<EFBFBD><EFBFBD><EFBFBD> <EFBFBD><EFBFBD><EFBFBD><EFBFBD> <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <EFBFBD><EFBFBD><EFBFBD><EFBFBD> union<EFBFBD><EFBFBD> <EFBFBD>迭 <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ȿ<EFBFBD> <EFBFBD><EFBFBD><EFBFBD>Ե<EFBFBD> <EFBFBD><EFBFBD>Ī<EFBFBD>Ǵ<EFBFBD> <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ѵ<EFBFBD>.
|
|||
|
|
|||
|
SETVAL
|
|||
|
<EFBFBD><EFBFBD><EFBFBD>վ<EFBFBD><EFBFBD><EFBFBD> <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <EFBFBD><EFBFBD><EFBFBD><EFBFBD> union<EFBFBD><EFBFBD> val <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ѵ<EFBFBD>.
|
|||
|
|
|||
|
<EFBFBD><EFBFBD> arg <EFBFBD>ƱԸ<EFBFBD>Ʈ<EFBFBD><EFBFBD> semun Ÿ<EFBFBD><EFBFBD><EFBFBD><EFBFBD> <EFBFBD><EFBFBD><EFBFBD><EFBFBD> <EFBFBD><EFBFBD>Ÿ<EFBFBD><EFBFBD><EFBFBD><EFBFBD>.
|
|||
|
<EFBFBD><EFBFBD> Ư<EFBFBD><EFBFBD><EFBFBD><EFBFBD> <EFBFBD><EFBFBD><EFBFBD><EFBFBD>ü(union)<EFBFBD><EFBFBD> linux/sem.h<EFBFBD><EFBFBD> <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <EFBFBD><EFBFBD><EFBFBD><EFBFBD> <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ǿ<EFBFBD><EFBFBD>ִ<EFBFBD>.
|
|||
|
|
|||
|
union semun
|
|||
|
{
|
|||
|
int val; // SETVAL<41><4C> <20><><EFBFBD><EFBFBD> <20><>
|
|||
|
struct semid_ds *buf; // IPC_STAT & IPC_SET<45><54> <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD>
|
|||
|
ushort *array; // GETALL & SETALL<4C><4C> <20><><EFBFBD><EFBFBD> <20>迭
|
|||
|
struct seminfo *__buf; // IPC_INFO<46><4F> <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD>
|
|||
|
void *__pad;
|
|||
|
};
|
|||
|
|
|||
|
val
|
|||
|
SETVAL <EFBFBD><EFBFBD><EFBFBD>ɾ <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <EFBFBD><EFBFBD> <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ȴ<EFBFBD>.<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ۿ<EFBFBD> <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <EFBFBD><EFBFBD><EFBFBD><EFBFBD> <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ѵ<EFBFBD>.
|
|||
|
|
|||
|
buf
|
|||
|
IPC_STAT/IPC_SET<EFBFBD><EFBFBD><EFBFBD><EFBFBD> <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ȴ<EFBFBD>.
|
|||
|
Ŀ<EFBFBD>ξȿ<EFBFBD><EFBFBD><EFBFBD> <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ǵ<EFBFBD> <EFBFBD><EFBFBD><EFBFBD><EFBFBD> <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <EFBFBD>ڷ<EFBFBD> <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <EFBFBD><EFBFBD><EFBFBD>纻<EFBFBD><EFBFBD> <EFBFBD><EFBFBD>Ÿ<EFBFBD><EFBFBD><EFBFBD><EFBFBD>.
|
|||
|
|
|||
|
array
|
|||
|
GETALL/SETALL <EFBFBD><EFBFBD><EFBFBD>ɾ<EFBFBD><EFBFBD> <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ǵ<EFBFBD> <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>.
|
|||
|
<EFBFBD><EFBFBD><EFBFBD>վȿ<EFBFBD><EFBFBD><EFBFBD> <EFBFBD><EFBFBD><EFBFBD><EFBFBD> <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <EFBFBD><EFBFBD>ȸ<EFBFBD>ϰų<EFBFBD> <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ϴµ<EFBFBD> <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ǵ<EFBFBD>
|
|||
|
<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <EFBFBD>迭<EFBFBD><EFBFBD> <EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ű<EFBFBD><EFBFBD> <EFBFBD>־<EFBFBD><EFBFBD><EFBFBD> <EFBFBD>Ѵ<EFBFBD>.
|
|||
|
<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ִ<EFBFBD> <EFBFBD>ƱԸ<EFBFBD>Ʈ<EFBFBD><EFBFBD> _buf<EFBFBD><EFBFBD> _pad<EFBFBD><EFBFBD> Ŀ<EFBFBD><EFBFBD> <EFBFBD><EFBFBD><EFBFBD><EFBFBD> <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <EFBFBD>ڵ峻<EFBFBD><EFBFBD><EFBFBD><EFBFBD>
|
|||
|
<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ǹ<EFBFBD> <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>α<EFBFBD> <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ڿ<EFBFBD><EFBFBD>Դ<EFBFBD> <EFBFBD><EFBFBD><EFBFBD><EFBFBD> <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <EFBFBD><EFBFBD><EFBFBD><EFBFBD>.
|
|||
|
<EFBFBD><EFBFBD><EFBFBD>ǻ<EFBFBD>, <EFBFBD>̷<EFBFBD> <EFBFBD>ΰ<EFBFBD><EFBFBD><EFBFBD> <EFBFBD>ƱԸ<EFBFBD>Ʈ<EFBFBD><EFBFBD> <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <EFBFBD>ü<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ǹ<EFBFBD>
|
|||
|
<EFBFBD>ٸ<EFBFBD> <EFBFBD><EFBFBD><EFBFBD>н<EFBFBD> <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> ã<EFBFBD><EFBFBD> <EFBFBD><EFBFBD> <EFBFBD><EFBFBD><EFBFBD><EFBFBD>.
|
|||
|
<EFBFBD>̷<EFBFBD> Ư<EFBFBD><EFBFBD><EFBFBD><EFBFBD> <EFBFBD>ý<EFBFBD><EFBFBD><EFBFBD> ȣ<EFBFBD><EFBFBD><EFBFBD><EFBFBD> <EFBFBD><EFBFBD><EFBFBD><EFBFBD> <EFBFBD>ý<EFBFBD><EFBFBD><EFBFBD> V IPC ȣ<EFBFBD><EFBFBD><EFBFBD><EFBFBD> <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ϴµ<EFBFBD>
|
|||
|
<EFBFBD><EFBFBD><EFBFBD><EFBFBD> <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <EFBFBD><EFBFBD><EFBFBD><EFBFBD> <EFBFBD><EFBFBD> <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ƿ<EFBFBD>,<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <EFBFBD>̷<EFBFBD><EFBFBD><EFBFBD> <EFBFBD>پ<EFBFBD><EFBFBD><EFBFBD> <EFBFBD><EFBFBD><EFBFBD><EFBFBD> <EFBFBD>˻<EFBFBD><EFBFBD><EFBFBD> <EFBFBD><EFBFBD><EFBFBD>̴<EFBFBD>.
|
|||
|
|
|||
|
<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <EFBFBD>ƱԸ<EFBFBD>Ʈ(union)<EFBFBD><EFBFBD> GETVAL <EFBFBD><EFBFBD><EFBFBD>ɾ <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <EFBFBD><EFBFBD> <EFBFBD><EFBFBD><EFBFBD>õȴ<EFBFBD>.
|
|||
|
|
|||
|
<EFBFBD><EFBFBD> Posix <EFBFBD><EFBFBD> Semaphore <EFBFBD><EFBFBD> unistd.h <EFBFBD><EFBFBD><EFBFBD><EFBFBD> <EFBFBD><EFBFBD><EFBFBD>Ͽ<EFBFBD> _POSIX_SEMAPHORES <EFBFBD>ɼ<EFBFBD><EFBFBD><EFBFBD>
|
|||
|
<EFBFBD><EFBFBD><EFBFBD>ǵǾ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <EFBFBD><EFBFBD> <EFBFBD>ִ<EFBFBD>.
|
|||
|
|
|||
|
-- POSIX(<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>) <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>带 <EFBFBD>̿<EFBFBD><EFBFBD><EFBFBD> <EFBFBD><EFBFBD><EFBFBD>α<EFBFBD><EFBFBD><EFBFBD> (2011-05-23 20:31:00)
|
|||
|
|
|||
|
//////////////////////////////////////////////////////////////////////////////////*/
|
|||
|
|
|||
|
|
|||
|
class ZCProcessSemaphore
|
|||
|
{
|
|||
|
private:
|
|||
|
ZTypeID mh_Semaphore;
|
|||
|
public :
|
|||
|
|
|||
|
ZCProcessSemaphore()
|
|||
|
{
|
|||
|
mh_Semaphore=0;
|
|||
|
}/*
|
|||
|
ZCProcessSemaphore()*/
|
|||
|
|
|||
|
// Linux <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20>迭<EFBFBD><E8BFAD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
|
|||
|
// <20><><EFBFBD><EFBFBD> <20><> <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> <20>ϳ<EFBFBD><CFB3><EFBFBD> <20>迭<EFBFBD><E8BFAD> <20><><EFBFBD><EFBFBD><EFBFBD>Ѵ<EFBFBD>.
|
|||
|
|
|||
|
bool Make(const char* AP_SemaName, long AL_InitialCnt, int AI_Flag=IPC_CREAT | IPC_EXCL | 0664)
|
|||
|
{
|
|||
|
return this->Make(ZNsMain::ZfGetKeyNum(AP_SemaName), AL_InitialCnt, AI_Flag);
|
|||
|
}/*
|
|||
|
bool Make(const char* AP_SemaName, long AL_InitialCnt, int AI_Flag=IPC_CREAT | IPC_EXCL | 0664)*/
|
|||
|
|
|||
|
bool Make(long AL_KeyID,int AL_InitialCnt,int AI_Flag=IPC_CREAT | IPC_EXCL | 0664)
|
|||
|
{
|
|||
|
if((mh_Semaphore=semget((key_t)AL_KeyID,1,AI_Flag))==-1)
|
|||
|
{
|
|||
|
if(errno==EEXIST)
|
|||
|
return (mh_Semaphore=semget((key_t)AL_KeyID,1,0))!=-1 ;
|
|||
|
return false;
|
|||
|
}/*
|
|||
|
if((mh_Semaphore=semget((key_t)AL_KeyID,1,AI_Flag))==-1)*/
|
|||
|
|
|||
|
union semun SemUnion; SemUnion.val=AL_InitialCnt;
|
|||
|
|
|||
|
return semctl(mh_Semaphore, 0, SETVAL,SemUnion) != -1 ;
|
|||
|
}/*
|
|||
|
bool Make(long AL_KeyID,int AL_InitialCnt,int AI_Flag=IPC_CREAT | IPC_EXCL | 0664)*/
|
|||
|
|
|||
|
|
|||
|
// <20>Ʒ<EFBFBD> <20>Լ<EFBFBD><D4BC><EFBFBD> <20><><EFBFBD>ؽ<EFBFBD>ó<EFBFBD><C3B3> <20><><EFBFBD><EFBFBD><EFBFBD>ϴµ<CFB4> <20><><EFBFBD><EFBFBD>.
|
|||
|
|
|||
|
bool Make(int AL_InitialCnt=1, int AI_Flag=IPC_CREAT | IPC_EXCL | 0664)
|
|||
|
{
|
|||
|
return Make(this->GetUniqueSemaKey(), AL_InitialCnt, AI_Flag);
|
|||
|
}/*
|
|||
|
bool Make(int AL_InitialCnt=1, int AI_Flag=IPC_CREAT | IPC_EXCL | 0664)*/
|
|||
|
|
|||
|
|
|||
|
// <20><><EFBFBD><EFBFBD>ȣ<EFBFBD><C8A3><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>.
|
|||
|
|
|||
|
bool MakeZero(int AI_Flag=IPC_CREAT | IPC_EXCL | 0664)
|
|||
|
{
|
|||
|
return Make(this->GetUniqueSemaKey(), 0, AI_Flag);
|
|||
|
}/*
|
|||
|
bool MakeZero(int AI_Flag=IPC_CREAT | IPC_EXCL | 0664)*/
|
|||
|
|
|||
|
|
|||
|
static long GetUniqueSemaKey()
|
|||
|
{
|
|||
|
static long SL_UniqueID=0 ;
|
|||
|
const long CL_AddID =100000;
|
|||
|
|
|||
|
return ( SL_UniqueID += CL_AddID ) + ::getpid() ;
|
|||
|
}/*
|
|||
|
static long GetUniqueSemaKey()*/
|
|||
|
|
|||
|
|
|||
|
bool MakeArr(long AL_KeyID, int AL_InitialCnt, int AI_SemaCnt, int AI_Flag=IPC_CREAT | IPC_EXCL | 0664)
|
|||
|
{
|
|||
|
if((mh_Semaphore=semget((key_t)AL_KeyID, AI_SemaCnt, AI_Flag))==-1)
|
|||
|
{
|
|||
|
if(errno==EEXIST)
|
|||
|
return (mh_Semaphore=semget((key_t)AL_KeyID, AI_SemaCnt,0))!=-1 ;
|
|||
|
|
|||
|
return false;
|
|||
|
}/*
|
|||
|
if((mh_Semaphore=semget((key_t)AL_KeyID, AI_SemaCnt, AI_Flag))==-1)*/
|
|||
|
|
|||
|
union semun SemUnion; SemUnion.val=AL_InitialCnt;
|
|||
|
|
|||
|
// <20>ʱ<EFBFBD>ȭ<EFBFBD><C8AD> SETALL <20>ɼ<EFBFBD><C9BC><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD>ص<EFBFBD> <20>Ǵµ<C7B4> SemUnion.array <20><> <20>迭<EFBFBD><E8BFAD> <20>Ҵ<EFBFBD><D2B4>ϰ<EFBFBD>
|
|||
|
// <20>ʱ<EFBFBD>ȭ<EFBFBD>ϰ<EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD>ϴ<EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD>ϸ<EFBFBD> <20>׳<EFBFBD> for <20><><EFBFBD><EFBFBD><EFBFBD>ε<EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><> <20><><EFBFBD><EFBFBD>.
|
|||
|
|
|||
|
__for0(ZTypInt, i, AI_SemaCnt)
|
|||
|
{
|
|||
|
if(semctl(mh_Semaphore, i, SETVAL,SemUnion) != -1 ) return false;
|
|||
|
}/*
|
|||
|
__for0(ZTypInt, i, AI_SemaCnt)*/
|
|||
|
|
|||
|
return true;
|
|||
|
}/*
|
|||
|
bool MakeArr(long AL_KeyID, int AL_InitialCnt, int AI_SemaCnt, int AI_Flag=IPC_CREAT | IPC_EXCL | 0664)*/
|
|||
|
|
|||
|
bool MakeArr(const char* AP_SemaName, int AL_InitialCnt, int AI_SemaCnt, int AI_Flag=IPC_CREAT | IPC_EXCL | 0664)
|
|||
|
{
|
|||
|
return MakeArr(ZNsMain::ZfGetKeyNum(AP_SemaName), AL_InitialCnt, AI_SemaCnt, AI_Flag);
|
|||
|
}/*
|
|||
|
bool MakeArr(const char* AP_SemaName, int AL_InitialCnt, int AI_SemaCnt, int AI_Flag=IPC_CREAT | IPC_EXCL | 0664)*/
|
|||
|
|
|||
|
|
|||
|
// bool MakeStd() <20><> class ZCProcessSemaphore <20><> Window, Linux <20><><EFBFBD>ʿ<EFBFBD><CABF><EFBFBD> ȣȯ<C8A3>ϱ<EFBFBD> <20><><EFBFBD><EFBFBD> <20><>,
|
|||
|
// <20>μ<EFBFBD> AI_MaxSemaCnt <20><> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20>ʰ<EFBFBD> <20>ִ<EFBFBD>.(Window <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20>ǹ̰<C7B9> <20>ִ<EFBFBD>.)
|
|||
|
|
|||
|
bool MakeStd(const char* AP_SemaName, int AL_InitialCnt, int AI_MaxSemaCnt, int AI_Flag=IPC_CREAT | IPC_EXCL | 0664)
|
|||
|
{
|
|||
|
return this->Make(ZNsMain::ZfGetKeyNum(AP_SemaName), AL_InitialCnt, AI_Flag);
|
|||
|
}/*
|
|||
|
bool MakeStd(const char* AP_SemaName, int AL_InitialCnt, int AI_MaxSemaCnt, int AI_Flag=IPC_CREAT | IPC_EXCL | 0664)*/
|
|||
|
|
|||
|
bool Open(const char* AP_SemaName)
|
|||
|
{
|
|||
|
return (mh_Semaphore=semget((key_t)(ZNsMain::ZfGetKeyNum(AP_SemaName)), 1, 0))>0 ;
|
|||
|
}/*
|
|||
|
bool Open(const char* AP_SemaName)*/
|
|||
|
|
|||
|
|
|||
|
// <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD>´<EFBFBD>.
|
|||
|
|
|||
|
int GetValue(int AI_SemaNum=0)
|
|||
|
{
|
|||
|
return semctl(mh_Semaphore, AI_SemaNum, GETVAL, 0/*union semun arg*/) ;
|
|||
|
}/*
|
|||
|
int GetValue(int AI_SemaNum=0)*/
|
|||
|
|
|||
|
bool GetValue(union semun& ARR_SemUnion)
|
|||
|
{
|
|||
|
return semctl(mh_Semaphore, 0/*ignored*/, GETALL, ARR_SemUnion) !=-1 ;
|
|||
|
}/*
|
|||
|
bool GetValue(union semun& ARR_SemUnion)*/
|
|||
|
|
|||
|
bool IsZeroCount()
|
|||
|
{
|
|||
|
return this->GetValue()==0;
|
|||
|
}/*
|
|||
|
bool IsZeroCount()*/
|
|||
|
|
|||
|
bool Lock(ZTypUInt AI_ReleaseCount=1)
|
|||
|
{
|
|||
|
return LockRaw(AI_ReleaseCount)!=-1;
|
|||
|
}/*
|
|||
|
bool Lock(ZTypUInt AI_ReleaseCount=1)*/
|
|||
|
|
|||
|
|
|||
|
// LockRaw() <20><> <20><><EFBFBD><EFBFBD><EFBFBD≯<EFBFBD> ZEThread_OK, <20>ð<EFBFBD> <20>ʰ<EFBFBD><CAB0><EFBFBD> ZEThread_TimeOut <20><> <20><>ȯ<EFBFBD>Ѵ<EFBFBD>.
|
|||
|
// <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> Posix <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EEBFA1><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD>.
|
|||
|
|
|||
|
int LockRaw(ZTypUInt AI_ReleaseCount=1)
|
|||
|
{
|
|||
|
// cf) Window <20><> ReleaseSemaphore(mh_Semaphore,lReleaseCount,lpPreviousCount) <20><><EFBFBD><EFBFBD>
|
|||
|
// <20>ι<EFBFBD>° <20>μ<EFBFBD><CEBC><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> AI_ReleaseCount <20><> <20>Ѵ<EFBFBD>.
|
|||
|
|
|||
|
struct sembuf sem_b;
|
|||
|
|
|||
|
sem_b.sem_num= 0 ;
|
|||
|
sem_b.sem_op =-AI_ReleaseCount;
|
|||
|
sem_b.sem_flg= SEM_UNDO ;
|
|||
|
|
|||
|
return semop(mh_Semaphore, &sem_b,1) ;
|
|||
|
}/*
|
|||
|
int LockRaw(ZTypUInt AI_ReleaseCount=1)*/
|
|||
|
|
|||
|
bool UnLock(ZTypUInt AI_ReleaseCount=1)
|
|||
|
{
|
|||
|
// cf) Window <20><> ReleaseSemaphore(mh_Semaphore,lReleaseCount,lpPreviousCount) <20><><EFBFBD><EFBFBD>
|
|||
|
// <20>ι<EFBFBD>° <20>μ<EFBFBD><CEBC><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> AI_ReleaseCount <20><> <20>Ѵ<EFBFBD>.
|
|||
|
|
|||
|
struct sembuf sem_b;
|
|||
|
|
|||
|
sem_b.sem_num=0;
|
|||
|
sem_b.sem_op =AI_ReleaseCount;
|
|||
|
sem_b.sem_flg=SEM_UNDO;
|
|||
|
|
|||
|
return semop(mh_Semaphore, &sem_b,1)!=-1 ;
|
|||
|
}/*
|
|||
|
bool UnLock(ZTypUInt AI_ReleaseCount=1)*/
|
|||
|
|
|||
|
bool Close()
|
|||
|
{
|
|||
|
union semun SemUnion; bool VB_IsOK =
|
|||
|
(semctl(mh_Semaphore, 0, IPC_RMID ,SemUnion)!=-1) ;
|
|||
|
|
|||
|
mh_Semaphore=0; return VB_IsOK;
|
|||
|
}/*
|
|||
|
bool Close()*/
|
|||
|
|
|||
|
public:
|
|||
|
};/*
|
|||
|
class ZCProcessSemaphore*/
|
|||
|
|
|||
|
|
|||
|
|
|||
|
///////////////////////////////////////////////
|
|||
|
|
|||
|
/////////// end class ZCProcessMutex ///////////
|
|||
|
|
|||
|
///////////////////////////////////////////////
|
|||
|
|
|||
|
|
|||
|
/*/////////////////////////////////////////////
|
|||
|
|
|||
|
#define SEM_FAILED 0
|
|||
|
#define SEM_VALUE_MAX 1147483648
|
|||
|
|
|||
|
int sem_init (sem_t * sem, int pshared, unsigned int value);
|
|||
|
int sem_destroy (sem_t * sem);
|
|||
|
sem_t *sem_open (const char *name, int oflag, ...);
|
|||
|
int sem_close (sem_t *sem);
|
|||
|
int sem_wait (sem_t * sem);
|
|||
|
int sem_trywait (sem_t * sem);
|
|||
|
int sem_timedwait (sem_t * sem, const struct timespec *abstime);
|
|||
|
int sem_post (sem_t * sem);
|
|||
|
int sem_getvalue(sem_t * sem, int *sval);
|
|||
|
|
|||
|
|
|||
|
cf)
|
|||
|
|
|||
|
#include <semaphore.h>
|
|||
|
|
|||
|
int sem_wait(sem_t *sem);
|
|||
|
int sem_trywait(sem_t *sem);
|
|||
|
|
|||
|
DESCRIPTION
|
|||
|
The sem_wait() function locks the semaphore referenced by sem
|
|||
|
by performing a semaphore lock operation on that semaphore.
|
|||
|
If the semaphore value is currently zero,
|
|||
|
then the calling thread will not return from the call to sem_wait()
|
|||
|
until it either locks the semaphore or the call is interrupted by a signal.
|
|||
|
The sem_trywait() function locks the semaphore referenced by sem
|
|||
|
only if the semaphore is currently not locked;
|
|||
|
that is, if the semaphore value is currently positive.
|
|||
|
Otherwise, it does not lock the semaphore.
|
|||
|
Upon successful return,
|
|||
|
the state of the semaphore is locked and remains locked
|
|||
|
until the sem_post() function is executed and returns successfully.
|
|||
|
|
|||
|
The sem_wait() function is interruptible by the delivery of a signal.
|
|||
|
|
|||
|
|
|||
|
|
|||
|
HMUG - Mac OS X / Darwin man pages
|
|||
|
Current Directory /man/2
|
|||
|
|
|||
|
--------------------------------------------------------------------------------
|
|||
|
|
|||
|
NAME
|
|||
|
|
|||
|
sem_open - initialize and open a named semaphore
|
|||
|
|
|||
|
SYNOPSIS
|
|||
|
|
|||
|
#include <semaphore.h>
|
|||
|
|
|||
|
sem_t* sem_open(const char *name, int flags)
|
|||
|
sem_t* sem_open(const char *name, int flags, mode_t mode, unsigned int value)
|
|||
|
|
|||
|
DESCRIPTION
|
|||
|
The named semaphore named name is initialized and opened as specified by
|
|||
|
the argument flags and a semaphore descriptor is returned to the calling
|
|||
|
process.
|
|||
|
|
|||
|
The flags specified are formed by or'ing the following values:
|
|||
|
|
|||
|
O_CREAT create the semaphore if it does not exist
|
|||
|
O_EXCL error if create and semaphore exists
|
|||
|
|
|||
|
If O_CREATE if specified, sem_open() requires an additional two argu-
|
|||
|
ments. mode specifies the permissions for the semaphore as described in
|
|||
|
chmod(2) and modified by the process' umask value (see umask(2)). The
|
|||
|
semaphore is created with an initial value, which must be less than or
|
|||
|
equal to SEM_VALUE_MAX.
|
|||
|
|
|||
|
If O_EXCL is specified and the semaphore exists, sem_open() fails. The
|
|||
|
check for the existence of the semaphore and the creation of the
|
|||
|
semaphore are atomic with respect to all processes calling sem_open()
|
|||
|
with O_CREAT and O_EXCL set.
|
|||
|
|
|||
|
When a new semaphore is created, it is given the user ID and group ID
|
|||
|
which coorespond to the effective user and group IDs of the calling pro-
|
|||
|
cess. There is no visible entry in the file system for the created object
|
|||
|
in this implementation.
|
|||
|
|
|||
|
The returned semaphore descriptor is available to the calling process un-
|
|||
|
til it is closed with sem_close(), or until the caller exits or execs.
|
|||
|
|
|||
|
If a process makes repeated calls to sem_open(), with the same name argu-
|
|||
|
ment, the same descriptor is returned for each successful call, unless
|
|||
|
sem_unlink() has been called on the semaphore in the interim.
|
|||
|
|
|||
|
If sem_open() fails for any reason, it will return a value of SEM_FAILED
|
|||
|
and sets errno. On success, it returns a semaphore descriptor.
|
|||
|
|
|||
|
|
|||
|
ERRORS
|
|||
|
|
|||
|
The named semaphore is opened unless:
|
|||
|
|
|||
|
[EACCES] The required permissions (for reading and/or writing) are
|
|||
|
denied for the given flags; or O_CREAT is specified, the
|
|||
|
object does not exist, and permission to create the
|
|||
|
semaphore is denied.
|
|||
|
|
|||
|
[EEXIST] O_CREAT and O_EXCL were specified and the semaphore exists.
|
|||
|
|
|||
|
[EINTR] The sem_open() operation was interrupted by a signal.
|
|||
|
|
|||
|
[EINVAL] The shm_open() operation is not supported; or O_CREAT is
|
|||
|
specified and value exceeds SEM_VALUE_MAX.
|
|||
|
|
|||
|
[EMFILE] The process has already reached its limit for semaphores or
|
|||
|
file descriptors in use.
|
|||
|
|
|||
|
[ENAMETOOLONG]
|
|||
|
name exceeded SEM_NAME_LEN characters.
|
|||
|
|
|||
|
[ENFILE] Too many semaphores or file descriptors are open on the
|
|||
|
system.
|
|||
|
|
|||
|
[ENOENT] O_CREAT is not set and the named semaphore does not exist.
|
|||
|
|
|||
|
[ENOSPC] O_CREAT is specified, the file does not exist, and there is
|
|||
|
insufficient space available to create the semaphore.
|
|||
|
|
|||
|
SEE ALSO
|
|||
|
semctl(2), semget(2), semop(2), sem_close(2), sem_post(2),
|
|||
|
sem_trywait(2), sem_unlink(2), sem_wait(2), umask(2)
|
|||
|
|
|||
|
HISTORY
|
|||
|
sem_open() is specified in the POSIX Realtime Extension
|
|||
|
(1003.1b-1993/1003.1i-1995).
|
|||
|
|
|||
|
Darwin Operating System June 8, 2000 2
|
|||
|
|
|||
|
/////////////////////////////////////////////*/
|
|||
|
|
|||
|
|
|||
|
/*//////////////////////////////////////////////////////////
|
|||
|
|
|||
|
<EFBFBD><EFBFBD> class ZCThreadSemaphore <EFBFBD><EFBFBD> <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> ȣȯ<EFBFBD>DZ<EFBFBD> <EFBFBD><EFBFBD><EFBFBD>ƴ<EFBFBD>.
|
|||
|
<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> ȣȯ<EFBFBD><EFBFBD> class ZCProcessSemaphore <EFBFBD><EFBFBD> <EFBFBD>ణ <EFBFBD><EFBFBD><EFBFBD><EFBFBD>.
|
|||
|
|
|||
|
<EFBFBD><EFBFBD> sem_t <EFBFBD><EFBFBD><EFBFBD><EFBFBD> 0 <EFBFBD><EFBFBD> <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <EFBFBD><EFBFBD> <EFBFBD><EFBFBD><EFBFBD><EFBFBD>.
|
|||
|
|
|||
|
//////////////////////////////////////////////////////////*/
|
|||
|
|
|||
|
class ZCThreadSemaphore
|
|||
|
{
|
|||
|
private:
|
|||
|
sem_t mh_Semaphore;
|
|||
|
public :
|
|||
|
|
|||
|
/*/////////////////////////////////////////////////////////////////////////////
|
|||
|
|
|||
|
<EFBFBD><EFBFBD> sem_init() <EFBFBD>Լ<EFBFBD><EFBFBD><EFBFBD> <EFBFBD≯<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <EFBFBD><EFBFBD><EFBFBD>鶧 <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ѵ<EFBFBD>. <EFBFBD≯<EFBFBD><EFBFBD>ִ<EFBFBD> <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
|
|||
|
<EFBFBD><EFBFBD><EFBFBD><EFBFBD> sem_open() <EFBFBD><EFBFBD> <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ؾ<EFBFBD> <EFBFBD>ϸ<EFBFBD>, <EFBFBD>ı<EFBFBD><EFBFBD><EFBFBD> <EFBFBD><EFBFBD><EFBFBD><EFBFBD> sem_close() <EFBFBD><EFBFBD> sem_unlink() <EFBFBD><EFBFBD>
|
|||
|
<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ؾ<EFBFBD> <EFBFBD>Ѵ<EFBFBD>. <EFBFBD><EFBFBD> Ŭ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <EFBFBD≯<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <EFBFBD>ٷ<EFBFBD><EFBFBD><EFBFBD>.
|
|||
|
|
|||
|
AI_Shared <EFBFBD><EFBFBD> 0 <EFBFBD><EFBFBD> <EFBFBD>ƴϸ<EFBFBD> <EFBFBD><EFBFBD><EFBFBD><EFBFBD> <EFBFBD><EFBFBD><EFBFBD>μ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <EFBFBD><EFBFBD> <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <EFBFBD><EFBFBD><EFBFBD><EFBFBD> Linux <EFBFBD><EFBFBD>
|
|||
|
sem_XXX <EFBFBD>迭<EFBFBD><EFBFBD> <EFBFBD>Լ<EFBFBD><EFBFBD><EFBFBD> <EFBFBD><EFBFBD> <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <EFBFBD>ʰ<EFBFBD> <EFBFBD>ִ<EFBFBD>.(2004.7.12)
|
|||
|
|
|||
|
<EFBFBD><EFBFBD> AI_InitValue==1 <EFBFBD>̶<EFBFBD><EFBFBD><EFBFBD> <EFBFBD><EFBFBD><EFBFBD>ؽ<EFBFBD>ó<EFBFBD><EFBFBD> <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ϸ<EFBFBD><EFBFBD><EFBFBD> <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>̴<EFBFBD>. 2007-09-30 14:32:00
|
|||
|
|
|||
|
/////////////////////////////////////////////////////////////////////////////*/
|
|||
|
|
|||
|
bool Make(int AI_InitValue=1,int AI_Shared=0)
|
|||
|
{
|
|||
|
return ::sem_init(&mh_Semaphore, AI_Shared, AI_InitValue) !=-1 ;
|
|||
|
}/*
|
|||
|
bool Make(int AI_InitValue=1,int AI_Shared=0);*/
|
|||
|
|
|||
|
bool MakeZero(int AI_Shared=0)
|
|||
|
{
|
|||
|
return ::sem_init(&mh_Semaphore,AI_Shared,0) !=-1 ;
|
|||
|
}/*
|
|||
|
bool MakeZero(int AI_Shared=0)*/
|
|||
|
|
|||
|
bool Lock()
|
|||
|
{
|
|||
|
return ::sem_wait(&mh_Semaphore)==0 ;
|
|||
|
}/*
|
|||
|
bool Lock()*/
|
|||
|
|
|||
|
int LockRaw()
|
|||
|
{
|
|||
|
return ::sem_wait(&mh_Semaphore);
|
|||
|
}/*
|
|||
|
int LockRaw()*/
|
|||
|
|
|||
|
#ifdef __USE_XOPEN2K
|
|||
|
|
|||
|
// cf) int sem_timedwait(sem_t *sem, const struct timespec *abs_timeout);
|
|||
|
|
|||
|
int LockRaw(const struct timespec& AR_TimeOut)
|
|||
|
{
|
|||
|
// timeout <20≯<EFBFBD> errno <20><> ZNsEnum::ZEThread_TimeOut
|
|||
|
|
|||
|
if(::sem_timedwait(&mh_Semaphore, &AR_TimeOut)!=ZNsEnum::ZEThread_OK)
|
|||
|
return errno;
|
|||
|
//endif
|
|||
|
|
|||
|
return ZNsEnum::ZEThread_OK;
|
|||
|
}/*
|
|||
|
int Lock(const struct timespec& AR_TimeOut)*/
|
|||
|
|
|||
|
int LockRaw(long AL_MiliSec)
|
|||
|
{
|
|||
|
timespec VO_TimeSpec;
|
|||
|
|
|||
|
VO_TimeSpec.tv_sec =time(NULL)+AL_MiliSec/1000;
|
|||
|
VO_TimeSpec.tv_nsec=(AL_MiliSec%1000)*1000*1000;
|
|||
|
|
|||
|
return ::sem_timedwait(&mh_Semaphore,&VO_TimeSpec);
|
|||
|
}/*
|
|||
|
LockRaw LockRaw(long AL_MiliSec)*/
|
|||
|
|
|||
|
int LockTime(long AL_MiliSec)
|
|||
|
{
|
|||
|
return LockRaw(AL_MiliSec);
|
|||
|
}/*
|
|||
|
int LockTime(long AL_MiliSec)*/
|
|||
|
|
|||
|
#endif //__USE_XOPEN2K
|
|||
|
|
|||
|
// sem_trywait() <20><> <20>̹<EFBFBD> lock <20><> <20>ɷ<EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> -1 <20><>
|
|||
|
// <20><>ȯ<EFBFBD>ϰ<EFBFBD>, errno <20><> EAGAIN <20><><EFBFBD><EFBFBD> <20><><EFBFBD>õȴ<C3B5>.
|
|||
|
|
|||
|
bool TryLock()
|
|||
|
{
|
|||
|
return ::sem_trywait(&mh_Semaphore)==0 ;
|
|||
|
}/*
|
|||
|
bool TryLock()*/
|
|||
|
|
|||
|
bool UnLock()
|
|||
|
{
|
|||
|
return ::sem_post(&mh_Semaphore)==0 ;
|
|||
|
}/*
|
|||
|
bool UnLock()*/
|
|||
|
|
|||
|
|
|||
|
// sem_destroy() <20>Լ<EFBFBD><D4BC><EFBFBD> <20≯<EFBFBD><CCB8><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD>ſ<EFBFBD><C5BF><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD>Ǵ<EFBFBD> <20>Լ<EFBFBD><D4BC><EFBFBD>.
|
|||
|
// <20≯<EFBFBD><CCB8>ִ<EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD>쿡 <20><> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD>ǵǾ<C7B5> <20><><EFBFBD><EFBFBD> <20>ʴ<EFBFBD>.
|
|||
|
|
|||
|
bool Close()
|
|||
|
{
|
|||
|
return (sem_destroy(&mh_Semaphore)==0);
|
|||
|
}/*
|
|||
|
bool Close()*/
|
|||
|
|
|||
|
int GetValue() const
|
|||
|
{
|
|||
|
int VI_Val=0; const bool CB_IsOK =
|
|||
|
(::sem_getvalue((sem_t*)&mh_Semaphore, &VI_Val)!=0);
|
|||
|
|
|||
|
if(CB_IsOK) return -1; return VI_Val;
|
|||
|
}/*
|
|||
|
int GetValue() const*/
|
|||
|
|
|||
|
public:
|
|||
|
};/*
|
|||
|
class ZCThreadSemaphore*/
|
|||
|
|
|||
|
|
|||
|
|
|||
|
// <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD>ؽ<EFBFBD><D8BD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD>ؼ<EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><> <20><><EFBFBD><EFBFBD>.
|
|||
|
|
|||
|
class ZCThreadMutex
|
|||
|
{
|
|||
|
private :
|
|||
|
|
|||
|
ZCThreadMutex(const ZCThreadMutex& rhs){}
|
|||
|
|
|||
|
ZCThreadMutex& operator=(const ZCThreadMutex& rhs)
|
|||
|
{
|
|||
|
return *this;
|
|||
|
}/*
|
|||
|
ZCThreadMutex& operator=(const ZCThreadMutex& rhs)*/
|
|||
|
|
|||
|
/*private :*/
|
|||
|
protected:
|
|||
|
pthread_mutex_t mo_Mutex;
|
|||
|
public :
|
|||
|
|
|||
|
ZCThreadMutex()
|
|||
|
{
|
|||
|
}/*
|
|||
|
ZCThreadMutex()*/
|
|||
|
|
|||
|
const pthread_mutex_t& GetMutexID() const
|
|||
|
{
|
|||
|
return mo_Mutex;
|
|||
|
}/*
|
|||
|
const pthread_mutex_t& GetMutexID() const*/
|
|||
|
|
|||
|
pthread_mutex_t& GetMutexID()
|
|||
|
{
|
|||
|
return mo_Mutex;
|
|||
|
}/*
|
|||
|
pthread_mutex_t& GetMutexID()*/
|
|||
|
|
|||
|
bool Make(const pthread_mutexattr_t* AP_MutexAttr=0)
|
|||
|
{
|
|||
|
return pthread_mutex_init(&mo_Mutex, AP_MutexAttr)==0 ;
|
|||
|
}/*
|
|||
|
bool Make(const pthread_mutexattr_t* AP_MutexAttr=0)*/
|
|||
|
|
|||
|
bool Lock()
|
|||
|
{
|
|||
|
return this->LockRaw()==0 ;
|
|||
|
}/*
|
|||
|
bool Lock()*/
|
|||
|
|
|||
|
int LockRaw()
|
|||
|
{
|
|||
|
return pthread_mutex_lock(&mo_Mutex) ;
|
|||
|
}/*
|
|||
|
int LockRaw()*/
|
|||
|
|
|||
|
#ifdef __USE_XOPEN2K
|
|||
|
|
|||
|
bool Lock(long AL_MiliSec)
|
|||
|
{
|
|||
|
return this->LockRaw(AL_MiliSec)==0 ;
|
|||
|
}/*
|
|||
|
bool Lock(long AL_MiliSec)*/
|
|||
|
|
|||
|
|
|||
|
// cf) 30 <20>ʰ<EFBFBD> LOCK
|
|||
|
//
|
|||
|
// struct timespec ts_timeout;
|
|||
|
// ts_timeout.tv_sec =time(NULL)+30;
|
|||
|
// ts_timeout.tv_nsec=0;
|
|||
|
|
|||
|
int LockRaw(const struct timespec& AR_TimeOut)
|
|||
|
{
|
|||
|
return pthread_mutex_timedlock(&mo_Mutex, &AR_TimeOut) ;
|
|||
|
}/*
|
|||
|
int LockRaw(const struct timespec& AR_TimeOut)*/
|
|||
|
|
|||
|
int LockRaw(long AL_MiliSec)
|
|||
|
{
|
|||
|
timespec VO_TimeSpec;
|
|||
|
|
|||
|
VO_TimeSpec.tv_sec = time(NULL)+AL_MiliSec/1000 ;
|
|||
|
VO_TimeSpec.tv_nsec= (AL_MiliSec%1000)*1000*1000 ;
|
|||
|
|
|||
|
return pthread_mutex_timedlock(&mo_Mutex, &VO_TimeSpec) ;
|
|||
|
}/*
|
|||
|
int LockRaw(long AL_MiliSec)*/
|
|||
|
|
|||
|
int LockTime(long AL_MiliSec)
|
|||
|
{
|
|||
|
return LockRaw(AL_MiliSec);
|
|||
|
}/*
|
|||
|
int LockTime(long AL_MiliSec)*/
|
|||
|
|
|||
|
#endif //__USE_XOPEN2K
|
|||
|
|
|||
|
int TryLock()
|
|||
|
{
|
|||
|
return pthread_mutex_trylock(&mo_Mutex);
|
|||
|
}/*
|
|||
|
int TryLock()*/
|
|||
|
|
|||
|
bool UnLock()
|
|||
|
{
|
|||
|
return pthread_mutex_unlock(&mo_Mutex)==0 ;
|
|||
|
}/*
|
|||
|
bool UnLock()*/
|
|||
|
|
|||
|
bool Close()
|
|||
|
{
|
|||
|
return pthread_mutex_destroy(&mo_Mutex)==0 ;
|
|||
|
}/*
|
|||
|
bool Close()*/
|
|||
|
|
|||
|
public:
|
|||
|
};/*
|
|||
|
class ZCThreadMutex*/
|
|||
|
|
|||
|
|
|||
|
class ZCThreadMutexAttr
|
|||
|
{
|
|||
|
private:
|
|||
|
|
|||
|
ZCThreadMutexAttr(const ZCThreadMutexAttr& rhs)
|
|||
|
{
|
|||
|
}/*
|
|||
|
ZCThreadMutexAttr(const ZCThreadMutexAttr& rhs)*/
|
|||
|
|
|||
|
ZCThreadMutexAttr& operator=(const ZCThreadMutexAttr& rhs)
|
|||
|
{
|
|||
|
return *this;
|
|||
|
}/*
|
|||
|
ZCThreadMutexAttr& operator=(const ZCThreadMutexAttr& rhs)*/
|
|||
|
|
|||
|
/*private :*/
|
|||
|
protected:
|
|||
|
|
|||
|
pthread_mutex_t mo_Mutex ;
|
|||
|
pthread_mutexattr_t mo_PThreadMutexAttr;
|
|||
|
|
|||
|
public :
|
|||
|
|
|||
|
ZCThreadMutexAttr()
|
|||
|
{
|
|||
|
}/*
|
|||
|
ZCThreadMutexAttr()*/
|
|||
|
|
|||
|
const pthread_mutex_t& GetMutexID() const
|
|||
|
{
|
|||
|
return mo_Mutex;
|
|||
|
}/*
|
|||
|
const pthread_mutex_t& GetMutexID() const*/
|
|||
|
|
|||
|
pthread_mutex_t& GetMutexID()
|
|||
|
{
|
|||
|
return mo_Mutex;
|
|||
|
}/*
|
|||
|
pthread_mutex_t& GetMutexID()*/
|
|||
|
|
|||
|
bool Make(int AI_ThreadType=PTHREAD_MUTEX_RECURSIVE)
|
|||
|
{
|
|||
|
// PTHREAD_MUTEX_RECURSIVE mutex <20><> <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD>忡<EFBFBD><E5BFA1> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><>ŭ <20><><EFBFBD><EFBFBD><EFBFBD>ؾ<EFBFBD><D8BE>Ѵ<EFBFBD>.
|
|||
|
// <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> Ŭ<><C5AC><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD>ڿ<EFBFBD><DABF><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD>ϰ<EFBFBD> <20>Ҹ<EFBFBD><D2B8>ڿ<EFBFBD><DABF><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD>ϱ <20><> <20><><EFBFBD><EFBFBD>.
|
|||
|
|
|||
|
if(pthread_mutexattr_init(&mo_PThreadMutexAttr)!=0)
|
|||
|
return false;
|
|||
|
if(pthread_mutexattr_settype(&mo_PThreadMutexAttr,AI_ThreadType)!=0)
|
|||
|
return false;
|
|||
|
if(pthread_mutexattr_setpshared(&mo_PThreadMutexAttr,PTHREAD_PROCESS_SHARED)!=0)
|
|||
|
return false;
|
|||
|
//endif
|
|||
|
|
|||
|
/*///////////////////////////////////////////////////////////////////////////////
|
|||
|
|
|||
|
if(pthread_mutexattr_setpshared(&mo_PThreadMutexAttr,PTHREAD_PROCESS_PRIVATE)!=0)
|
|||
|
return false;
|
|||
|
//endif
|
|||
|
|
|||
|
<EFBFBD><EFBFBD> <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ѵ<EFBFBD>, Mutex <EFBFBD><EFBFBD> <EFBFBD><EFBFBD><EFBFBD>μ<EFBFBD><EFBFBD><EFBFBD> <EFBFBD><EFBFBD><EFBFBD>̿<EFBFBD> <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ǰ<EFBFBD> <EFBFBD>ϰ<EFBFBD> <EFBFBD>ʹٸ<EFBFBD> PTHREAD_PROCESS_SHARED
|
|||
|
<EFBFBD><EFBFBD> <EFBFBD>⺻<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <EFBFBD>ϴ<EFBFBD> <EFBFBD><EFBFBD><EFBFBD><EFBFBD> <EFBFBD>´<EFBFBD>.
|
|||
|
|
|||
|
-- 2010-01-04 11:59:00
|
|||
|
|
|||
|
///////////////////////////////////////////////////////////////////////////////*/
|
|||
|
|
|||
|
return pthread_mutex_init(&mo_Mutex,(const pthread_mutexattr_t*)&mo_PThreadMutexAttr)==0 ;
|
|||
|
}/*
|
|||
|
bool Make(int AI_ThreadType=PTHREAD_MUTEX_RECURSIVE)*/
|
|||
|
|
|||
|
bool Make(const pthread_mutexattr_t* AP_MutexAttr)
|
|||
|
{
|
|||
|
return pthread_mutex_init(&mo_Mutex, AP_MutexAttr)==0 ;
|
|||
|
}/*
|
|||
|
bool Make(const pthread_mutexattr_t* AP_MutexAttr)*/
|
|||
|
|
|||
|
bool Lock()
|
|||
|
{
|
|||
|
return this->LockRaw()==0 ;
|
|||
|
}/*
|
|||
|
bool Lock()*/
|
|||
|
|
|||
|
#ifdef __USE_XOPEN2K
|
|||
|
|
|||
|
bool Lock(long AL_MiliSec)
|
|||
|
{
|
|||
|
return this->LockRaw(AL_MiliSec)==0 ;
|
|||
|
}/*
|
|||
|
bool Lock(long AL_MiliSec)*/
|
|||
|
|
|||
|
#endif //__USE_XOPEN2K
|
|||
|
|
|||
|
int LockRaw()
|
|||
|
{
|
|||
|
return pthread_mutex_lock(&mo_Mutex) ;
|
|||
|
}/*
|
|||
|
int LockRaw()*/
|
|||
|
|
|||
|
|
|||
|
// cf) 30 <20>ʰ<EFBFBD> LOCK
|
|||
|
//
|
|||
|
// struct timespec ts_timeout;
|
|||
|
// ts_timeout.tv_sec=time(NULL)+30;
|
|||
|
// ts_timeout.tv_nsec=0;
|
|||
|
|
|||
|
#ifdef __USE_XOPEN2K
|
|||
|
|
|||
|
int LockRaw(const struct timespec& AR_TimeOut)
|
|||
|
{
|
|||
|
return pthread_mutex_timedlock(&mo_Mutex, &AR_TimeOut) ;
|
|||
|
}/*
|
|||
|
int LockRaw(const struct timespec& AR_TimeOut)*/
|
|||
|
|
|||
|
int LockRaw(long AL_MiliSec)
|
|||
|
{
|
|||
|
timespec VO_TimeSpec;
|
|||
|
|
|||
|
VO_TimeSpec.tv_sec = time(NULL)+AL_MiliSec/1000 ;
|
|||
|
VO_TimeSpec.tv_nsec= (AL_MiliSec%1000)*1000*1000 ;
|
|||
|
|
|||
|
return pthread_mutex_timedlock(&mo_Mutex, &VO_TimeSpec) ;
|
|||
|
}/*
|
|||
|
int LockRaw(long AL_MiliSec)*/
|
|||
|
|
|||
|
#endif //__USE_XOPEN2K
|
|||
|
|
|||
|
int TryLock()
|
|||
|
{
|
|||
|
return pthread_mutex_trylock(&mo_Mutex);
|
|||
|
}/*
|
|||
|
int TryLock()*/
|
|||
|
|
|||
|
bool UnLock()
|
|||
|
{
|
|||
|
return pthread_mutex_unlock(&mo_Mutex)==0 ;
|
|||
|
}/*
|
|||
|
bool UnLock()*/
|
|||
|
|
|||
|
bool Close()
|
|||
|
{
|
|||
|
return pthread_mutexattr_destroy(&mo_PThreadMutexAttr)==0 &&
|
|||
|
pthread_mutex_destroy (&mo_Mutex) ==0 ;
|
|||
|
///////
|
|||
|
}/*
|
|||
|
bool Close()*/
|
|||
|
|
|||
|
public:
|
|||
|
};/*
|
|||
|
class ZCThreadMutexAttr*/
|
|||
|
|
|||
|
|
|||
|
typedef ZCThreadMutexAttr ZCThreadMutexStd;
|
|||
|
|
|||
|
|
|||
|
class ZCThreadMutexEasy : protected ZCThreadMutex
|
|||
|
{
|
|||
|
public:
|
|||
|
|
|||
|
ZCThreadMutexEasy()
|
|||
|
{
|
|||
|
if(this->ZCThreadMutex::Make()==false)
|
|||
|
{
|
|||
|
std::fstream fileout("DEBUG.txt",std::ios::out | std::ios::app);
|
|||
|
fileout<<std::endl<<"File : "<<__FILE__<<std::endl<<"Line : "<<__LINE__<<std::endl;
|
|||
|
fileout<<"Error !! ZCThreadMutexEasy() Fail To Mutex"<<std::endl;
|
|||
|
fileout.close();
|
|||
|
exit(1);
|
|||
|
}/*
|
|||
|
if(this->ZCThreadMutex::Make()==false)*/
|
|||
|
}/*
|
|||
|
ZCThreadMutexEasy()*/
|
|||
|
|
|||
|
|
|||
|
/*///////////////////////////////////////////////////////////////////////////////////////////////////////////
|
|||
|
|
|||
|
<EFBFBD><EFBFBD> <EFBFBD>Ʒ<EFBFBD> <EFBFBD><EFBFBD><EFBFBD><EFBFBD>
|
|||
|
|
|||
|
ZCThreadMutexEasy(const ZCThreadMutexEasy& rhs) : ZCThreadMutex()
|
|||
|
|
|||
|
<EFBFBD><EFBFBD><EFBFBD><EFBFBD> ZCThreadMutex() <EFBFBD><EFBFBD> <EFBFBD><EFBFBD><EFBFBD><EFBFBD> g++ 4.4.6 <EFBFBD><EFBFBD><EFBFBD><EFBFBD> -W <EFBFBD>ɼ<EFBFBD><EFBFBD><EFBFBD> <EFBFBD>ָ<EFBFBD>, <EFBFBD>Ʒ<EFBFBD> <EFBFBD><EFBFBD><EFBFBD><EFBFBD> <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <EFBFBD><EFBFBD> <EFBFBD><EFBFBD> <EFBFBD>ִ<EFBFBD>.
|
|||
|
|
|||
|
warning: base class 'class std::ZCThreadMutex' should be explicitly initialized in the copy constructor
|
|||
|
|
|||
|
<EFBFBD><EFBFBD> <EFBFBD><EFBFBD><EFBFBD><EFBFBD> <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <EFBFBD>ո<EFBFBD><EFBFBD><EFBFBD><EFBFBD>̶<EFBFBD><EFBFBD><EFBFBD> <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ǵ<EFBFBD> <EFBFBD><EFBFBD><EFBFBD><EFBFBD>, <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ϸ<EFBFBD><EFBFBD><EFBFBD> <EFBFBD><EFBFBD><EFBFBD><EFBFBD> Ŭ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <EFBFBD><EFBFBD><EFBFBD><EFBFBD> <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> ZCThreadMutex(rhs) <EFBFBD><EFBFBD> ȣ<EFBFBD><EFBFBD>
|
|||
|
<EFBFBD><EFBFBD> <EFBFBD><EFBFBD><EFBFBD>̶<EFBFBD><EFBFBD><EFBFBD> <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>߱<EFBFBD> <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <EFBFBD><EFBFBD><EFBFBD>̴<EFBFBD>.
|
|||
|
|
|||
|
-- 2013-05-05 06:49:00
|
|||
|
|
|||
|
///////////////////////////////////////////////////////////////////////////////////////////////////////////*/
|
|||
|
|
|||
|
ZCThreadMutexEasy(const ZCThreadMutexEasy& rhs) : ZCThreadMutex()
|
|||
|
{
|
|||
|
if(this->ZCThreadMutex::Make()==false)
|
|||
|
{
|
|||
|
std::fstream fileout("DEBUG.txt",std::ios::out | std::ios::app);
|
|||
|
fileout<<std::endl<<"File : "<<__FILE__<<std::endl<<"Line : "<<__LINE__<<std::endl;
|
|||
|
fileout<<"Error !! ZCThreadMutexEasy(const ZCThreadMutexEasy&) Fail To Mutex"<<std::endl;
|
|||
|
fileout.close();
|
|||
|
::exit(1);
|
|||
|
}/*
|
|||
|
if(this->ZCThreadMutex::Make()==false)*/
|
|||
|
}/*
|
|||
|
ZCThreadMutexEasy(const ZCThreadMutexEasy& rhs)*/
|
|||
|
|
|||
|
~ZCThreadMutexEasy()
|
|||
|
{
|
|||
|
if(this->ZCThreadMutex::Close()==false)
|
|||
|
{
|
|||
|
std::fstream fileout("DEBUG.txt",std::ios::out | std::ios::app);
|
|||
|
fileout<<std::endl<<"File : "<<__FILE__<<std::endl<<"Line : "<<__LINE__<<std::endl;
|
|||
|
fileout<<"Error !! ~ZCThreadMutexEasy() Fail To Close Mutex"<<std::endl;
|
|||
|
fileout.close();
|
|||
|
::exit(1);
|
|||
|
}/*
|
|||
|
if(this->ZCThreadMutex::Close()==false)*/
|
|||
|
}/*
|
|||
|
~ZCThreadMutexEasy()*/
|
|||
|
|
|||
|
|
|||
|
using ZCThreadMutex::Lock ;
|
|||
|
using ZCThreadMutex::UnLock;
|
|||
|
|
|||
|
public:
|
|||
|
};/*
|
|||
|
class ZCThreadMutexEasy*/
|
|||
|
|
|||
|
|
|||
|
class ZCThreadMutexAttrEasy : protected ZCThreadMutexAttr
|
|||
|
{
|
|||
|
public:
|
|||
|
|
|||
|
ZCThreadMutexAttrEasy()
|
|||
|
{
|
|||
|
if(this->ZCThreadMutexAttr::Make()==false)
|
|||
|
{
|
|||
|
std::fstream fileout("DEBUG.txt",std::ios::out | std::ios::app);
|
|||
|
fileout<<std::endl<<"File : "<<__FILE__<<std::endl<<"Line : "<<__LINE__<<std::endl;
|
|||
|
fileout<<"Error !! ZCThreadMutexAttrEasy() Fail To Mutex"<<std::endl;
|
|||
|
fileout.close();
|
|||
|
exit(1);
|
|||
|
}/*
|
|||
|
if(this->ZCThreadMutexAttr::Make()==false)*/
|
|||
|
}/*
|
|||
|
ZCThreadMutexAttrEasy()*/
|
|||
|
|
|||
|
|
|||
|
/*///////////////////////////////////////////////////////////////////////////////////////////////////////////
|
|||
|
|
|||
|
<EFBFBD><EFBFBD> <EFBFBD>Ʒ<EFBFBD> <EFBFBD><EFBFBD><EFBFBD><EFBFBD>
|
|||
|
|
|||
|
ZCThreadMutexAttrEasy(const ZCThreadMutexAttrEasy&) : ZCThreadMutexAttr()
|
|||
|
|
|||
|
<EFBFBD><EFBFBD><EFBFBD><EFBFBD> ZCThreadMutex() <EFBFBD><EFBFBD> <EFBFBD><EFBFBD><EFBFBD><EFBFBD> g++ 4.4.6 <EFBFBD><EFBFBD><EFBFBD><EFBFBD> -W <EFBFBD>ɼ<EFBFBD><EFBFBD><EFBFBD> <EFBFBD>ָ<EFBFBD>, <EFBFBD>Ʒ<EFBFBD> <EFBFBD><EFBFBD><EFBFBD><EFBFBD> <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <EFBFBD><EFBFBD> <EFBFBD><EFBFBD> <EFBFBD>ִ<EFBFBD>.
|
|||
|
|
|||
|
warning: base class 'class std::ZCThreadMutexAttr' should be explicitly initialized in the copy constructor
|
|||
|
|
|||
|
<EFBFBD><EFBFBD> <EFBFBD><EFBFBD><EFBFBD><EFBFBD> <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <EFBFBD>ո<EFBFBD><EFBFBD><EFBFBD><EFBFBD>̶<EFBFBD><EFBFBD><EFBFBD> <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ǵ<EFBFBD> <EFBFBD><EFBFBD><EFBFBD><EFBFBD>, <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ϸ<EFBFBD><EFBFBD><EFBFBD> <EFBFBD><EFBFBD><EFBFBD><EFBFBD> Ŭ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <EFBFBD><EFBFBD><EFBFBD><EFBFBD> <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> ZCThreadMutexAttr(rhs) <EFBFBD><EFBFBD>
|
|||
|
ȣ<EFBFBD><EFBFBD><EFBFBD><EFBFBD> <EFBFBD><EFBFBD><EFBFBD>̶<EFBFBD><EFBFBD><EFBFBD> <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>߱<EFBFBD> <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <EFBFBD><EFBFBD><EFBFBD>̴<EFBFBD>.
|
|||
|
|
|||
|
-- 2013-05-05 06:49:00
|
|||
|
|
|||
|
///////////////////////////////////////////////////////////////////////////////////////////////////////////*/
|
|||
|
|
|||
|
ZCThreadMutexAttrEasy(const ZCThreadMutexAttrEasy&) : ZCThreadMutexAttr()
|
|||
|
{
|
|||
|
if(this->ZCThreadMutexAttr::Make()==false)
|
|||
|
{
|
|||
|
std::fstream fileout("DEBUG.txt",std::ios::out | std::ios::app);
|
|||
|
fileout<<std::endl<<"File : "<<__FILE__<<std::endl<<"Line : "<<__LINE__<<std::endl;
|
|||
|
fileout<<"Error !! ZCThreadMutexAttrEasy(const ZCThreadMutexAttrEasy&) Fail To Mutex"<<std::endl;
|
|||
|
fileout.close();
|
|||
|
exit(1);
|
|||
|
}/*
|
|||
|
if(this->ZCThreadMutexAttr::Make()==false)*/
|
|||
|
}/*
|
|||
|
ZCThreadMutexAttrEasy(const ZCThreadMutexAttrEasy&)*/
|
|||
|
|
|||
|
~ZCThreadMutexAttrEasy()
|
|||
|
{
|
|||
|
if(this->ZCThreadMutexAttr::Close()==false)
|
|||
|
{
|
|||
|
std::fstream fileout("DEBUG.txt",std::ios::out | std::ios::app);
|
|||
|
fileout<<std::endl<<"File : "<<__FILE__<<std::endl<<"Line : "<<__LINE__<<std::endl;
|
|||
|
fileout<<"Error !! ~ZCThreadMutexAttrEasy() Fail To Close Mutex"<<std::endl;
|
|||
|
fileout.close();
|
|||
|
exit(1);
|
|||
|
}/*
|
|||
|
if(this->ZCThreadMutexAttr::Close()==false)*/
|
|||
|
}/*
|
|||
|
~ZCThreadMutexAttrEasy()*/
|
|||
|
|
|||
|
|
|||
|
using ZCThreadMutexAttr::Lock ;
|
|||
|
using ZCThreadMutexAttr::UnLock;
|
|||
|
|
|||
|
public:
|
|||
|
};/*
|
|||
|
class ZCThreadMutexAttrEasy*/
|
|||
|
|
|||
|
|
|||
|
/*/////////////////////////////////////////////////////////
|
|||
|
|
|||
|
<EFBFBD><EFBFBD> <EFBFBD>Ʒ<EFBFBD> <EFBFBD>⺻ <EFBFBD><EFBFBD><EFBFBD>ؽ<EFBFBD> ZCThreadMutexEasy <EFBFBD><EFBFBD> <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
|
|||
|
<EFBFBD><EFBFBD> <EFBFBD><EFBFBD><EFBFBD>(<EFBFBD><EFBFBD>Ʈ<EFBFBD><EFBFBD> <EFBFBD><EFBFBD><EFBFBD><EFBFBD> dead lock <EFBFBD><EFBFBD> <EFBFBD><EFBFBD><EFBFBD>Ѵ<EFBFBD>) <EFBFBD>ټ<EFBFBD> <EFBFBD><EFBFBD>
|
|||
|
<EFBFBD><EFBFBD><EFBFBD>ϴ<EFBFBD>.(Window Mutex <EFBFBD><EFBFBD> <EFBFBD><EFBFBD><EFBFBD>ؼ<EFBFBD>)
|
|||
|
|
|||
|
typedef ZCThreadMutexEasy ZCDefLockEasy;
|
|||
|
|
|||
|
<EFBFBD><EFBFBD><EFBFBD><EFBFBD> <EFBFBD>Ʒ<EFBFBD> <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <EFBFBD>ٲ۴<EFBFBD>. -- 2009-07-28 16:27:00
|
|||
|
|
|||
|
<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> Mutex <EFBFBD><EFBFBD> <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ϴ<EFBFBD> <EFBFBD><EFBFBD>Ȳ<EFBFBD><EFBFBD> <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <EFBFBD><EFBFBD><EFBFBD>ƾ<EFBFBD> <EFBFBD>Ѵ<EFBFBD>.
|
|||
|
|
|||
|
-- 2013-07-22 12:28:00
|
|||
|
|
|||
|
<EFBFBD><EFBFBD> freebsd 8.2 <EFBFBD><EFBFBD><EFBFBD><EFBFBD> <EFBFBD><EFBFBD>Ʈ<EFBFBD><EFBFBD> <EFBFBD><EFBFBD>, <EFBFBD>ڲ<EFBFBD>
|
|||
|
|
|||
|
pthread_mutexattr_setpshared(
|
|||
|
&mo_PThreadMutexAttr,PTHREAD_PROCESS_SHARED
|
|||
|
)!=0
|
|||
|
|
|||
|
<EFBFBD><EFBFBD> <EFBFBD>Ǵ<EFBFBD> <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <EFBFBD>־, ZCThreadMutexEasy <EFBFBD><EFBFBD> <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <EFBFBD><EFBFBD> <EFBFBD><EFBFBD>
|
|||
|
<EFBFBD><EFBFBD><EFBFBD><EFBFBD>. <EFBFBD><EFBFBD><EFBFBD><EFBFBD> __MUTEX_EASY_DEFAULT_LOCK__ <EFBFBD><EFBFBD> <EFBFBD><EFBFBD><EFBFBD>ǵǾ<EFBFBD> <EFBFBD><EFBFBD>
|
|||
|
<EFBFBD><EFBFBD><EFBFBD><EFBFBD>,
|
|||
|
|
|||
|
typedef ZCThreadMutexEasy ZCDefLockEasy;
|
|||
|
|
|||
|
<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ϰ<EFBFBD> <EFBFBD>Ѵ<EFBFBD>. -- 2011-05-19 22:00:00
|
|||
|
|
|||
|
<EFBFBD>⺻<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> ZCThreadMutexEasy <EFBFBD><EFBFBD> <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ϰ<EFBFBD> ZCThreadMutexAttrEasy
|
|||
|
<EFBFBD><EFBFBD> __MUTEX_ATTR_EASY_DEFAULT_LOCK__ <EFBFBD><EFBFBD> <EFBFBD><EFBFBD><EFBFBD>ǵǾ<EFBFBD> <EFBFBD><EFBFBD><EFBFBD><EFBFBD> <EFBFBD><EFBFBD>,
|
|||
|
<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ϴ<EFBFBD> <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <EFBFBD>Ѵ<EFBFBD>. -- 2015-09-02 21:05:00
|
|||
|
|
|||
|
/////////////////////////////////////////////////////////*/
|
|||
|
|
|||
|
#ifdef __MUTEX_ATTR_EASY_DEFAULT_LOCK__
|
|||
|
typedef ZCThreadMutexAttrEasy ZCDefLockEasy;
|
|||
|
#else
|
|||
|
typedef ZCThreadMutexEasy ZCDefLockEasy;
|
|||
|
#endif
|
|||
|
|
|||
|
|
|||
|
#ifdef __USE_XOPEN2K
|
|||
|
|
|||
|
/*///////////////////////////////////////////////////////////////////////
|
|||
|
|
|||
|
<EFBFBD><EFBFBD> spin lock <EFBFBD><EFBFBD> ª<EFBFBD><EFBFBD> <EFBFBD>ð<EFBFBD> <EFBFBD><EFBFBD><EFBFBD><EFBFBD>ȭ<EFBFBD><EFBFBD><EFBFBD><EFBFBD> <EFBFBD><EFBFBD><EFBFBD><EFBFBD> <EFBFBD><EFBFBD><EFBFBD><EFBFBD>. <EFBFBD><EFBFBD><EFBFBD><EFBFBD> <EFBFBD>Ϲ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <EFBFBD><EFBFBD><EFBFBD><EFBFBD>ȭ
|
|||
|
<EFBFBD><EFBFBD> <EFBFBD><EFBFBD><EFBFBD>ؽ<EFBFBD><EFBFBD><EFBFBD> <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>. spin lock <EFBFBD><EFBFBD> context switching <EFBFBD><EFBFBD> <EFBFBD>δ<EFBFBD><EFBFBD><EFBFBD> <EFBFBD>Ǿ
|
|||
|
<EFBFBD><EFBFBD>ĩ <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ӵ<EFBFBD><EFBFBD><EFBFBD> <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <EFBFBD><EFBFBD> <EFBFBD>ִ<EFBFBD>. <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <EFBFBD><EFBFBD> <EFBFBD>ʾ<EFBFBD> <EFBFBD>ɷ<EFBFBD><EFBFBD><EFBFBD> <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ϴ<EFBFBD> <EFBFBD><EFBFBD><EFBFBD><EFBFBD>
|
|||
|
<EFBFBD><EFBFBD> <EFBFBD><EFBFBD><EFBFBD>Ѵ<EFBFBD>.
|
|||
|
|
|||
|
<EFBFBD><EFBFBD> <EFBFBD><EFBFBD><EFBFBD>ؽ<EFBFBD><EFBFBD><EFBFBD> <EFBFBD>ƴ<EFBFBD> spin lock <EFBFBD><EFBFBD><EFBFBD><EFBFBD> <EFBFBD><EFBFBD><EFBFBD><EFBFBD>ȭ<EFBFBD><EFBFBD> <EFBFBD>ϴ<EFBFBD> <EFBFBD><EFBFBD><EFBFBD>쿡<EFBFBD><EFBFBD> <EFBFBD><EFBFBD><EFBFBD><EFBFBD>ȭ <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <EFBFBD><EFBFBD><EFBFBD><EFBFBD>
|
|||
|
ª<EFBFBD><EFBFBD> <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ð<EFBFBD><EFBFBD><EFBFBD> <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <EFBFBD>Ѵ<EFBFBD>. <EFBFBD><EFBFBD><EFBFBD><EFBFBD>ȭ <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <EFBFBD>ֿܼ<EFBFBD> <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ϴ<EFBFBD> <EFBFBD><EFBFBD><EFBFBD><EFBFBD> '<EFBFBD><EFBFBD>
|
|||
|
ó<EFBFBD><EFBFBD>'<EFBFBD><EFBFBD> <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <EFBFBD><EFBFBD><EFBFBD><EFBFBD> <EFBFBD><EFBFBD><EFBFBD>ڴ<EFBFBD>. <EFBFBD><EFBFBD>Ƽ <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>忡<EFBFBD><EFBFBD> spin lock <EFBFBD><EFBFBD><EFBFBD><EFBFBD> <EFBFBD><EFBFBD><EFBFBD><EFBFBD>ȭ<EFBFBD><EFBFBD> <EFBFBD><EFBFBD>
|
|||
|
<EFBFBD><EFBFBD>, <EFBFBD><EFBFBD><EFBFBD><EFBFBD> <EFBFBD><EFBFBD><EFBFBD><EFBFBD> <EFBFBD>ټ<EFBFBD> '<EFBFBD><EFBFBD> ó<EFBFBD><EFBFBD>'<EFBFBD><EFBFBD> <EFBFBD><EFBFBD> <EFBFBD><EFBFBD><EFBFBD><EFBFBD>, <EFBFBD>۾<EFBFBD> <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>尡 <EFBFBD><EFBFBD><EFBFBD>ؽ<EFBFBD>Ʈ <EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ī
|
|||
|
<EFBFBD><EFBFBD> <EFBFBD>ϸ鼭 <EFBFBD><EFBFBD><EFBFBD><EFBFBD>ȭ <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <EFBFBD><EFBFBD><EFBFBD><EFBFBD> <EFBFBD><EFBFBD> <EFBFBD>ְ<EFBFBD> <EFBFBD><EFBFBD> <EFBFBD>ٸ<EFBFBD> <EFBFBD>۾<EFBFBD> <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <EFBFBD><EFBFBD><EFBFBD><EFBFBD>
|
|||
|
ȭ <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> cpu <EFBFBD><EFBFBD> spin <EFBFBD>ϰ<EFBFBD> <EFBFBD>ִٸ<EFBFBD> <EFBFBD><EFBFBD><EFBFBD><EFBFBD>ȭ<EFBFBD><EFBFBD> <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <EFBFBD>ʾ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>,
|
|||
|
<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> dead lock <EFBFBD><EFBFBD> <EFBFBD><EFBFBD><EFBFBD><EFBFBD> <EFBFBD><EFBFBD><EFBFBD><EFBFBD> <EFBFBD>ִ<EFBFBD>.
|
|||
|
|
|||
|
-- 2008-03-20 11:27:00
|
|||
|
|
|||
|
///////////////////////////////////////////////////////////////////////*/
|
|||
|
|
|||
|
class ZCSpinLock
|
|||
|
{
|
|||
|
private:
|
|||
|
pthread_spinlock_t mh_SpinLock;
|
|||
|
public :
|
|||
|
|
|||
|
int Init(int AI_ShareMode=PTHREAD_PROCESS_PRIVATE)
|
|||
|
{
|
|||
|
// <20><><EFBFBD>μ<EFBFBD><CEBC><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> spin lock <20><> <20><><EFBFBD><EFBFBD><EFBFBD>Ѵٸ<D1B4> PTHREAD_PROCESS_SHARED <20><> <20>ش<EFBFBD>.
|
|||
|
// <20><EFBFBD><D7B8><EFBFBD> pthread_spinlock_t <20><> <20><><EFBFBD><EFBFBD><EFBFBD><DEB8> <20>־<EFBFBD><D6BE><EFBFBD> <20>Ѵ<EFBFBD>. <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD>ϴ<EFBFBD>.
|
|||
|
|
|||
|
return pthread_spin_init(&mh_SpinLock,AI_ShareMode);
|
|||
|
}/*
|
|||
|
void Init(int AI_ShareMode=PTHREAD_PROCESS_PRIVATE)*/
|
|||
|
|
|||
|
int Close()
|
|||
|
{
|
|||
|
return pthread_spin_destroy(&mh_SpinLock);
|
|||
|
}/*
|
|||
|
void Close()*/
|
|||
|
|
|||
|
int Delete() // for windows compatability
|
|||
|
{
|
|||
|
return this->Close();
|
|||
|
}/*
|
|||
|
void Delete()*/
|
|||
|
|
|||
|
int Lock()
|
|||
|
{
|
|||
|
return pthread_spin_lock(&mh_SpinLock);
|
|||
|
}/*
|
|||
|
void Lock()*/
|
|||
|
|
|||
|
int TryLock()
|
|||
|
{
|
|||
|
return pthread_spin_trylock(&mh_SpinLock);
|
|||
|
}/*
|
|||
|
void TryLock()*/
|
|||
|
|
|||
|
int UnLock()
|
|||
|
{
|
|||
|
return pthread_spin_unlock(&mh_SpinLock);
|
|||
|
}/*
|
|||
|
void UnLock()*/
|
|||
|
|
|||
|
public:
|
|||
|
};/*
|
|||
|
class ZCSpinLock*/
|
|||
|
|
|||
|
|
|||
|
class ZCSpinLockEasy : protected ZCSpinLock
|
|||
|
{
|
|||
|
public:
|
|||
|
/*#######################################################################
|
|||
|
|
|||
|
<EFBFBD><EFBFBD> <EFBFBD>Ҹ<EFBFBD><EFBFBD>ڸ<EFBFBD> <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <EFBFBD><EFBFBD> <EFBFBD><EFBFBD><EFBFBD><EFBFBD> <EFBFBD>Լ<EFBFBD> <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> throw(ZtCExceptBase<int, int>) <EFBFBD><EFBFBD>
|
|||
|
<EFBFBD>ٿ<EFBFBD><EFBFBD>µ<EFBFBD>, g++ 7.3.0 <EFBFBD><EFBFBD><EFBFBD><EFBFBD> <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <EFBFBD><EFBFBD><EFBFBD><EFBFBD> <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>.
|
|||
|
|
|||
|
CProcess_Linux.H:2429:25: warning:
|
|||
|
dynamic exception specifications are deprecated in C++11 [-Wdeprecated]
|
|||
|
ZCSpinLockEasy() throw(ZtCExceptBase<int, int>)
|
|||
|
|
|||
|
-- 2018-06-26 15:12:00
|
|||
|
|
|||
|
#######################################################################*/
|
|||
|
|
|||
|
ZCSpinLockEasy() /*throw(ZtCExceptBase<int, int>)*/
|
|||
|
{
|
|||
|
int VI_Return=this->Init();
|
|||
|
|
|||
|
if(VI_Return!=0)
|
|||
|
{
|
|||
|
throw ZtCExceptBase<int, int>(VI_Return);
|
|||
|
}/*
|
|||
|
if(VI_Return!=0)*/
|
|||
|
}/*
|
|||
|
ZCSpinLockEasy()*/
|
|||
|
|
|||
|
ZCSpinLockEasy(const ZCSpinLockEasy& rhs)
|
|||
|
{
|
|||
|
int VI_Return=this->Init();
|
|||
|
|
|||
|
if(VI_Return!=0)
|
|||
|
{
|
|||
|
throw ZtCExceptBase<int, int>(VI_Return);
|
|||
|
}/*
|
|||
|
if(VI_Return!=0)*/
|
|||
|
}/*
|
|||
|
ZCSpinLockEasy(const ZCSpinLockEasy& rhs)*/
|
|||
|
|
|||
|
void Lock()
|
|||
|
{
|
|||
|
int VI_Return=this->ZCSpinLock::Lock();
|
|||
|
|
|||
|
if(VI_Return!=0)
|
|||
|
{
|
|||
|
throw ZtCExceptBase<int, int>(VI_Return);
|
|||
|
}/*
|
|||
|
if(VI_Return!=0)*/
|
|||
|
}/*
|
|||
|
void Lock() throw(ZtCExceptBase<int, int>)*/
|
|||
|
|
|||
|
void UnLock()
|
|||
|
{
|
|||
|
int VI_Return=this->ZCSpinLock::UnLock();
|
|||
|
|
|||
|
if(VI_Return!=0)
|
|||
|
{
|
|||
|
throw ZtCExceptBase<int, int>(VI_Return);
|
|||
|
}/*
|
|||
|
if(VI_Return!=0)*/
|
|||
|
}/*
|
|||
|
void UnLock() throw(ZtCExceptBase<int, int>)*/
|
|||
|
|
|||
|
~ZCSpinLockEasy()
|
|||
|
{
|
|||
|
this->Delete();
|
|||
|
}/*
|
|||
|
ZCSpinLockEasy()*/
|
|||
|
|
|||
|
public:
|
|||
|
};/*
|
|||
|
class ZCSpinLockEasy : protected ZCSpinLock*/
|
|||
|
|
|||
|
|
|||
|
typedef ZCSpinLock ZCCriticSect ;
|
|||
|
typedef ZCSpinLockEasy ZCCriticSectEasy;
|
|||
|
|
|||
|
#else // !__USE_XOPEN2K
|
|||
|
|
|||
|
typedef ZCThreadMutex ZCCriticSect ;
|
|||
|
typedef ZCThreadMutexEasy ZCCriticSectEasy;
|
|||
|
|
|||
|
#endif //!__USE_XOPEN2K
|
|||
|
|
|||
|
|
|||
|
template<typename TAutoKey> class ZtCAutoKeyRev;
|
|||
|
|
|||
|
|
|||
|
/*////////////////////////////////////////////////
|
|||
|
|
|||
|
<EFBFBD><EFBFBD> class ZtCAutoKey<> : Lock <EFBFBD><EFBFBD> <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ϰ<EFBFBD> <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ѵ<EFBFBD>.
|
|||
|
|
|||
|
<EFBFBD><EFBFBD><EFBFBD><EFBFBD> <EFBFBD><EFBFBD><EFBFBD><EFBFBD> <EFBFBD><EFBFBD> <EFBFBD>ִ<EFBFBD> <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <EFBFBD><EFBFBD><EFBFBD><EFBFBD> Key <EFBFBD><EFBFBD><EFBFBD><EFBFBD> <EFBFBD>Ͽ<EFBFBD><EFBFBD><EFBFBD>.
|
|||
|
|
|||
|
--
|
|||
|
|
|||
|
<EFBFBD>̷<EFBFBD> <EFBFBD><EFBFBD><EFBFBD><EFBFBD> <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> RAII
|
|||
|
|
|||
|
Resource Acquisition Is Initialization
|
|||
|
|
|||
|
<EFBFBD><EFBFBD><EFBFBD><EFBFBD> <EFBFBD>Ѵٴ<EFBFBD> <EFBFBD><EFBFBD><EFBFBD><EFBFBD> <EFBFBD>˾Ҵ<EFBFBD>. -- 2015-03-10 15:08:00
|
|||
|
|
|||
|
////////////////////////////////////////////////*/
|
|||
|
|
|||
|
template< typename TCriticSectEasy=ZCThreadMutexEasy
|
|||
|
>
|
|||
|
class ZtCAutoKey /////////////////////////////////////
|
|||
|
{
|
|||
|
public :
|
|||
|
template<typename TAutoKey> friend class ZtCAutoKeyRev;
|
|||
|
private:
|
|||
|
ZtCAutoKey(const ZtCAutoKey&){}
|
|||
|
private:
|
|||
|
|
|||
|
TCriticSectEasy& mr_SyncEasy;
|
|||
|
|
|||
|
#ifdef _DEBUG_CAUTOKEY_
|
|||
|
static int msi_CallCnt;
|
|||
|
#endif //_DEBUG_CAUTOKEY_
|
|||
|
|
|||
|
public:
|
|||
|
|
|||
|
ZtCAutoKey(TCriticSectEasy& AR_SyncEasy):mr_SyncEasy(AR_SyncEasy)
|
|||
|
{
|
|||
|
#ifdef _DEBUG_CAUTOKEY_
|
|||
|
cout<<"<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> ZtCAutoKey:: ZtCAutoKey() "<<this<<", "<<++msi_CallCnt<<" <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>"<<endl;
|
|||
|
#endif //_DEBUG_CAUTOKEY_
|
|||
|
|
|||
|
mr_SyncEasy.Lock();
|
|||
|
}/*
|
|||
|
ZtCAutoKey(TCriticSectEasy& AR_SyncEasy)*/
|
|||
|
|
|||
|
~ZtCAutoKey()
|
|||
|
{
|
|||
|
#ifdef _DEBUG_CAUTOKEY_
|
|||
|
cout<<"<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> ZtCAutoKey::~ZtCAutoKey() "<<this<<", "<<--msi_CallCnt<<" <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>"<<endl;
|
|||
|
#endif //_DEBUG_CAUTOKEY_
|
|||
|
|
|||
|
mr_SyncEasy.UnLock();
|
|||
|
}/*
|
|||
|
ZtCAutoKey()*/
|
|||
|
|
|||
|
public:
|
|||
|
};/*
|
|||
|
template<typename TCriticSectEasy=ZCThreadMutexEasy> class ZtCAutoKey */
|
|||
|
|
|||
|
#ifdef _DEBUG_CAUTOKEY_
|
|||
|
|
|||
|
template<typename TCriticSectEasy>
|
|||
|
int ZtCAutoKey<TCriticSectEasy>::msi_CallCnt = 0 ;
|
|||
|
|
|||
|
#endif //_DEBUG_CAUTOKEY_
|
|||
|
|
|||
|
|
|||
|
/*////////////////////////////////////////////////////////////////
|
|||
|
|
|||
|
<EFBFBD><EFBFBD> ZtCAutoKeyRev<> <EFBFBD><EFBFBD> ZtCAutoKey<> <EFBFBD><EFBFBD> <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ڿ<EFBFBD><EFBFBD><EFBFBD> <EFBFBD>μ<EFBFBD><EFBFBD><EFBFBD> <EFBFBD>Ƽ<EFBFBD> <EFBFBD><EFBFBD>
|
|||
|
<EFBFBD><EFBFBD><EFBFBD>ڿ<EFBFBD><EFBFBD><EFBFBD> Lock <EFBFBD><EFBFBD> <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ϰ<EFBFBD>, <EFBFBD>Ҹ<EFBFBD><EFBFBD>ڿ<EFBFBD><EFBFBD><EFBFBD> <EFBFBD>ٽ<EFBFBD> Lock <EFBFBD><EFBFBD> <EFBFBD>ɾ<EFBFBD> <EFBFBD>ش<EFBFBD>.
|
|||
|
<EFBFBD><EFBFBD><EFBFBD><EFBFBD> <EFBFBD>̷<EFBFBD><EFBFBD><EFBFBD> <EFBFBD>ؾ<EFBFBD> <EFBFBD><EFBFBD> <EFBFBD><EFBFBD>Ȳ <EFBFBD><EFBFBD>ü<EFBFBD><EFBFBD> <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <EFBFBD><EFBFBD><EFBFBD><EFBFBD>. <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ϴ<EFBFBD>
|
|||
|
<EFBFBD><EFBFBD><EFBFBD><EFBFBD> <EFBFBD><EFBFBD><EFBFBD><EFBFBD> Dead Lock <EFBFBD><EFBFBD><EFBFBD>¿<EFBFBD> <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>.
|
|||
|
|
|||
|
<EFBFBD><EFBFBD> 2008-04-09 21:01:00
|
|||
|
|
|||
|
////////////////////////////////////////////////////////////////*/
|
|||
|
|
|||
|
template<typename TAutoKey> class ZtCAutoKeyRev
|
|||
|
{
|
|||
|
private:
|
|||
|
TAutoKey& mr_CAutoKey;
|
|||
|
public :
|
|||
|
|
|||
|
ZtCAutoKeyRev(TAutoKey& AR_CAutoKey):mr_CAutoKey(AR_CAutoKey)
|
|||
|
{
|
|||
|
mr_CAutoKey.mr_SyncEasy.UnLock();
|
|||
|
}/*
|
|||
|
ZtCAutoKeyRev(TAutoKey& AR_CAutoKey)*/
|
|||
|
|
|||
|
~ZtCAutoKeyRev()
|
|||
|
{
|
|||
|
mr_CAutoKey.mr_SyncEasy.Lock();
|
|||
|
}/*
|
|||
|
~ZtCAutoKeyRev()*/
|
|||
|
|
|||
|
public:
|
|||
|
};/*
|
|||
|
template<typename TAutoKey> class ZtCAutoKeyRev */
|
|||
|
|
|||
|
|
|||
|
#ifdef __USE_XOPEN2K
|
|||
|
|
|||
|
class ZCSpinLockProcess
|
|||
|
{
|
|||
|
public :
|
|||
|
enum{EReturn_ShareMemNone = -2}; // <20>ش<EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><DEB8><EFBFBD> <20><><EFBFBD><EFBFBD>
|
|||
|
enum{EReturn_ShareMemMapErr= -3}; // <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><DEB8><EFBFBD> Map <20><><EFBFBD><EFBFBD>
|
|||
|
private:
|
|||
|
|
|||
|
pthread_spinlock_t* mph_SpinLock ;
|
|||
|
ZCShareMemory mo_CShareMemory;
|
|||
|
|
|||
|
public :
|
|||
|
|
|||
|
int Init(long AL_MemMapkey)
|
|||
|
{
|
|||
|
if(mo_CShareMemory.ShmGet(AL_MemMapkey, sizeof(pthread_spinlock_t))==false)
|
|||
|
{
|
|||
|
if(errno!=EEXIST || mo_CShareMemory.ShmGet(AL_MemMapkey)!=true)
|
|||
|
{
|
|||
|
return this->EReturn_ShareMemNone;
|
|||
|
}/*
|
|||
|
if(errno!=EEXIST || mo_CShareMemory.ShmGet(AL_MemMapkey)!=true)*/
|
|||
|
|
|||
|
if(this->mo_CShareMemory.LinkMap()==false)
|
|||
|
{
|
|||
|
this->mo_CShareMemory.Close(); return this->EReturn_ShareMemMapErr;
|
|||
|
}/*
|
|||
|
if(this->mo_CShareMemory.LinkMap()==false)*/
|
|||
|
|
|||
|
mph_SpinLock =
|
|||
|
(pthread_spinlock_t*)mo_CShareMemory.GetStartAddress();
|
|||
|
|
|||
|
return 0;
|
|||
|
}
|
|||
|
else // mo_CShareMemory.ShmGet(AL_MemMapkey, sizeof(pthread_spinlock_t))!=false
|
|||
|
{
|
|||
|
if(this->mo_CShareMemory.LinkMap()==false)
|
|||
|
{
|
|||
|
this->mo_CShareMemory.Close(); return this->EReturn_ShareMemMapErr;
|
|||
|
}/*
|
|||
|
if(this->mo_CShareMemory.LinkMap()==false)*/
|
|||
|
|
|||
|
mph_SpinLock=(pthread_spinlock_t*)mo_CShareMemory.GetStartAddress();
|
|||
|
|
|||
|
::memset((void*)mph_SpinLock, 0x00, sizeof(pthread_spinlock_t));
|
|||
|
|
|||
|
return ::pthread_spin_init(mph_SpinLock, PTHREAD_PROCESS_SHARED);
|
|||
|
}/*
|
|||
|
else // mo_CShareMemory.ShmGet(AL_MemMapkey,sizeof(pthread_spinlock_t))!=false*/
|
|||
|
}/*
|
|||
|
int Init(long AL_MemMapkey)*/
|
|||
|
|
|||
|
int Close()
|
|||
|
{
|
|||
|
mo_CShareMemory.UnMap();
|
|||
|
mo_CShareMemory.Close();
|
|||
|
|
|||
|
return ::pthread_spin_destroy(mph_SpinLock);
|
|||
|
}/*
|
|||
|
void Close()*/
|
|||
|
|
|||
|
int Lock()
|
|||
|
{
|
|||
|
return ::pthread_spin_lock(mph_SpinLock);
|
|||
|
}/*
|
|||
|
void Lock()*/
|
|||
|
|
|||
|
int TryLock()
|
|||
|
{
|
|||
|
return ::pthread_spin_trylock(mph_SpinLock);
|
|||
|
}/*
|
|||
|
void TryLock()*/
|
|||
|
|
|||
|
int UnLock()
|
|||
|
{
|
|||
|
return ::pthread_spin_unlock(mph_SpinLock);
|
|||
|
}/*
|
|||
|
void UnLock()*/
|
|||
|
|
|||
|
public:
|
|||
|
};/*
|
|||
|
class ZCSpinLockProcess*/
|
|||
|
|
|||
|
|
|||
|
typedef ZCSpinLock ZCCriticSect;
|
|||
|
|
|||
|
|
|||
|
#endif //__USE_XOPEN2K
|
|||
|
|
|||
|
|
|||
|
/*//////////////////////////////////////////////////////////////////////////////////////
|
|||
|
|
|||
|
<EFBFBD><EFBFBD> http://blog.naver.com/kimsk99?Redirect=Log&logNo=50004383787
|
|||
|
|
|||
|
<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <EFBFBD><EFBFBD><EFBFBD>α<EFBFBD><EFBFBD><EFBFBD> <EFBFBD>ϸ鼭 <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>带 <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <EFBFBD><EFBFBD>, CreateThread<EFBFBD><EFBFBD> _beginthread<EFBFBD><EFBFBD><EFBFBD><EFBFBD> <EFBFBD><EFBFBD> <EFBFBD>Լ<EFBFBD>
|
|||
|
<EFBFBD><EFBFBD> <EFBFBD> <EFBFBD>Լ<EFBFBD><EFBFBD><EFBFBD> <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ؾ<EFBFBD> <EFBFBD><EFBFBD> <EFBFBD><EFBFBD> <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ϰ<EFBFBD> <EFBFBD>ȴ<EFBFBD>. <EFBFBD><EFBFBD> <EFBFBD><EFBFBD> <EFBFBD><EFBFBD><EFBFBD><EFBFBD> <EFBFBD>⺻ API<EFBFBD><EFBFBD><EFBFBD><EFBFBD> CreateThread
|
|||
|
<EFBFBD><EFBFBD> <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <EFBFBD>Ծ<EFBFBD><EFBFBD><EFBFBD>. <EFBFBD><EFBFBD><EFBFBD><EFBFBD> <EFBFBD><EFBFBD><EFBFBD><EFBFBD> å<EFBFBD><EFBFBD> <EFBFBD>дٰ<EFBFBD> <EFBFBD>װ<EFBFBD> <EFBFBD>߸<EFBFBD><EFBFBD>Ǿ<EFBFBD><EFBFBD>ٴ<EFBFBD> <EFBFBD><EFBFBD><EFBFBD><EFBFBD> <EFBFBD>˾Ҵ<EFBFBD>. MSDN <EFBFBD><EFBFBD> <EFBFBD><EFBFBD>
|
|||
|
<EFBFBD><EFBFBD> <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <EFBFBD>ڼ<EFBFBD><EFBFBD><EFBFBD> <EFBFBD>о<EFBFBD><EFBFBD> <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>̾<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <EFBFBD><EFBFBD><EFBFBD><EFBFBD> <EFBFBD>ڼ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <EFBFBD><EFBFBD> <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <EFBFBD><EFBFBD><EFBFBD><EFBFBD> <EFBFBD><EFBFBD><EFBFBD><EFBFBD>
|
|||
|
<EFBFBD><EFBFBD><EFBFBD><EFBFBD>. <EFBFBD>ϴ<EFBFBD> CreateThread <EFBFBD><EFBFBD> <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> SDK<EFBFBD><EFBFBD><EFBFBD><EFBFBD> <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ϴ<EFBFBD> <EFBFBD>⺻ API<EFBFBD>̴<EFBFBD>. Ư<EFBFBD><EFBFBD><EFBFBD><EFBFBD> <EFBFBD><EFBFBD><EFBFBD>̺귯<EFBFBD><EFBFBD><EFBFBD><EFBFBD>
|
|||
|
<EFBFBD><EFBFBD>ũ<EFBFBD><EFBFBD><EFBFBD><EFBFBD> <EFBFBD>ʾƵ<EFBFBD> <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ϵǰ<EFBFBD> <EFBFBD><EFBFBD><EFBFBD>ư<EFBFBD><EFBFBD><EFBFBD>. <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
|
|||
|
|
|||
|
_beginthread(<EFBFBD>Ǵ<EFBFBD> _beginthreadex)
|
|||
|
|
|||
|
<EFBFBD><EFBFBD> standard C library<EFBFBD><EFBFBD> <EFBFBD><EFBFBD><EFBFBD><EFBFBD> <EFBFBD>Լ<EFBFBD><EFBFBD><EFBFBD> <EFBFBD><EFBFBD>ũ<EFBFBD>ؾ<EFBFBD> <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ѵ<EFBFBD>. <EFBFBD><EFBFBD><EFBFBD><EFBFBD> <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <EFBFBD><EFBFBD><EFBFBD>ɿ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <EFBFBD><EFBFBD><EFBFBD><EFBFBD>
|
|||
|
<EFBFBD><EFBFBD> <EFBFBD><EFBFBD><EFBFBD><EFBFBD>. <EFBFBD><EFBFBD><EFBFBD><EFBFBD> <EFBFBD><EFBFBD><EFBFBD>ɿ<EFBFBD><EFBFBD><EFBFBD> <EFBFBD><EFBFBD><EFBFBD>̰<EFBFBD> <EFBFBD><EFBFBD><EFBFBD><EFBFBD> <EFBFBD>ʴ´ٸ<EFBFBD> <EFBFBD>̷<EFBFBD><EFBFBD><EFBFBD> <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <EFBFBD><EFBFBD><EFBFBD>̴<EFBFBD>.
|
|||
|
|
|||
|
_beginthread <EFBFBD><EFBFBD> <EFBFBD><EFBFBD><EFBFBD><EFBFBD> <EFBFBD><EFBFBD><EFBFBD><EFBFBD> <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <EFBFBD><EFBFBD><EFBFBD><EFBFBD> <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <EFBFBD>ʿ<EFBFBD><EFBFBD><EFBFBD> <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <EFBFBD><EFBFBD> <EFBFBD><EFBFBD> <EFBFBD><EFBFBD>
|
|||
|
<EFBFBD><EFBFBD> <EFBFBD><EFBFBD><EFBFBD>찡 <EFBFBD>ִ<EFBFBD>. <EFBFBD><EFBFBD><EFBFBD><EFBFBD> <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <EFBFBD>Լ<EFBFBD><EFBFBD><EFBFBD> _beginthreadex <EFBFBD><EFBFBD> <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> CreateThread<EFBFBD><EFBFBD> <EFBFBD><EFBFBD><EFBFBD><EFBFBD>
|
|||
|
<EFBFBD><EFBFBD><EFBFBD>ڸ<EFBFBD> <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <EFBFBD>ִ<EFBFBD>. <EFBFBD><EFBFBD><EFBFBD><EFBFBD> <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> CreateThread<EFBFBD><EFBFBD> <EFBFBD><EFBFBD><EFBFBD><EFBFBD> <EFBFBD><EFBFBD><EFBFBD><EFBFBD> <EFBFBD><EFBFBD><EFBFBD><EFBFBD> _beginthreadex<EFBFBD><EFBFBD> ġ
|
|||
|
ȯ<EFBFBD><EFBFBD> <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ϴ<EFBFBD>.
|
|||
|
|
|||
|
<EFBFBD><EFBFBD><EFBFBD>ε<EFBFBD><EFBFBD>ۿ<EFBFBD><EFBFBD><EFBFBD> <EFBFBD><EFBFBD><EFBFBD><EFBFBD> ū <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> _beginthread <EFBFBD><EFBFBD> standard C library<EFBFBD><EFBFBD><EFBFBD><EFBFBD> <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ϴ<EFBFBD> <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
|
|||
|
<EFBFBD><EFBFBD><EFBFBD><EFBFBD> TLB <EFBFBD>ʱ<EFBFBD>ȭ<EFBFBD><EFBFBD> <EFBFBD><EFBFBD><EFBFBD>شٴ<EFBFBD> <EFBFBD><EFBFBD><EFBFBD>̴<EFBFBD>. standary C library<EFBFBD><EFBFBD> <EFBFBD>ִ<EFBFBD> <EFBFBD>Լ<EFBFBD> <EFBFBD><EFBFBD> <EFBFBD>Ϻδ<EFBFBD> thread-
|
|||
|
safety<EFBFBD><EFBFBD> <EFBFBD><EFBFBD><EFBFBD>ؼ<EFBFBD> TLB <EFBFBD><EFBFBD> <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ϴµ<EFBFBD> <EFBFBD>ʱ<EFBFBD>ȭ<EFBFBD><EFBFBD> <EFBFBD><EFBFBD><EFBFBD><EFBFBD> <EFBFBD>ʴ´ٸ<EFBFBD> <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <EFBFBD><EFBFBD><EFBFBD><EFBFBD> <EFBFBD><EFBFBD> <EFBFBD>ִ<EFBFBD>.
|
|||
|
|
|||
|
_beginthreadex <EFBFBD>Լ<EFBFBD><EFBFBD><EFBFBD> <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ؼ<EFBFBD> <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>带 <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ߴٸ<EFBFBD> <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <EFBFBD>Լ<EFBFBD> <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>带 <EFBFBD><EFBFBD><EFBFBD><EFBFBD>
|
|||
|
<EFBFBD>ϱ<EFBFBD> <EFBFBD><EFBFBD><EFBFBD>ؼ<EFBFBD> ExitThread <EFBFBD>Լ<EFBFBD><EFBFBD><EFBFBD> <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ϱ<EFBFBD> <EFBFBD><EFBFBD><EFBFBD>ٴ<EFBFBD> _endthreadex <EFBFBD>Լ<EFBFBD><EFBFBD><EFBFBD> <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ϱ<EFBFBD> <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ѵ<EFBFBD>.
|
|||
|
|
|||
|
<EFBFBD><EFBFBD><EFBFBD>κ<EFBFBD><EFBFBD><EFBFBD> <EFBFBD><EFBFBD><EFBFBD><EFBFBD> C library<EFBFBD><EFBFBD> <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ϱ<EFBFBD> <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> _beginthreadex <EFBFBD><EFBFBD> <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ؾ<EFBFBD>
|
|||
|
<EFBFBD>Ѵ<EFBFBD>.
|
|||
|
|
|||
|
uintptr_t _beginthreadex
|
|||
|
(
|
|||
|
void *security,
|
|||
|
unsigned stack_size,
|
|||
|
unsigned ( *start_address )( void * ),
|
|||
|
void *arglist,
|
|||
|
unsigned initflag,
|
|||
|
unsigned *thrdaddr
|
|||
|
);
|
|||
|
|
|||
|
HANDLE CreateThread
|
|||
|
(
|
|||
|
LPSECURITY_ATTRIBUTES lpThreadAttributes,
|
|||
|
SIZE_T dwStackSize,
|
|||
|
LPTHREAD_START_ROUTINE AP_StartAddress,
|
|||
|
LPVOID lpParameter,
|
|||
|
DWORD dwCreationFlags,
|
|||
|
LPDWORD lpThreadId
|
|||
|
);
|
|||
|
|
|||
|
CreateThread <EFBFBD><EFBFBD> _beginthreadex <EFBFBD><EFBFBD> <EFBFBD><EFBFBD>ü<EFBFBD><EFBFBD> <EFBFBD><EFBFBD> <EFBFBD>ְ<EFBFBD> <EFBFBD><EFBFBD><EFBFBD><EFBFBD> <EFBFBD>Ѵ<EFBFBD>.
|
|||
|
|
|||
|
dwCreationFlags
|
|||
|
[in] Flags that control the creation of the thread.
|
|||
|
If the CREATE_SUSPENDED flag is specified,
|
|||
|
the thread is created in a suspended state,
|
|||
|
and will not run until the ResumeThread function is called.
|
|||
|
If this value is zero,
|
|||
|
the thread runs immediately after creation.
|
|||
|
If the STACK_SIZE_PARAM_IS_A_RESERVATION flag is specified,
|
|||
|
the dwStackSize parameter specifies the initial reserve size of the stack.
|
|||
|
Otherwise, dwStackSize specifies the commit size.
|
|||
|
|
|||
|
Windows 2000/NT and Windows Me/98/95:
|
|||
|
The STACK_SIZE_PARAM_IS_A_RESERVATION flag is not supported.
|
|||
|
lpThreadId
|
|||
|
[out] Pointer to a variable that receives the thread identifier.
|
|||
|
If this parameter is NULL, the thread identifier is not returned.
|
|||
|
|
|||
|
Windows Me/98/95: This parameter may not be NULL.
|
|||
|
|
|||
|
cf) DWORD ResumeThread( HANDLE hThread );
|
|||
|
|
|||
|
|
|||
|
<EFBFBD><EFBFBD> IN WINBASE.H
|
|||
|
|
|||
|
typedef DWORD (WINAPI *PTHREAD_START_ROUTINE)
|
|||
|
(
|
|||
|
LPVOID lpThreadParameter
|
|||
|
);
|
|||
|
|
|||
|
typedef struct _SECURITY_ATTRIBUTES
|
|||
|
{
|
|||
|
DWORD nLength;
|
|||
|
LPVOID lpSecurityDescriptor;
|
|||
|
BOOL bInheritHandle;
|
|||
|
} SECURITY_ATTRIBUTES, *PSECURITY_ATTRIBUTES, *LPSECURITY_ATTRIBUTES;
|
|||
|
|
|||
|
typedef PTHREAD_START_ROUTINE LPTHREAD_START_ROUTINE;
|
|||
|
|
|||
|
LPTHREAD_START_ROUTINE AP_StartAddress <EFBFBD><EFBFBD> <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Լ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
|
|||
|
<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> DWORD WINAPI ThreadFunc(LPVOID lpRarameter)
|
|||
|
|
|||
|
<EFBFBD><EFBFBD> MFC <EFBFBD><EFBFBD> <EFBFBD><EFBFBD><EFBFBD><EFBFBD>ȭ object
|
|||
|
|
|||
|
<EFBFBD>Ʒ<EFBFBD> object <EFBFBD><EFBFBD> <EFBFBD><EFBFBD><EFBFBD><EFBFBD> <EFBFBD><EFBFBD><EFBFBD>ؼ<EFBFBD><EFBFBD><EFBFBD> <afxmt.h> <EFBFBD><EFBFBD> <EFBFBD>ʿ<EFBFBD>
|
|||
|
|
|||
|
1) CCriticalSection cs;
|
|||
|
cs.Lock();
|
|||
|
// <20>۾<EFBFBD><DBBE>ڵ<EFBFBD>
|
|||
|
cs.Unlock();
|
|||
|
|
|||
|
2) CEvent event;
|
|||
|
Thread <EFBFBD><EFBFBD><EFBFBD><EFBFBD> <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <EFBFBD><EFBFBD> <EFBFBD>ֵ<EFBFBD><EFBFBD><EFBFBD> <EFBFBD><EFBFBD><EFBFBD><EFBFBD> <EFBFBD>Ǵ<EFBFBD> <EFBFBD><EFBFBD><EFBFBD><EFBFBD> <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
|
|||
|
CEvent object <EFBFBD><EFBFBD> <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ϰ<EFBFBD> Thread CallBack <EFBFBD>Լ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
|
|||
|
|
|||
|
UINT ThreadFunc(LPVOID pParam)
|
|||
|
{
|
|||
|
while(TRUE)
|
|||
|
{
|
|||
|
CEventOvj.Lock(); // <20><><EFBFBD>̵<EFBFBD><CCB5><EFBFBD>.
|
|||
|
|
|||
|
// <20>̺<EFBFBD>Ʈ<EFBFBD><C6AE> <20><EFBFBD><DFBB><EFBFBD> <20><> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20>ڵ带 <20><><EFBFBD>´<EFBFBD>.
|
|||
|
// <20><EFBFBD><D7B8><EFBFBD> <20>ܺο<DCBA><CEBF><EFBFBD>
|
|||
|
// CEventOvj.PulseEvent(); <20>̳<EFBFBD>
|
|||
|
// CEventOvj.SetEvent(); <20><> ȣ<><C8A3><EFBFBD>ϸ<EFBFBD> <20><><EFBFBD><EFBFBD><EEB3AD>.
|
|||
|
|
|||
|
// Thread <20><> Lock <20><> <20>ɷ<EFBFBD> <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> <20><><EFBFBD>¿<EFBFBD><C2BF><EFBFBD>
|
|||
|
// PulseEvent <20>Լ<EFBFBD><D4BC><EFBFBD> <20><><EFBFBD><EFBFBD> ȣ<><C8A3><EFBFBD>ϸ<EFBFBD> <20>ƹ<EFBFBD><C6B9>ϵ<EFBFBD> <20>Ͼ<CFBE><EEB3AA> <20>ʰ<EFBFBD>
|
|||
|
// <20>ٷ<EFBFBD> <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> Lock() <20><> ȣ<><C8A3><EFBFBD>ϸ<EFBFBD> <20>ٽ<EFBFBD> <20><><EFBFBD><EFBFBD> <20>ܴ<EFBFBD>.
|
|||
|
// SetEvent() <20><> <20><><EFBFBD>쿡<EFBFBD><ECBFA1> <20>׳<EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD>Ѵ<EFBFBD>.
|
|||
|
}
|
|||
|
//while(TRUE)
|
|||
|
}
|
|||
|
//UINT ThreadFunc(LPVOID pParam)
|
|||
|
|
|||
|
|
|||
|
# Window Thread Callback Type;
|
|||
|
|
|||
|
DWORD WINAPI ThreadFunc(LPVOID lpParameter);
|
|||
|
|
|||
|
cf) typedef unsigned long DWORD;
|
|||
|
|
|||
|
# Linux Thread Callback Type:
|
|||
|
|
|||
|
void* ThreadFunc()(void*)
|
|||
|
|
|||
|
<EFBFBD><EFBFBD> -- MFC <EFBFBD><EFBFBD> <EFBFBD><EFBFBD><EFBFBD><EFBFBD>ȭ object
|
|||
|
|
|||
|
//////////////////////////////////////////////////////////////////////////////////////*/
|
|||
|
|
|||
|
|
|||
|
typedef pthread_t ThreadID;
|
|||
|
|
|||
|
|
|||
|
#define _THREAD_RETURN_ void*
|
|||
|
|
|||
|
|
|||
|
namespace ZNsIFace
|
|||
|
{
|
|||
|
class ZCThread_BASE
|
|||
|
{
|
|||
|
};/*
|
|||
|
class ZCThread_BASE*/
|
|||
|
}/*
|
|||
|
namespace ZNsIFace*/
|
|||
|
|
|||
|
|
|||
|
template< typename TTypeBase=ZNsMain::ZCEmpty
|
|||
|
>
|
|||
|
class ZtCThreadAttr : public TTypeBase ////////
|
|||
|
{
|
|||
|
protected:
|
|||
|
pthread_attr_t mh_ThreadAttr;
|
|||
|
public :
|
|||
|
|
|||
|
ZtCThreadAttr()
|
|||
|
{
|
|||
|
}/*
|
|||
|
ZtCThreadAttr()*/
|
|||
|
|
|||
|
ZtCThreadAttr(TTypeBase& AR_CBaseType):TTypeBase(AR_CBaseType)
|
|||
|
{
|
|||
|
}/*
|
|||
|
ZtCThreadAttr(TTypeBase& AR_CBaseType)*/
|
|||
|
|
|||
|
template<typename TTypeArg>
|
|||
|
ZtCThreadAttr(const TTypeArg& AR_TTypeArg) : TTypeBase(AR_TTypeArg)
|
|||
|
{
|
|||
|
}/*
|
|||
|
template<typename TTypeArg>
|
|||
|
ZtCThreadAttr(const TTypeArg& AR_TTypeArg) : TTypeBase(AR_TTypeArg) */
|
|||
|
|
|||
|
pthread_attr_t* GetThreadAttrPtr()
|
|||
|
{
|
|||
|
return &mh_ThreadAttr ;
|
|||
|
}/*
|
|||
|
pthread_attr_t* GetThreadAttrPtr()*/
|
|||
|
|
|||
|
int Init()
|
|||
|
{
|
|||
|
/*////////////////////////////////////////
|
|||
|
|
|||
|
RETURN VALUES
|
|||
|
On success, pthread_attr_init() returns 0. On error,
|
|||
|
one of the following values is returned:
|
|||
|
|
|||
|
ENOMEM
|
|||
|
Insufficient memory exists to create the thread attribute object.
|
|||
|
|
|||
|
EINVAL
|
|||
|
attr does not point to writable memory.
|
|||
|
|
|||
|
EFAULT
|
|||
|
attr is an invalid pointer
|
|||
|
|
|||
|
////////////////////////////////////////*/
|
|||
|
|
|||
|
return pthread_attr_init(&mh_ThreadAttr);
|
|||
|
}/*
|
|||
|
int Init()*/
|
|||
|
|
|||
|
int Fini()
|
|||
|
{
|
|||
|
return pthread_attr_destroy(&mh_ThreadAttr);
|
|||
|
}/*
|
|||
|
int Fini()*/
|
|||
|
|
|||
|
int GetDetachState(int& ARRI_DetachState)
|
|||
|
{
|
|||
|
return pthread_attr_getdetachstate(&mh_ThreadAttr, &ARRI_DetachState);
|
|||
|
}/*
|
|||
|
int GetDetachState(int ARRI_DetachState)*/
|
|||
|
|
|||
|
int SetDetachState(int AI_DetachState=PTHREAD_CREATE_DETACHED) // cf) PTHREAD_CREATE_JOINABLE
|
|||
|
{
|
|||
|
return pthread_attr_setdetachstate(&mh_ThreadAttr, AI_DetachState);
|
|||
|
}/*
|
|||
|
int SetDetachState(int AI_DetachState=PTHREAD_CREATE_DETACHED)*/
|
|||
|
|
|||
|
int GetSchedPolicy(int& ARRI_Policy)
|
|||
|
{
|
|||
|
return pthread_attr_getschedpolicy(&mh_ThreadAttr, &ARRI_Policy);
|
|||
|
}/*
|
|||
|
int GetSchedPolicy(int ARRI_Policy)*/
|
|||
|
|
|||
|
/*////////////////////////////////////////////////////////////
|
|||
|
|
|||
|
<EFBFBD><EFBFBD> pthread_attr_setschedpolicy() <EFBFBD><EFBFBD> 2 <EFBFBD><EFBFBD> <EFBFBD>μ<EFBFBD><EFBFBD><EFBFBD> <EFBFBD><EFBFBD><EFBFBD>밡<EFBFBD><EFBFBD><EFBFBD><EFBFBD> <EFBFBD><EFBFBD>
|
|||
|
|
|||
|
SCHED_FIFO
|
|||
|
First in-first out (FIFO) scheduling policy.
|
|||
|
|
|||
|
SCHED_RR
|
|||
|
Round robin scheduling policy.
|
|||
|
|
|||
|
SCHED_OTHER
|
|||
|
Another scheduling policy
|
|||
|
|
|||
|
////////////////////////////////////////////////////////////*/
|
|||
|
|
|||
|
int SetSchedPolicy(int AI_Policy)
|
|||
|
{
|
|||
|
return pthread_attr_setschedpolicy(&mh_ThreadAttr, AI_Policy);
|
|||
|
}/*
|
|||
|
int SetSchedPolicy(int AI_Policy)*/
|
|||
|
|
|||
|
int GetSchedParam(const struct sched_param& ARR_SchedParam)
|
|||
|
{
|
|||
|
// struct sched_param{int sched_priority;};
|
|||
|
|
|||
|
return pthread_attr_getschedparam(&mh_ThreadAttr, &ARR_SchedParam);
|
|||
|
}/*
|
|||
|
int GetSchedParam(const struct sched_param& ARR_SchedParam)*/
|
|||
|
|
|||
|
int SetSchedParam(const struct sched_param& AR_SchedParam)
|
|||
|
{
|
|||
|
return pthread_attr_setschedparam(&mh_ThreadAttr, &AR_SchedParam);
|
|||
|
}/*
|
|||
|
int SetSchedParam(const struct sched_param& AR_SchedParam)*/
|
|||
|
|
|||
|
int GetStackSize(size_t& ARRI_StackSize)
|
|||
|
{
|
|||
|
return pthread_attr_getstacksize(&mh_ThreadAttr, &ARRI_StackSize);
|
|||
|
}/*
|
|||
|
int GetStackSize(size_t& ARRI_StackSize)*/
|
|||
|
|
|||
|
int SetStackSize(size_t AI_StackSize)
|
|||
|
{
|
|||
|
// PTHREAD_STACK_MIN <20>̻<EFBFBD><CCBB>̾<EFBFBD><CCBE><EFBFBD> <20>Ѵ<EFBFBD>.
|
|||
|
|
|||
|
return pthread_attr_setstacksize(&mh_ThreadAttr, AI_StackSize);
|
|||
|
}/*
|
|||
|
int SetStackSize(size_t AI_StackSize)*/
|
|||
|
|
|||
|
/*/////////////////////////////////////////////////////////////////////////
|
|||
|
|
|||
|
<EFBFBD><EFBFBD> <EFBFBD><EFBFBD><EFBFBD>̺<EFBFBD><EFBFBD><EFBFBD> R. <EFBFBD><EFBFBD>Ʈ<EFBFBD><EFBFBD><EFBFBD><EFBFBD> <EFBFBD><EFBFBD> 'POSIX <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>带 <EFBFBD>̿<EFBFBD><EFBFBD><EFBFBD> <EFBFBD><EFBFBD><EFBFBD>α<EFBFBD><EFBFBD><EFBFBD>' 200 page <EFBFBD><EFBFBD>
|
|||
|
|
|||
|
<EFBFBD>ý<EFBFBD><EFBFBD>ۿ<EFBFBD><EFBFBD><EFBFBD> _POSIX_THREAD_ATTR_STACKSIZE <EFBFBD><EFBFBD>ȣ <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ϰ<EFBFBD> <EFBFBD>ִٸ<EFBFBD>,
|
|||
|
size_t statcksize <EFBFBD>Ӽ<EFBFBD><EFBFBD><EFBFBD> <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <EFBFBD><EFBFBD> <EFBFBD>ִ<EFBFBD>.
|
|||
|
|
|||
|
<EFBFBD><EFBFBD> <EFBFBD>Ǿ<EFBFBD> <EFBFBD>ִµ<EFBFBD>, CentOS 64 bit <EFBFBD><EFBFBD><EFBFBD><EFBFBD>
|
|||
|
|
|||
|
find /usr/include/ | xargs grep 'POSIX_THREAD_ATTR_STACKSIZE'
|
|||
|
|
|||
|
<EFBFBD><EFBFBD> <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ϸ<EFBFBD>,
|
|||
|
|
|||
|
/usr/include/bits/posix_opt.h:#define _POSIX_THREAD_ATTR_STACKSIZE 200112L
|
|||
|
|
|||
|
<EFBFBD><EFBFBD> ã<EFBFBD><EFBFBD> <EFBFBD><EFBFBD> <EFBFBD>ִ<EFBFBD>. -- 2011-05-23 20:44:00
|
|||
|
|
|||
|
<EFBFBD><EFBFBD> <EFBFBD><EFBFBD><EFBFBD><EFBFBD> <EFBFBD><EFBFBD><EFBFBD><EFBFBD> å, <EFBFBD><EFBFBD><EFBFBD><EFBFBD> <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
|
|||
|
|
|||
|
POSIX <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>忡<EFBFBD><EFBFBD><EFBFBD><EFBFBD> <EFBFBD><EFBFBD> <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>忡<EFBFBD><EFBFBD> <EFBFBD>䱸<EFBFBD>ϴ<EFBFBD> <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <EFBFBD>ּ<EFBFBD> ũ<EFBFBD>⸦ <EFBFBD><EFBFBD>Ÿ<EFBFBD><EFBFBD><EFBFBD><EFBFBD>
|
|||
|
<EFBFBD><EFBFBD>ȣ <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>μ<EFBFBD> PTHREAD_STACK_MIN <EFBFBD><EFBFBD> <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ѵ<EFBFBD>.
|
|||
|
|
|||
|
<EFBFBD><EFBFBD> <EFBFBD><EFBFBD>ȣ<EFBFBD><EFBFBD> CentOS <EFBFBD><EFBFBD><EFBFBD><EFBFBD> ã<EFBFBD><EFBFBD><EFBFBD><EFBFBD> bits/local_lim.h <EFBFBD><EFBFBD>
|
|||
|
|
|||
|
#define PTHREAD_STACK_MIN 16384
|
|||
|
|
|||
|
<EFBFBD><EFBFBD><EFBFBD><EFBFBD> <EFBFBD>Ǿ<EFBFBD> <EFBFBD>ִ<EFBFBD>. -- 2011-05-23 20:55:00
|
|||
|
|
|||
|
/////////////////////////////////////////////////////////////////////////*/
|
|||
|
|
|||
|
public:
|
|||
|
};/*
|
|||
|
template< typename TTypeBase=ZNsMain::ZCEmpty
|
|||
|
>
|
|||
|
class ZtCThreadAttr /////////////////////////*/
|
|||
|
|
|||
|
|
|||
|
template< typename TTypeBase=ZNsIFace::ZCThread_BASE
|
|||
|
>
|
|||
|
class ZtCThread : public TTypeBase ///////////////////
|
|||
|
{
|
|||
|
protected:
|
|||
|
ThreadID mh_ThreadID;
|
|||
|
public :
|
|||
|
|
|||
|
ZtCThread()
|
|||
|
{
|
|||
|
_DEBUG_REENTRANT_CHECK_
|
|||
|
|
|||
|
mh_ThreadID = 0 ;
|
|||
|
}
|
|||
|
ZtCThread(TTypeBase& AR_CBaseType):TTypeBase(AR_CBaseType)
|
|||
|
{
|
|||
|
_DEBUG_REENTRANT_CHECK_
|
|||
|
}
|
|||
|
ZtCThread(const ZtCThread& rhs):TTypeBase(rhs)
|
|||
|
{
|
|||
|
_DEBUG_REENTRANT_CHECK_
|
|||
|
|
|||
|
mh_ThreadID =rhs.mh_ThreadID ;
|
|||
|
(TTypeBase&)(*this)=static_cast<const TTypeBase&>(rhs);
|
|||
|
}
|
|||
|
template<typename TTypeArg>
|
|||
|
ZtCThread(const TTypeArg& AR_TTypeArg):TTypeBase(AR_TTypeArg)
|
|||
|
{
|
|||
|
_DEBUG_REENTRANT_CHECK_
|
|||
|
}
|
|||
|
ZtCThread& operator=(const ZtCThread& rhs)
|
|||
|
{
|
|||
|
return *this;
|
|||
|
}/*
|
|||
|
ZtCThread& operator=(const ZtCThread& rhs)*/
|
|||
|
|
|||
|
|
|||
|
operator ThreadID () const
|
|||
|
{
|
|||
|
return mh_ThreadID;
|
|||
|
}/*
|
|||
|
operator ThreadID () const*/
|
|||
|
|
|||
|
ThreadID GetThreadID() const
|
|||
|
{
|
|||
|
return mh_ThreadID;
|
|||
|
}/*
|
|||
|
ThreadID GetThreadID() const*/
|
|||
|
|
|||
|
bool Make(void* AP_StartAddress(void*), void* AP_Arg=NULL, pthread_attr_t* AP_ThreadAttr=NULL)
|
|||
|
{
|
|||
|
return ::pthread_create( ///////////////
|
|||
|
&mh_ThreadID ,
|
|||
|
AP_ThreadAttr ,
|
|||
|
AP_StartAddress ,
|
|||
|
AP_Arg
|
|||
|
/*/////////*/ ) == 0 ; /////////////////
|
|||
|
}/*
|
|||
|
bool Make(void* AP_StartAddress(void*), void* AP_Arg=NULL, pthread_attr_t* AP_ThreadAttr=NULL)*/
|
|||
|
|
|||
|
|
|||
|
// <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD>ñ<EFBFBD><C3B1><EFBFBD> <20><><EFBFBD><EFBFBD> <20>Լ<EFBFBD><D4BC><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD>(<28><><EFBFBD><EFBFBD>)<29><>Ų<EFBFBD><C5B2>.
|
|||
|
|
|||
|
bool Wait()
|
|||
|
{
|
|||
|
return ::pthread_join(mh_ThreadID, NULL)==0 ;
|
|||
|
}/*
|
|||
|
bool Wait()*/
|
|||
|
|
|||
|
bool Wait(void** APP_ThreadReturn)
|
|||
|
{
|
|||
|
return ::pthread_join(mh_ThreadID, APP_ThreadReturn)==0 ;
|
|||
|
}/*
|
|||
|
bool Wait(void** APP_ThreadReturn)*/
|
|||
|
|
|||
|
static bool Wait(ThreadID AI_ThreadIDVar, void** APP_ThreadReturn)
|
|||
|
{
|
|||
|
return ::pthread_join(AI_ThreadIDVar, APP_ThreadReturn)==0 ;
|
|||
|
}/*
|
|||
|
static bool Wait(ThreadID AI_ThreadIDVar, void** APP_ThreadReturn)*/
|
|||
|
|
|||
|
|
|||
|
/*////////////////////////////////////////////////////////////////////////////////////
|
|||
|
|
|||
|
<EFBFBD><EFBFBD> pthread_detach <EFBFBD><EFBFBD> <EFBFBD><EFBFBD><EFBFBD>μ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> fork() <EFBFBD>Ŀ<EFBFBD> waitpid() <EFBFBD><EFBFBD> <EFBFBD><EFBFBD><EFBFBD><EFBFBD> <EFBFBD>ʾƵ<EFBFBD> <EFBFBD>ǵ<EFBFBD><EFBFBD><EFBFBD>
|
|||
|
SIGCHILD <EFBFBD><EFBFBD> <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ϴ<EFBFBD> <EFBFBD>Ͱ<EFBFBD> <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ϴ<EFBFBD>.
|
|||
|
|
|||
|
<EFBFBD><EFBFBD><EFBFBD><EFBFBD> <EFBFBD><EFBFBD><EFBFBD><EFBFBD>(::pthread_join) <EFBFBD><EFBFBD><EFBFBD><EFBFBD> <EFBFBD><EFBFBD><EFBFBD><EFBFBD> <EFBFBD>Ÿ<EFBFBD>, <EFBFBD>ݵ<EFBFBD><EFBFBD><EFBFBD> ȣ<EFBFBD><EFBFBD><EFBFBD>ؾ<EFBFBD> <EFBFBD>ϴ<EFBFBD> <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>.
|
|||
|
pthread_detach() <EFBFBD><EFBFBD> ȣ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>尡 <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ߴµ<EFBFBD><EFBFBD><EFBFBD> <EFBFBD><EFBFBD> OS <EFBFBD><EFBFBD> <EFBFBD><EFBFBD>ȯ<EFBFBD><EFBFBD><EFBFBD><EFBFBD>
|
|||
|
<EFBFBD><EFBFBD><EFBFBD><EFBFBD> <EFBFBD><EFBFBD> <EFBFBD>ִ<EFBFBD>. www.wordncode.com <EFBFBD><EFBFBD> <EFBFBD><EFBFBD><EFBFBD>ϼ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <EFBFBD><EFBFBD> <EFBFBD><EFBFBD> <EFBFBD><EFBFBD> <EFBFBD>ڵ带 <EFBFBD><EFBFBD><EFBFBD>Ծ<EFBFBD><EFBFBD><EFBFBD><EFBFBD>ϸ<EFBFBD>
|
|||
|
Ŭ<EFBFBD><EFBFBD><EFBFBD>̾<EFBFBD>Ʈ<EFBFBD><EFBFBD> <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ߴµ<EFBFBD><EFBFBD><EFBFBD> <EFBFBD><EFBFBD><EFBFBD><EFBFBD> <EFBFBD><EFBFBD> <EFBFBD>پ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <EFBFBD>ʰ<EFBFBD> <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <EFBFBD>ϴ<EFBFBD> <EFBFBD><EFBFBD><EFBFBD>̾<EFBFBD><EFBFBD><EFBFBD>. <EFBFBD><EFBFBD><EFBFBD><EFBFBD>
|
|||
|
<EFBFBD><EFBFBD><EFBFBD><EFBFBD> <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> (<EFBFBD><EFBFBD><EFBFBD><EFBFBD>)<EFBFBD><EFBFBD> <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ͽ<EFBFBD> Ŭ<EFBFBD><EFBFBD><EFBFBD>̾<EFBFBD>Ʈ <EFBFBD><EFBFBD><EFBFBD>ӽÿ<EFBFBD> <EFBFBD><EFBFBD><EFBFBD>ؼ<EFBFBD> <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>带 <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <EFBFBD><EFBFBD>
|
|||
|
<EFBFBD>ϰ<EFBFBD> <EFBFBD>־<EFBFBD><EFBFBD><EFBFBD>!
|
|||
|
|
|||
|
-- 2009-02-24 03:08:00
|
|||
|
|
|||
|
////////////////////////////////////////////////////////////////////////////////////*/
|
|||
|
|
|||
|
static bool Detach(pthread_t AI_ThreadID)
|
|||
|
{
|
|||
|
return ::pthread_detach(AI_ThreadID)==0;
|
|||
|
}/*
|
|||
|
static bool Detach(pthread_t AI_ThreadID)*/
|
|||
|
|
|||
|
bool Detach()
|
|||
|
{
|
|||
|
return ::pthread_detach(mh_ThreadID)==0;
|
|||
|
}/*
|
|||
|
bool Detach()*/
|
|||
|
|
|||
|
|
|||
|
/*//////////////////////////////////////////////////////////////////////////////
|
|||
|
|
|||
|
<EFBFBD><EFBFBD> <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>带 <EFBFBD><EFBFBD><EFBFBD><EFBFBD>(pthread_cancel)<EFBFBD>Ѵٴ<EFBFBD> <EFBFBD><EFBFBD><EFBFBD><EFBFBD> <EFBFBD>ٸ<EFBFBD> <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>κ<EFBFBD><EFBFBD><EFBFBD> <EFBFBD><EFBFBD><EFBFBD>ҿ<EFBFBD>û<EFBFBD><EFBFBD> <EFBFBD>Ƽ<EFBFBD>
|
|||
|
<EFBFBD>۵<EFBFBD><EFBFBD><EFBFBD> <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ϴ<EFBFBD> <EFBFBD><EFBFBD><EFBFBD><EFBFBD> <EFBFBD>ǹ<EFBFBD><EFBFBD>մϴ<EFBFBD>. <EFBFBD><EFBFBD>ġ kill <EFBFBD><EFBFBD> <EFBFBD>̿<EFBFBD><EFBFBD>ؼ<EFBFBD> <EFBFBD><EFBFBD><EFBFBD>μ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <EFBFBD>ߴܽ<EFBFBD>Ű<EFBFBD><EFBFBD>
|
|||
|
<EFBFBD>Ͱ<EFBFBD> <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>մϴ<EFBFBD>. <EFBFBD><EFBFBD><EFBFBD><EFBFBD> <EFBFBD>ߴ<EFBFBD><EFBFBD><EFBFBD> <EFBFBD><EFBFBD>û<EFBFBD><EFBFBD><EFBFBD><EFBFBD> <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>尡 <EFBFBD>ٷ<EFBFBD> <EFBFBD>ߴܵǴ°<EFBFBD>? <EFBFBD>װ<EFBFBD><EFBFBD><EFBFBD> <EFBFBD>ƴ<EFBFBD>
|
|||
|
<EFBFBD>ϴ<EFBFBD>. kill <EFBFBD><EFBFBD> <EFBFBD><EFBFBD><EFBFBD>μ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <EFBFBD><EFBFBD><EFBFBD>̴<EFBFBD> <EFBFBD>͵<EFBFBD> <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>δ<EFBFBD> <EFBFBD><EFBFBD><EFBFBD>μ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <EFBFBD><EFBFBD><EFBFBD>̴<EFBFBD> <EFBFBD>ñ׳<EFBFBD><EFBFBD><EFBFBD> <EFBFBD><EFBFBD><EFBFBD><EFBFBD>
|
|||
|
<EFBFBD><EFBFBD> <EFBFBD><EFBFBD> <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <EFBFBD><EFBFBD><EFBFBD>μ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <EFBFBD>ñ׳<EFBFBD><EFBFBD><EFBFBD> ó<EFBFBD><EFBFBD><EFBFBD>Ͽ<EFBFBD> <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <EFBFBD>ϴµ<EFBFBD> <EFBFBD><EFBFBD><EFBFBD><EFBFBD> <EFBFBD><EFBFBD><EFBFBD><EFBFBD> <EFBFBD><EFBFBD><EFBFBD><EFBFBD> <EFBFBD><EFBFBD><EFBFBD><EFBFBD>
|
|||
|
<EFBFBD>ְų<EFBFBD> Ȥ<EFBFBD><EFBFBD> <EFBFBD><EFBFBD><EFBFBD><EFBFBD>(deferred) <EFBFBD>Ǿ<EFBFBD> <EFBFBD>״<EFBFBD> <EFBFBD><EFBFBD><EFBFBD>쵵 <EFBFBD><EFBFBD><EFBFBD>մϴ<EFBFBD>. <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <EFBFBD><EFBFBD><EFBFBD>ҵ<EFBFBD> <EFBFBD>̿<EFBFBD>
|
|||
|
<EFBFBD><EFBFBD><EFBFBD><EFBFBD> <EFBFBD>ٷ<EFBFBD> <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <EFBFBD>ʽ<EFBFBD><EFBFBD>ϴ<EFBFBD>. <EFBFBD><EFBFBD><EFBFBD><EFBFBD> <EFBFBD><EFBFBD><EFBFBD><EFBFBD> <EFBFBD><EFBFBD><EFBFBD>ҵǵ<EFBFBD><EFBFBD><EFBFBD> <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <EFBFBD><EFBFBD><EFBFBD><EFBFBD> <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ϴٸ<EFBFBD>,
|
|||
|
<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <EFBFBD>⺻ <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>(deferred) <EFBFBD><EFBFBD><EFBFBD>Ҹ<EFBFBD> <EFBFBD>ǹ<EFBFBD><EFBFBD>մϴ<EFBFBD>.
|
|||
|
|
|||
|
<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <EFBFBD>ý<EFBFBD><EFBFBD><EFBFBD> <EFBFBD><EFBFBD>Ʈ<EFBFBD><EFBFBD>ũ <EFBFBD><EFBFBD><EFBFBD>α<EFBFBD><EFBFBD><EFBFBD> : <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ǻ<EFBFBD> : <EFBFBD>輱<EFBFBD><EFBFBD> <EFBFBD><EFBFBD> 315 page
|
|||
|
|
|||
|
<EFBFBD><EFBFBD> cf) int pthread_setcancelstate(int state,int* oldstate) : <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <EFBFBD>Լ<EFBFBD>
|
|||
|
|
|||
|
state <EFBFBD><EFBFBD> PTHREAD_CANCEL_ENABLE, PTHREAD_CANCEL_DISABLE <EFBFBD><EFBFBD><EFBFBD><EFBFBD> <EFBFBD><EFBFBD> <EFBFBD><EFBFBD>
|
|||
|
|
|||
|
//////////////////////////////////////////////////////////////////////////////*/
|
|||
|
|
|||
|
static bool Cancel(pthread_t AI_ThreadID)
|
|||
|
{
|
|||
|
return ::pthread_cancel(AI_ThreadID)==0;
|
|||
|
}/*
|
|||
|
static bool Cancel(pthread_t AI_ThreadID)*/
|
|||
|
|
|||
|
bool Cancel()
|
|||
|
{
|
|||
|
return ::pthread_cancel(mh_ThreadID)==0;
|
|||
|
}/*
|
|||
|
bool Cancel()*/
|
|||
|
|
|||
|
public:
|
|||
|
};/*
|
|||
|
template< typename TTypeBase=ZNsIFace::ZCThread_BASE
|
|||
|
>
|
|||
|
class ZtCThread ////////////////////////////////////*/
|
|||
|
|
|||
|
|
|||
|
template<> class ZtCThread<ZNsIFace::ZCThread_BASE>
|
|||
|
{
|
|||
|
protected:
|
|||
|
ThreadID mh_ThreadID;
|
|||
|
public :
|
|||
|
|
|||
|
ZtCThread()
|
|||
|
{
|
|||
|
_DEBUG_REENTRANT_CHECK_
|
|||
|
}/*
|
|||
|
ZtCThread()*/
|
|||
|
|
|||
|
ZtCThread(const ZtCThread& rhs)
|
|||
|
{
|
|||
|
mh_ThreadID=rhs.mh_ThreadID;
|
|||
|
}/*
|
|||
|
ZtCThread(const ZtCThread& rhs)*/
|
|||
|
|
|||
|
ZtCThread& operator=(const ZtCThread& rhs)
|
|||
|
{
|
|||
|
return *this; // nothing to do
|
|||
|
}/*
|
|||
|
ZtCThread& operator=(const ZtCThread& rhs)*/
|
|||
|
|
|||
|
operator ThreadID () const
|
|||
|
{
|
|||
|
return mh_ThreadID;
|
|||
|
}/*
|
|||
|
operator ThreadID () const*/
|
|||
|
|
|||
|
ThreadID GetThreadID() const
|
|||
|
{
|
|||
|
return mh_ThreadID;
|
|||
|
}/*
|
|||
|
ThreadID GetThreadID() const*/
|
|||
|
|
|||
|
bool Make(void* AP_StartAddress(void*), void* AP_Arg=NULL, pthread_attr_t* AP_ThreadAttr=NULL)
|
|||
|
{
|
|||
|
return ::pthread_create( //////////////
|
|||
|
&mh_ThreadID ,
|
|||
|
AP_ThreadAttr ,
|
|||
|
AP_StartAddress ,
|
|||
|
AP_Arg
|
|||
|
/*/////////*/ ) == 0 ; ////////////////
|
|||
|
}/*
|
|||
|
bool Make(void* AP_StartAddress(void*), void* AP_Arg=NULL, pthread_attr_t* AP_ThreadAttr=NULL)*/
|
|||
|
|
|||
|
bool Wait()
|
|||
|
{
|
|||
|
return ::pthread_join(mh_ThreadID, NULL)==0 ;
|
|||
|
}/*
|
|||
|
bool Wait()*/
|
|||
|
|
|||
|
bool Wait(void** APP_ThreadReturn)
|
|||
|
{
|
|||
|
return ::pthread_join(mh_ThreadID, APP_ThreadReturn)==0 ;
|
|||
|
}/*
|
|||
|
bool Wait(void** APP_ThreadReturn)*/
|
|||
|
|
|||
|
static bool Wait(ThreadID AI_ThreadIDVar, void** APP_ThreadReturn)
|
|||
|
{
|
|||
|
return ::pthread_join(AI_ThreadIDVar, APP_ThreadReturn)==0 ;
|
|||
|
}/*
|
|||
|
static bool Wait(ThreadID AI_ThreadIDVar, void** APP_ThreadReturn)*/
|
|||
|
|
|||
|
static bool Detach(pthread_t AI_ThreadID)
|
|||
|
{
|
|||
|
return ::pthread_detach(AI_ThreadID)==0;
|
|||
|
}/*
|
|||
|
static bool Detach(pthread_t AI_ThreadID)*/
|
|||
|
|
|||
|
bool Detach()
|
|||
|
{
|
|||
|
return ::pthread_detach(mh_ThreadID)==0;
|
|||
|
}/*
|
|||
|
bool Detach()*/
|
|||
|
|
|||
|
static bool Cancel(pthread_t AI_ThreadID)
|
|||
|
{
|
|||
|
return ::pthread_cancel(AI_ThreadID)==0;
|
|||
|
}/*
|
|||
|
static bool Cancel(pthread_t AI_ThreadID)*/
|
|||
|
|
|||
|
bool Cancel()
|
|||
|
{
|
|||
|
return ::pthread_cancel(mh_ThreadID)==0;
|
|||
|
}/*
|
|||
|
bool Cancel()*/
|
|||
|
|
|||
|
public:
|
|||
|
};/*
|
|||
|
template<> class ZtCThread<ZNsIFace::ZCThread_BASE>*/
|
|||
|
|
|||
|
|
|||
|
|
|||
|
/*//////////////////////////////////////////////////////////////////////////////////////
|
|||
|
|
|||
|
<EFBFBD><EFBFBD> class ZtCMutexCond <EFBFBD><EFBFBD> window <EFBFBD><EFBFBD><EFBFBD><EFBFBD> <EFBFBD><EFBFBD><EFBFBD><EFBFBD> <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <EFBFBD><EFBFBD><EFBFBD>ؽ<EFBFBD> <EFBFBD><EFBFBD><EFBFBD>Ǻ<EFBFBD><EFBFBD><EFBFBD> Ŭ<EFBFBD><EFBFBD><EFBFBD><EFBFBD>
|
|||
|
|
|||
|
<EFBFBD>̰<EFBFBD><EFBFBD><EFBFBD> <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <EFBFBD>ټ<EFBFBD><EFBFBD><EFBFBD> <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>尡 <EFBFBD>Լ<EFBFBD> A, <EFBFBD>Լ<EFBFBD> B, <EFBFBD>Լ<EFBFBD> C <EFBFBD><EFBFBD> <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ϴµ<EFBFBD>, <EFBFBD>ݵ<EFBFBD><EFBFBD><EFBFBD> <EFBFBD><EFBFBD>
|
|||
|
<EFBFBD><EFBFBD> A -> B -> C <EFBFBD><EFBFBD> <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ؾ<EFBFBD> <EFBFBD>ϰ<EFBFBD> <EFBFBD><EFBFBD> <EFBFBD>Լ<EFBFBD><EFBFBD><EFBFBD> <EFBFBD><EFBFBD><EFBFBD><EFBFBD>ȭ<EFBFBD><EFBFBD> <EFBFBD><EFBFBD><EFBFBD>־<EFBFBD><EFBFBD><EFBFBD> <EFBFBD><EFBFBD> <EFBFBD><EFBFBD>, <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <EFBFBD><EFBFBD>
|
|||
|
<EFBFBD>Ǻ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ϸ<EFBFBD> <EFBFBD><EFBFBD> <EFBFBD><EFBFBD><EFBFBD><EFBFBD> <EFBFBD><EFBFBD><EFBFBD>ؽ<EFBFBD><EFBFBD><EFBFBD> <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ϳ<EFBFBD> (<EFBFBD><EFBFBD><EFBFBD>Ǻ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> 3-1 <EFBFBD><EFBFBD>), <EFBFBD><EFBFBD><EFBFBD>ؽ<EFBFBD><EFBFBD>θ<EFBFBD> <EFBFBD>Ѵٸ<EFBFBD> A,
|
|||
|
B,C <EFBFBD><EFBFBD> <EFBFBD><EFBFBD><EFBFBD><EFBFBD> 3 <EFBFBD><EFBFBD><EFBFBD><EFBFBD> <EFBFBD><EFBFBD><EFBFBD>ؽ<EFBFBD><EFBFBD><EFBFBD> <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ؾ<EFBFBD> <EFBFBD>Ѵ<EFBFBD>. <EFBFBD><EFBFBD> <EFBFBD><EFBFBD> <EFBFBD><EFBFBD><EFBFBD><EFBFBD> <EFBFBD><EFBFBD><EFBFBD>ؽ<EFBFBD><EFBFBD><EFBFBD> <EFBFBD><EFBFBD><EFBFBD><EFBFBD> <EFBFBD><EFBFBD><EFBFBD><EFBFBD> <EFBFBD><EFBFBD><EFBFBD><EFBFBD> <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
|
|||
|
<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <EFBFBD><EFBFBD> <EFBFBD>ִ<EFBFBD>. <EFBFBD>ݴ<EFBFBD><EFBFBD><EFBFBD> <EFBFBD><EFBFBD> <EFBFBD><EFBFBD><EFBFBD><EFBFBD> <EFBFBD><EFBFBD><EFBFBD>Ǻ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <EFBFBD><EFBFBD><EFBFBD>ؽ<EFBFBD><EFBFBD><EFBFBD> <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <EFBFBD><EFBFBD><EFBFBD><EFBFBD> <EFBFBD><EFBFBD><EFBFBD><EFBFBD>.
|
|||
|
|
|||
|
<EFBFBD><EFBFBD><EFBFBD>Ǻ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ؼ<EFBFBD><EFBFBD><EFBFBD> <EFBFBD>ȵȴ<EFBFBD>. <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ڿ<EFBFBD> <EFBFBD><EFBFBD><EFBFBD>Կ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <EFBFBD><EFBFBD><EFBFBD>´<EFBFBD>.
|
|||
|
|
|||
|
<EFBFBD><EFBFBD><EFBFBD>Ǻ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <EFBFBD>ݵ<EFBFBD><EFBFBD><EFBFBD> <EFBFBD>ѹ<EFBFBD><EFBFBD><EFBFBD> <EFBFBD>ʱ<EFBFBD>ȭ <EFBFBD>Ǿ<EFBFBD><EFBFBD><EFBFBD> <EFBFBD>Ѵ<EFBFBD>.
|
|||
|
|
|||
|
<EFBFBD><EFBFBD> <EFBFBD> <EFBFBD>۾<EFBFBD> ť<EFBFBD><EFBFBD> <EFBFBD>ټ<EFBFBD><EFBFBD><EFBFBD> <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>尡 <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ͽ<EFBFBD> <EFBFBD>۾<EFBFBD><EFBFBD><EFBFBD> <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>´ٰ<EFBFBD> <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>. <EFBFBD>۾<EFBFBD>ť<EFBFBD><EFBFBD> <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ϴ<EFBFBD>
|
|||
|
<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>, ť<EFBFBD><EFBFBD> <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ϴ<EFBFBD> <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <EFBFBD>ٸ<EFBFBD> <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>尡 <EFBFBD><EFBFBD><EFBFBD><EFBFBD> <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <EFBFBD>ʵ<EFBFBD><EFBFBD><EFBFBD> '<EFBFBD>۾<EFBFBD> ť <EFBFBD><EFBFBD><EFBFBD><EFBFBD> <EFBFBD><EFBFBD><EFBFBD><EFBFBD>
|
|||
|
ȭ object ' <EFBFBD><EFBFBD> lock <EFBFBD><EFBFBD> <EFBFBD>ɰ<EFBFBD> <EFBFBD>ش<EFBFBD> ť<EFBFBD><EFBFBD> <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ִ<EFBFBD><EFBFBD><EFBFBD> <EFBFBD><EFBFBD><EFBFBD><EFBFBD> <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <EFBFBD><EFBFBD><EFBFBD>̴<EFBFBD>. <EFBFBD>̶<EFBFBD>
|
|||
|
ť<EFBFBD><EFBFBD> <EFBFBD><EFBFBD><EFBFBD>ϵ<EFBFBD> <EFBFBD>۾<EFBFBD><EFBFBD><EFBFBD> <EFBFBD>ϳ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <EFBFBD>ִٸ<EFBFBD> <EFBFBD><EFBFBD> <EFBFBD>۾<EFBFBD><EFBFBD><EFBFBD> <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> '<EFBFBD>۾<EFBFBD>ť <EFBFBD><EFBFBD><EFBFBD><EFBFBD> <EFBFBD><EFBFBD><EFBFBD><EFBFBD>ȭ object' <EFBFBD><EFBFBD>
|
|||
|
unlock <EFBFBD><EFBFBD> <EFBFBD><EFBFBD><EFBFBD>̴<EFBFBD>. <EFBFBD><EFBFBD><EFBFBD><EFBFBD> ť<EFBFBD><EFBFBD> <EFBFBD><EFBFBD><EFBFBD>ϵ<EFBFBD> <EFBFBD>۾<EFBFBD><EFBFBD><EFBFBD> <EFBFBD><EFBFBD><EFBFBD>ٸ<EFBFBD> '<EFBFBD>۾<EFBFBD> ť <EFBFBD><EFBFBD><EFBFBD><EFBFBD> <EFBFBD><EFBFBD><EFBFBD><EFBFBD>ȭ object' <EFBFBD><EFBFBD> unlock
|
|||
|
<EFBFBD>ϰ<EFBFBD> <EFBFBD>ڽ<EFBFBD><EFBFBD><EFBFBD> <EFBFBD>۾<EFBFBD>ť<EFBFBD><EFBFBD> <EFBFBD>۾<EFBFBD><EFBFBD><EFBFBD> <EFBFBD><EFBFBD><EFBFBD>ϵ<EFBFBD> <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ǿ<EFBFBD><EFBFBD><EFBFBD> <EFBFBD>Ѵ<EFBFBD>. <EFBFBD>̶<EFBFBD> <EFBFBD>ڽ<EFBFBD><EFBFBD><EFBFBD> <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ǰ<EFBFBD> <EFBFBD>ִ<EFBFBD>
|
|||
|
<EFBFBD><EFBFBD> <EFBFBD><EFBFBD><EFBFBD><EFBFBD> <EFBFBD>˸<EFBFBD><EFBFBD><EFBFBD> ǥ<EFBFBD>ø<EFBFBD> <EFBFBD>ϰ<EFBFBD>(<EFBFBD><EFBFBD><EFBFBD><EFBFBD> <EFBFBD><EFBFBD><EFBFBD>߿<EFBFBD> '<EFBFBD><EFBFBD><EFBFBD><EFBFBD>' <EFBFBD><EFBFBD> <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ϱ<EFBFBD>) <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ǿ<EFBFBD> <EFBFBD>ϴµ<EFBFBD>, <EFBFBD><EFBFBD> <EFBFBD><EFBFBD><EFBFBD><EFBFBD>
|
|||
|
<EFBFBD><EFBFBD> <EFBFBD><EFBFBD> unlock <EFBFBD><EFBFBD> <EFBFBD><EFBFBD><EFBFBD><EFBFBD>ǥ<EFBFBD>ø<EFBFBD> <EFBFBD>ϰ<EFBFBD> <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ǵ<EFBFBD> <EFBFBD><EFBFBD><EFBFBD>̿<EFBFBD> <EFBFBD>ٸ<EFBFBD> <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>尡 <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> '<EFBFBD>۾<EFBFBD>ť <EFBFBD><EFBFBD><EFBFBD><EFBFBD>
|
|||
|
<EFBFBD><EFBFBD><EFBFBD><EFBFBD>ȭ object' <EFBFBD><EFBFBD> lock <EFBFBD><EFBFBD> <EFBFBD>ɰ<EFBFBD> <EFBFBD>۾<EFBFBD><EFBFBD><EFBFBD> <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ϸ<EFBFBD>, <EFBFBD>۾<EFBFBD><EFBFBD><EFBFBD> <EFBFBD>и<EFBFBD> <EFBFBD>ִµ<EFBFBD> <EFBFBD><EFBFBD><EFBFBD><EFBFBD>ǥ<EFBFBD>ø<EFBFBD> <EFBFBD>Ϸ<EFBFBD><EFBFBD><EFBFBD>
|
|||
|
<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <EFBFBD><EFBFBD><EFBFBD><EFBFBD>ǥ<EFBFBD>ø<EFBFBD> <EFBFBD>ϱ <EFBFBD><EFBFBD><EFBFBD>̹Ƿ<EFBFBD>, <EFBFBD>ٸ<EFBFBD> <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <EFBFBD><EFBFBD> <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>尡 <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ǰ<EFBFBD> <EFBFBD><EFBFBD><EFBFBD><EFBFBD> <EFBFBD>ʴٰ<EFBFBD>
|
|||
|
<EFBFBD><EFBFBD><EFBFBD><EFBFBD> <EFBFBD><EFBFBD> ó<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> '<EFBFBD>۾<EFBFBD>ť <EFBFBD><EFBFBD><EFBFBD><EFBFBD> <EFBFBD><EFBFBD><EFBFBD><EFBFBD>ȭ object' <EFBFBD><EFBFBD> unlock <EFBFBD><EFBFBD> <EFBFBD>ϰ<EFBFBD> <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <EFBFBD><EFBFBD><EFBFBD>̴<EFBFBD>.
|
|||
|
<EFBFBD><EFBFBD><EFBFBD><EFBFBD> <EFBFBD><EFBFBD><EFBFBD><EFBFBD>ǥ<EFBFBD>ø<EFBFBD><EFBFBD>ϰ<EFBFBD> <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ƿ<EFBFBD><EFBFBD><EFBFBD> <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <EFBFBD><EFBFBD>ȸ<EFBFBD><EFBFBD> <EFBFBD><EFBFBD><EFBFBD><EFBFBD> <EFBFBD><EFBFBD><EFBFBD><EFBFBD> ä <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <EFBFBD><EFBFBD>
|
|||
|
<EFBFBD><EFBFBD><EFBFBD><EFBFBD> <EFBFBD><EFBFBD> <EFBFBD>ִ<EFBFBD>. <EFBFBD><EFBFBD> <EFBFBD><EFBFBD><EFBFBD>¸<EFBFBD> <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ϱ<EFBFBD> <EFBFBD><EFBFBD><EFBFBD><EFBFBD> '<EFBFBD>۾<EFBFBD>ť <EFBFBD><EFBFBD><EFBFBD><EFBFBD> <EFBFBD><EFBFBD><EFBFBD><EFBFBD>ȭ object' <EFBFBD><EFBFBD> unlock <EFBFBD><EFBFBD> <EFBFBD>ϴ<EFBFBD>
|
|||
|
<EFBFBD>۾<EFBFBD><EFBFBD><EFBFBD> <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>·<EFBFBD> <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ϴ<EFBFBD> <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <EFBFBD>̷<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <EFBFBD>Ѵ<EFBFBD>. <EFBFBD>̷<EFBFBD><EFBFBD><EFBFBD> <EFBFBD>ٸ<EFBFBD> <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>尡 <EFBFBD><EFBFBD>
|
|||
|
<EFBFBD><EFBFBD><EFBFBD>ǰ<EFBFBD> <EFBFBD>ִ<EFBFBD> <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>带 <EFBFBD><EFBFBD>Ȯ<EFBFBD>ϰ<EFBFBD> <EFBFBD>Ǻ<EFBFBD><EFBFBD><EFBFBD> <EFBFBD><EFBFBD> <EFBFBD>ְԲ<EFBFBD> <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ش<EFBFBD>. <EFBFBD>̰<EFBFBD><EFBFBD><EFBFBD> <EFBFBD><EFBFBD><EFBFBD><EFBFBD> <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
|
|||
|
<EFBFBD><EFBFBD> <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>̴<EFBFBD>.
|
|||
|
|
|||
|
<EFBFBD><EFBFBD><EFBFBD><EFBFBD> <EFBFBD><EFBFBD><EFBFBD><EFBFBD> <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <EFBFBD><EFBFBD> <EFBFBD><EFBFBD><EFBFBD>ؽ<EFBFBD><EFBFBD><EFBFBD> <EFBFBD><EFBFBD><EFBFBD><EFBFBD> ä<EFBFBD><EFBFBD> <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ؾ<EFBFBD> <EFBFBD>Ѵ<EFBFBD>.
|
|||
|
(<EFBFBD><EFBFBD><EFBFBD><EFBFBD> <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ϱ<EFBFBD> <EFBFBD><EFBFBD>, <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ϰ<EFBFBD> <EFBFBD><EFBFBD><EFBFBD><EFBFBD> <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <EFBFBD><EFBFBD><EFBFBD>ؽ<EFBFBD><EFBFBD><EFBFBD> <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <EFBFBD><EFBFBD><EFBFBD><EFBFBD> <EFBFBD><EFBFBD><EFBFBD>´<EFBFBD>.)
|
|||
|
|
|||
|
<EFBFBD><EFBFBD> <EFBFBD><EFBFBD><EFBFBD>ؽ<EFBFBD><EFBFBD><EFBFBD> <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <EFBFBD><EFBFBD><EFBFBD><EFBFBD> ä<EFBFBD><EFBFBD> <EFBFBD><EFBFBD><EFBFBD><EFBFBD> <EFBFBD><EFBFBD><EFBFBD>Ǻ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <EFBFBD>ñ׳<EFBFBD><EFBFBD><EFBFBD> <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ų<EFBFBD> <EFBFBD><EFBFBD><EFBFBD>ε<EFBFBD>ij<EFBFBD><EFBFBD>Ʈ <EFBFBD><EFBFBD> <EFBFBD><EFBFBD> <EFBFBD><EFBFBD>
|
|||
|
<EFBFBD><EFBFBD>. <EFBFBD> <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>尡 <EFBFBD><EFBFBD><EFBFBD>Ǻ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <EFBFBD>ñ׳<EFBFBD><EFBFBD><EFBFBD> <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ų<EFBFBD> <EFBFBD><EFBFBD><EFBFBD>ε<EFBFBD>ij<EFBFBD><EFBFBD>Ʈ<EFBFBD>Ѵ<EFBFBD> <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <EFBFBD><EFBFBD><EFBFBD><EFBFBD> <EFBFBD><EFBFBD><EFBFBD><EFBFBD> <EFBFBD><EFBFBD>
|
|||
|
<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <EFBFBD><EFBFBD><EFBFBD><EFBFBD> <EFBFBD><EFBFBD><EFBFBD><EFBFBD> <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>尡 <EFBFBD>ϳ<EFBFBD><EFBFBD><EFBFBD> <EFBFBD><EFBFBD><EFBFBD>ٸ<EFBFBD> <EFBFBD>ƹ<EFBFBD><EFBFBD>ϵ<EFBFBD> <EFBFBD>Ͼ<EFBFBD><EFBFBD> <EFBFBD>ʴ´<EFBFBD>. <EFBFBD><EFBFBD><EFBFBD><EFBFBD> <EFBFBD><EFBFBD> <EFBFBD>ٸ<EFBFBD> <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
|
|||
|
<EFBFBD><EFBFBD> pthread_cond_wait() <EFBFBD>Լ<EFBFBD><EFBFBD><EFBFBD> ȣ<EFBFBD><EFBFBD><EFBFBD>Ѵٸ<EFBFBD>, <EFBFBD>ٷ<EFBFBD> <EFBFBD><EFBFBD><EFBFBD><EFBFBD> <EFBFBD>ش<EFBFBD> <EFBFBD><EFBFBD><EFBFBD><EFBFBD> <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <EFBFBD>ñ׳<EFBFBD><EFBFBD><EFBFBD> <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
|
|||
|
<EFBFBD>ٴ<EFBFBD> <EFBFBD><EFBFBD><EFBFBD><EFBFBD> <EFBFBD><EFBFBD><EFBFBD><EFBFBD> <EFBFBD><EFBFBD><EFBFBD>ϰ<EFBFBD> <EFBFBD><EFBFBD><EFBFBD><EFBFBD> <EFBFBD><EFBFBD><EFBFBD>ٸ<EFBFBD><EFBFBD><EFBFBD> <EFBFBD><EFBFBD><EFBFBD>ۿ<EFBFBD> <EFBFBD><EFBFBD><EFBFBD><EFBFBD>. <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <EFBFBD><EFBFBD> <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <EFBFBD><EFBFBD><EFBFBD>ٷ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
|
|||
|
<EFBFBD>ȵǴ<EFBFBD> <EFBFBD><EFBFBD>Ȳ<EFBFBD>̶<EFBFBD><EFBFBD><EFBFBD> <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <EFBFBD><EFBFBD><EFBFBD><EFBFBD> <EFBFBD><EFBFBD><EFBFBD> <EFBFBD><EFBFBD> <EFBFBD><EFBFBD><EFBFBD><EFBFBD> <EFBFBD>ȴ<EFBFBD>. <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>尡 <EFBFBD><EFBFBD><EFBFBD>Ǻ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <EFBFBD><EFBFBD>
|
|||
|
<EFBFBD><EFBFBD><EFBFBD><EFBFBD> <EFBFBD><EFBFBD><EFBFBD>ؽ<EFBFBD><EFBFBD><EFBFBD> <EFBFBD><EFBFBD><EFBFBD><EFBFBD> ä<EFBFBD><EFBFBD> <EFBFBD><EFBFBD><EFBFBD><EFBFBD> <EFBFBD>ֱ<EFBFBD> <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>, <EFBFBD><EFBFBD><EFBFBD><EFBFBD> <EFBFBD>˻<EFBFBD><EFBFBD><EFBFBD> <EFBFBD><EFBFBD><EFBFBD><EFBFBD>߿<EFBFBD><EFBFBD><EFBFBD>(<EFBFBD>ٸ<EFBFBD> <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>鿡 <EFBFBD><EFBFBD>
|
|||
|
<EFBFBD><EFBFBD>) <EFBFBD><EFBFBD><EFBFBD> <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <EFBFBD><EFBFBD> <EFBFBD><EFBFBD><EFBFBD><EFBFBD>. <EFBFBD><EFBFBD> <EFBFBD><EFBFBD><EFBFBD>ؽ<EFBFBD><EFBFBD><EFBFBD> <EFBFBD><EFBFBD><EFBFBD><EFBFBD> <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ƿ<EFBFBD> <EFBFBD>ٸ<EFBFBD> <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <EFBFBD><EFBFBD><EFBFBD><EFBFBD> <EFBFBD><EFBFBD><EFBFBD><EFBFBD> <EFBFBD><EFBFBD><EFBFBD><EFBFBD>
|
|||
|
<EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ÿ<EFBFBD><EFBFBD><EFBFBD><EFBFBD> <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <EFBFBD><EFBFBD> <EFBFBD><EFBFBD><EFBFBD><EFBFBD> <EFBFBD><EFBFBD><EFBFBD>̴<EFBFBD>.
|
|||
|
|
|||
|
<EFBFBD><EFBFBD> <EFBFBD><EFBFBD> <EFBFBD><EFBFBD><EFBFBD> <EFBFBD><EFBFBD>Ʈ<EFBFBD>϶<EFBFBD>! <EFBFBD><EFBFBD><EFBFBD><EFBFBD> <EFBFBD>ٽ<EFBFBD> <EFBFBD>ѹ<EFBFBD> <EFBFBD><EFBFBD>Ʈ<EFBFBD>϶<EFBFBD>!
|
|||
|
|
|||
|
<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>尡 <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <EFBFBD><EFBFBD>, <EFBFBD>ٽ<EFBFBD> <EFBFBD><EFBFBD><EFBFBD> <EFBFBD><EFBFBD>Ʈ<EFBFBD>ϴ<EFBFBD> <EFBFBD><EFBFBD> <EFBFBD><EFBFBD><EFBFBD><EFBFBD> <EFBFBD>ſ<EFBFBD> <EFBFBD>߿<EFBFBD><EFBFBD>ϴ<EFBFBD>. <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <EFBFBD><EFBFBD><EFBFBD><EFBFBD> <EFBFBD><EFBFBD><EFBFBD><EFBFBD>
|
|||
|
<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <EFBFBD><EFBFBD> <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <EFBFBD>̿<EFBFBD><EFBFBD>Ͽ<EFBFBD> <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ϴ<EFBFBD> <EFBFBD><EFBFBD><EFBFBD><EFBFBD> <EFBFBD><EFBFBD><EFBFBD><EFBFBD>.
|
|||
|
|
|||
|
-- <EFBFBD><EFBFBD><EFBFBD>̺<EFBFBD><EFBFBD><EFBFBD> R <EFBFBD><EFBFBD>Ʈ<EFBFBD><EFBFBD><EFBFBD><EFBFBD> <EFBFBD><EFBFBD> Posix <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>带 <EFBFBD>̿<EFBFBD><EFBFBD><EFBFBD> <EFBFBD><EFBFBD><EFBFBD>α<EFBFBD><EFBFBD><EFBFBD> 123P
|
|||
|
|
|||
|
<EFBFBD><EFBFBD> <EFBFBD><EFBFBD><EFBFBD>Ǻ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> Ư<EFBFBD><EFBFBD> <EFBFBD><EFBFBD><EFBFBD>ؽ<EFBFBD> <EFBFBD><EFBFBD> <EFBFBD><EFBFBD><EFBFBD><EFBFBD> <EFBFBD><EFBFBD><EFBFBD>ǰ<EFBFBD> <EFBFBD><EFBFBD><EFBFBD>յǾ<EFBFBD><EFBFBD><EFBFBD> <EFBFBD>Ѵ<EFBFBD>. <EFBFBD><EFBFBD><EFBFBD><EFBFBD> <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>尡 <EFBFBD><EFBFBD><EFBFBD><EFBFBD> <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
|
|||
|
<EFBFBD><EFBFBD><EFBFBD><EFBFBD> <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <EFBFBD><EFBFBD><EFBFBD><EFBFBD> <EFBFBD><EFBFBD> <EFBFBD><EFBFBD><EFBFBD>յ<EFBFBD> <EFBFBD><EFBFBD><EFBFBD>ؽ<EFBFBD><EFBFBD><EFBFBD> <EFBFBD><EFBFBD><EFBFBD>װ<EFBFBD> <EFBFBD>־<EFBFBD><EFBFBD><EFBFBD> <EFBFBD>Ѵ<EFBFBD>. <EFBFBD><EFBFBD><EFBFBD>Ǻ<EFBFBD><EFBFBD><EFBFBD> <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
|
|||
|
<EFBFBD><EFBFBD>, <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>带 <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ϱ<EFBFBD> <EFBFBD><EFBFBD><EFBFBD><EFBFBD> <EFBFBD><EFBFBD><EFBFBD>ؽ<EFBFBD><EFBFBD><EFBFBD> <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ϰ<EFBFBD> <EFBFBD><EFBFBD><EFBFBD><EFBFBD> <EFBFBD>ڵ<EFBFBD><EFBFBD><EFBFBD> <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ϱ<EFBFBD> <EFBFBD><EFBFBD><EFBFBD><EFBFBD> <EFBFBD><EFBFBD><EFBFBD>ؽ<EFBFBD>
|
|||
|
<EFBFBD><EFBFBD> <EFBFBD>ٽ<EFBFBD> <EFBFBD><EFBFBD><EFBFBD>ٴٴ<EFBFBD> <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
|
|||
|
|
|||
|
-- <EFBFBD><EFBFBD><EFBFBD>̺<EFBFBD><EFBFBD><EFBFBD> R <EFBFBD><EFBFBD>Ʈ<EFBFBD><EFBFBD><EFBFBD><EFBFBD> <EFBFBD><EFBFBD> Posix <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>带 <EFBFBD>̿<EFBFBD><EFBFBD><EFBFBD> <EFBFBD><EFBFBD><EFBFBD>α<EFBFBD><EFBFBD><EFBFBD> 123P
|
|||
|
|
|||
|
<EFBFBD><EFBFBD> window <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <EFBFBD><EFBFBD><EFBFBD>ؽ<EFBFBD> <EFBFBD><EFBFBD><EFBFBD><EFBFBD> <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ϱⰡ <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <EFBFBD><EFBFBD><EFBFBD>絥, <EFBFBD><EFBFBD><EFBFBD><EFBFBD> <EFBFBD><EFBFBD><EFBFBD><EFBFBD> <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
|
|||
|
Ư<EFBFBD><EFBFBD> <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> "<EFBFBD><EFBFBD><EFBFBD><EFBFBD>"<EFBFBD><EFBFBD> "<EFBFBD><EFBFBD><EFBFBD>" <EFBFBD><EFBFBD><EFBFBD><EFBFBD> <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ѵٸ<EFBFBD> IOCP <EFBFBD><EFBFBD> GetQueuedCompletionStatus()
|
|||
|
<EFBFBD>Լ<EFBFBD><EFBFBD><EFBFBD> <EFBFBD>̿<EFBFBD><EFBFBD>Ͽ<EFBFBD> <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <EFBFBD><EFBFBD> <EFBFBD>ִ<EFBFBD>.
|
|||
|
|
|||
|
window <EFBFBD><EFBFBD><EFBFBD><EFBFBD> <EFBFBD><EFBFBD><EFBFBD>Ǻ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <EFBFBD>̺<EFBFBD>Ʈ<EFBFBD><EFBFBD> <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ϴ<EFBFBD> <EFBFBD><EFBFBD><EFBFBD><EFBFBD> <EFBFBD><EFBFBD><EFBFBD><EFBFBD> <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <EFBFBD><EFBFBD> <EFBFBD><EFBFBD><EFBFBD><EFBFBD>.
|
|||
|
|
|||
|
-- 2008-12-05 15:06:00
|
|||
|
|
|||
|
<EFBFBD><EFBFBD> <EFBFBD><EFBFBD><EFBFBD><EFBFBD> <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>غ<EFBFBD><EFBFBD><EFBFBD> <EFBFBD><EFBFBD><EFBFBD>Ǻ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <EFBFBD>߿<EFBFBD> <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> ù° "<EFBFBD><EFBFBD><EFBFBD><EFBFBD>" <EFBFBD><EFBFBD> <EFBFBD><EFBFBD>° <EFBFBD><EFBFBD><EFBFBD>ؽ<EFBFBD><EFBFBD><EFBFBD> <EFBFBD><EFBFBD><EFBFBD><EFBFBD> <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>尡 <EFBFBD><EFBFBD>
|
|||
|
<EFBFBD><EFBFBD> "<EFBFBD>ٸ<EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD>尡 <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD>ϴ<EFBFBD> <20><>" <EFBFBD><EFBFBD> <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ϴ<EFBFBD> <EFBFBD><EFBFBD><EFBFBD><EFBFBD> <EFBFBD>ƴұ<EFBFBD> <EFBFBD>Ѵ<EFBFBD>.
|
|||
|
|
|||
|
-- 2007-11-12 07:56:00
|
|||
|
|
|||
|
<EFBFBD><EFBFBD> "<EFBFBD>۾<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>" <EFBFBD><EFBFBD> <EFBFBD><EFBFBD><EFBFBD>Ǻ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ϰ<EFBFBD> <EFBFBD>ְ<EFBFBD>, "<EFBFBD>־<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>" <EFBFBD><EFBFBD><EFBFBD><EFBFBD> "<EFBFBD>۾<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>" <EFBFBD><EFBFBD> <EFBFBD>ñ׳<EFBFBD><EFBFBD><EFBFBD>
|
|||
|
<EFBFBD><EFBFBD><EFBFBD><EFBFBD> <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>غ<EFBFBD><EFBFBD><EFBFBD>. "<EFBFBD>־<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>" <EFBFBD><EFBFBD><EFBFBD><EFBFBD> "<EFBFBD>۾<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>" <EFBFBD><EFBFBD> <EFBFBD>ñ׳<EFBFBD><EFBFBD><EFBFBD> <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>, "<EFBFBD>۾<EFBFBD>
|
|||
|
<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>" <20><> <20><><EFBFBD>ؽ<EFBFBD><D8BD><EFBFBD> Lock <20><> <20>ɰ<EFBFBD> <20><><EFBFBD><EFBFBD> <20>Լ<EFBFBD><D4BC><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>÷<EFBFBD><C3B7><EFBFBD> <20><> <20><><EFBFBD>̴<EFBFBD>. <20>̶<EFBFBD> "<EFBFBD>־<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>"
|
|||
|
<EFBFBD><EFBFBD><EFBFBD><EFBFBD> Lock <EFBFBD><EFBFBD> <EFBFBD>ɰ<EFBFBD> <EFBFBD>ñ׳<EFBFBD><EFBFBD><EFBFBD> <EFBFBD><EFBFBD><EFBFBD>´ٸ<EFBFBD>, "<EFBFBD>۾<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>" <EFBFBD><EFBFBD> <EFBFBD><EFBFBD><EFBFBD><EFBFBD> <EFBFBD>Լ<EFBFBD><EFBFBD><EFBFBD> <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ϱ<EFBFBD> <EFBFBD><EFBFBD><EFBFBD><EFBFBD> <EFBFBD>̹<EFBFBD>
|
|||
|
<EFBFBD><EFBFBD><EFBFBD>ؽ<EFBFBD><EFBFBD><EFBFBD> <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ƿ<EFBFBD>, <EFBFBD><EFBFBD><EFBFBD>ؽ<EFBFBD><EFBFBD><EFBFBD> Ǯ<EFBFBD><EFBFBD> <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <EFBFBD>ٽ<EFBFBD> <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ϰ<EFBFBD> <EFBFBD>ȴ<EFBFBD>. <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <EFBFBD>ñ׳<EFBFBD><EFBFBD><EFBFBD> <EFBFBD><EFBFBD><EFBFBD><EFBFBD>
|
|||
|
"<EFBFBD>־<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>" <EFBFBD><EFBFBD> <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <EFBFBD><EFBFBD><EFBFBD><EFBFBD> Lock <EFBFBD><EFBFBD> Ǯ<EFBFBD><EFBFBD><EFBFBD>־<EFBFBD><EFBFBD><EFBFBD> <EFBFBD>Ѵ<EFBFBD>. <EFBFBD><EFBFBD><EFBFBD><EFBFBD> <EFBFBD>ñ׳η<EFBFBD> <EFBFBD><EFBFBD><EFBFBD><EFBFBD> <EFBFBD><EFBFBD><EFBFBD> "<EFBFBD>۾<EFBFBD><EFBFBD><EFBFBD>
|
|||
|
<EFBFBD><EFBFBD><EFBFBD><EFBFBD>"<EFBFBD><EFBFBD> <20><><EFBFBD>ؽ<EFBFBD><D8BD><EFBFBD> Lock <20><> <20>ɰ<EFBFBD> <20><><EFBFBD><EFBFBD> <20>Լ<EFBFBD><D4BC><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD>ϰ<EFBFBD> <20>Ǹ<EFBFBD> <20><><EFBFBD>ؽ<EFBFBD><D8BD><EFBFBD> Lock <20><> <20><><EFBFBD><EFBFBD> Ǯ<><C7AE><EFBFBD><EFBFBD>
|
|||
|
<EFBFBD><EFBFBD> <EFBFBD><EFBFBD><EFBFBD><EFBFBD> <EFBFBD><EFBFBD><EFBFBD><EFBFBD>. -- 2007-11-16 05:51:00
|
|||
|
|
|||
|
//////////////////////////////////////////////////////////////////////////////////////*/
|
|||
|
|
|||
|
template< typename TData=ZNsMain::ZCEmpty /////////////
|
|||
|
>
|
|||
|
class ZtCMutexCond : public TData, ZNsMain::ZCNonCopyable
|
|||
|
{
|
|||
|
protected:
|
|||
|
::pthread_cond_t mh_PThread_Cond;
|
|||
|
public :
|
|||
|
|
|||
|
::pthread_cond_t GetHandle() const
|
|||
|
{
|
|||
|
return mh_PThread_Cond;
|
|||
|
}/*
|
|||
|
::pthread_cond_t GetHandle() const*/
|
|||
|
|
|||
|
int InitCond(pthread_condattr_t* AP_CondAttr=NULL)
|
|||
|
{
|
|||
|
return ::pthread_cond_init(&mh_PThread_Cond, AP_CondAttr) ;
|
|||
|
|
|||
|
/*/////////////////////////////////////////////////////////
|
|||
|
|
|||
|
<EFBFBD><EFBFBD> pthread_cond_init <EFBFBD><EFBFBD> <EFBFBD><EFBFBD><EFBFBD><EFBFBD> <EFBFBD><EFBFBD>ȯ<EFBFBD><EFBFBD>(<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> 0)
|
|||
|
|
|||
|
EAGIN (<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>̿<EFBFBD><EFBFBD><EFBFBD>) <EFBFBD>ڿ<EFBFBD><EFBFBD><EFBFBD> <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ϴ<EFBFBD>.
|
|||
|
ENOMEM <EFBFBD><EFBFBD> <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ϴ<EFBFBD>.
|
|||
|
EBUSY <EFBFBD><EFBFBD><EFBFBD>Ǻ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <EFBFBD>̹<EFBFBD> <EFBFBD>ʱ<EFBFBD>ȭ <EFBFBD>Ǿ<EFBFBD> <EFBFBD>ִ<EFBFBD>.
|
|||
|
EINVAL AP_CondAttr <EFBFBD><EFBFBD> <EFBFBD>ùٸ<EFBFBD><EFBFBD><EFBFBD> <EFBFBD>ʴ<EFBFBD>.
|
|||
|
|
|||
|
<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD≯<EFBFBD> <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ʱ<EFBFBD>ȭ<EFBFBD><EFBFBD> <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ѵ<EFBFBD>. (PTHREAD_COND_INITIALIZER)
|
|||
|
|
|||
|
/////////////////////////////////////////////////////////*/
|
|||
|
}/*
|
|||
|
int Init(pthread_condattr_t* AP_CondAttr=NULL)*/
|
|||
|
|
|||
|
int FiniCond()
|
|||
|
{
|
|||
|
/*////////////////////////////////////////////////////////////
|
|||
|
|
|||
|
<EFBFBD><EFBFBD> pthread_cond_destroy()
|
|||
|
|
|||
|
RETURN VALUES
|
|||
|
On success, pthread_cond_destroy() returns 0.
|
|||
|
On error, one of the following values is returned:
|
|||
|
|
|||
|
EINVAL
|
|||
|
cond does not refer to an initialized condition variable.
|
|||
|
|
|||
|
EBUSY
|
|||
|
The condition variable is in use by another thread (for example, in a condition wait).
|
|||
|
EFAULT
|
|||
|
cond is an invalid pointer
|
|||
|
|
|||
|
<EFBFBD><EFBFBD> PTHREAD_COND_INITIALIZER <EFBFBD><EFBFBD>ũ<EFBFBD>θ<EFBFBD> <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ͽ<EFBFBD>
|
|||
|
<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <EFBFBD>ʱ<EFBFBD>ȭ<EFBFBD><EFBFBD> <EFBFBD><EFBFBD><EFBFBD>Ǻ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <EFBFBD>ı<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <EFBFBD>ʾƵ<EFBFBD> <EFBFBD>ȴ<EFBFBD>.
|
|||
|
|
|||
|
////////////////////////////////////////////////////////////*/
|
|||
|
|
|||
|
return ::pthread_cond_destroy(&mh_PThread_Cond) ;
|
|||
|
}/*
|
|||
|
int FiniCond()*/
|
|||
|
|
|||
|
int WaitCond(pthread_mutex_t& AR_MutexArg)
|
|||
|
{
|
|||
|
return ::pthread_cond_wait(&mh_PThread_Cond, &AR_MutexArg) ;
|
|||
|
|
|||
|
/*//////////////////////////////////////////////////////////
|
|||
|
|
|||
|
<EFBFBD><EFBFBD> pthread_cond_wait <EFBFBD>Լ<EFBFBD><EFBFBD><EFBFBD> <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ƿ<EFBFBD><EFBFBD><EFBFBD> <EFBFBD><EFBFBD><EFBFBD>ؽ<EFBFBD><EFBFBD><EFBFBD> <EFBFBD>ʱ<EFBFBD>
|
|||
|
ȭ<EFBFBD>Ǿ<EFBFBD> <EFBFBD>ְ<EFBFBD> lock <EFBFBD><EFBFBD> <EFBFBD>Ǿ<EFBFBD> <EFBFBD>־<EFBFBD><EFBFBD><EFBFBD> <EFBFBD>Ѵ<EFBFBD>. <EFBFBD><EFBFBD> <EFBFBD>Լ<EFBFBD><EFBFBD><EFBFBD> <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ǹ<EFBFBD>
|
|||
|
<EFBFBD>Լ<EFBFBD><EFBFBD><EFBFBD> <EFBFBD><EFBFBD><EFBFBD>ο<EFBFBD> <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <EFBFBD><EFBFBD><EFBFBD>ؽ<EFBFBD><EFBFBD><EFBFBD> lock <EFBFBD><EFBFBD> <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> ä<EFBFBD><EFBFBD> <EFBFBD><EFBFBD><EFBFBD><EFBFBD> <EFBFBD><EFBFBD>
|
|||
|
<EFBFBD><EFBFBD><EFBFBD><EFBFBD> <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>. <EFBFBD><EFBFBD><EFBFBD><EFBFBD> <EFBFBD><EFBFBD><EFBFBD><EFBFBD> <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <EFBFBD><EFBFBD><EFBFBD><EFBFBD> <EFBFBD>ñ׳<EFBFBD><EFBFBD><EFBFBD> <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ǹ<EFBFBD>
|
|||
|
<EFBFBD>۾<EFBFBD><EFBFBD><EFBFBD> <EFBFBD>簳<EFBFBD>Ѵ<EFBFBD>. <EFBFBD><EFBFBD> <EFBFBD>ش<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <EFBFBD><EFBFBD><EFBFBD><EFBFBD> <EFBFBD>ñ׳<EFBFBD><EFBFBD><EFBFBD> <EFBFBD><EFBFBD><EFBFBD><EFBFBD>
|
|||
|
<EFBFBD><EFBFBD> <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <EFBFBD>μ<EFBFBD><EFBFBD><EFBFBD> <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <EFBFBD><EFBFBD><EFBFBD>ؽ<EFBFBD><EFBFBD><EFBFBD> <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> pthread_cond_wait
|
|||
|
<EFBFBD>Լ<EFBFBD><EFBFBD><EFBFBD> <EFBFBD><EFBFBD><EFBFBD><EFBFBD> <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ϰ<EFBFBD> <EFBFBD>ȴ<EFBFBD>. pthread_cond_timedwait
|
|||
|
<EFBFBD>Լ<EFBFBD><EFBFBD><EFBFBD> <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ϸ<EFBFBD> timespec <EFBFBD><EFBFBD> <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <EFBFBD>ð<EFBFBD><EFBFBD><EFBFBD>ŭ <EFBFBD><EFBFBD><EFBFBD>⸦ <EFBFBD>ϰ<EFBFBD>
|
|||
|
<EFBFBD>ȴ<EFBFBD>. <EFBFBD><EFBFBD><EFBFBD><EFBFBD> <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <EFBFBD>ð<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <EFBFBD>ñ׳<EFBFBD><EFBFBD><EFBFBD> <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> Ÿ<EFBFBD><EFBFBD>
|
|||
|
<EFBFBD>ƿ<EFBFBD> <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ڵ<EFBFBD><EFBFBD><EFBFBD> <EFBFBD>Բ<EFBFBD> <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ȴ<EFBFBD>.
|
|||
|
|
|||
|
//////////////////////////////////////////////////////////*/
|
|||
|
}/*
|
|||
|
int WaitCond(pthread_mutex_t& AR_MutexArg)*/
|
|||
|
|
|||
|
int WaitCondTime(pthread_mutex_t& AR_MutexArg, struct timespec& AR_Expriation)
|
|||
|
{
|
|||
|
// time out <20≯<EFBFBD> ZNsEnum::ZEThread_TimeOut(ETIMEDOUT) <20><> <20><>ȯ<EFBFBD>Ѵ<EFBFBD>.
|
|||
|
|
|||
|
return ::pthread_cond_timedwait(&mh_PThread_Cond, &AR_MutexArg, &AR_Expriation) ;
|
|||
|
|
|||
|
/*/////////////////////////////////////////////////////
|
|||
|
|
|||
|
DESCRIPTION
|
|||
|
The pthread_cond_timedwait()
|
|||
|
function blocks on the specified condition variable,
|
|||
|
which atomically releases the specified mutex
|
|||
|
and causes the calling thread to block on the condition variable
|
|||
|
The blocked thread may be awakened by a call to pthread_cond_signal()
|
|||
|
or pthread_cond_broadcast(),
|
|||
|
or if the time specified by abstime is reached.
|
|||
|
|
|||
|
This function atomically releases the mutex,
|
|||
|
causing the calling thread to block on the condition variable Upon successful completion,
|
|||
|
the mutex is locked and owned by the calling thread.
|
|||
|
|
|||
|
pthread_cond_timedwait() is the same as pthread_cond_wait(),
|
|||
|
except an error is returned
|
|||
|
if the system time equals or exceeds the time specified by abstime
|
|||
|
before the condition variable is signaled or broadcast,
|
|||
|
or if the absolute time specified by abstime has already passed at the time of the call.
|
|||
|
When timeouts occur, pthread_cond_timedwait() releases and reacquires the mutex.
|
|||
|
|
|||
|
When using condition variables,
|
|||
|
there should always be a boolean predicate involving shared variables related to each condition wait.
|
|||
|
This predicate should become true only
|
|||
|
when the thread should proceed.
|
|||
|
Because the return from pthread_cond_timedwait() does not indicate anything about the value of this predicate,
|
|||
|
the predicate should be reevaluated on return.
|
|||
|
Unwanted wakeups from pthread_cond_timedwait() may occur
|
|||
|
(since another thread could have obtained the mutex,
|
|||
|
changed the state and released the mutex,
|
|||
|
prior to this thread obtaining the mutex);
|
|||
|
the reevaluation of the predicate ensures consistency.
|
|||
|
|
|||
|
The pthread_cond_timedwait() function is a cancellation point.
|
|||
|
If a cancellation request is acted on while in a condition wait
|
|||
|
when the cancellation type of a thread is set to deferred,
|
|||
|
the mutex is reacquired before calling the first cancellation cleanup handler.
|
|||
|
In other words, the thread is unblocked,
|
|||
|
allowed to execute up to the point of returning from the call pthread_cond_timedwait(),
|
|||
|
but instead of returning to the caller, it performs the thread cancellation.
|
|||
|
|
|||
|
--------------------------------------------------------------------------------
|
|||
|
|
|||
|
PARAMETERS
|
|||
|
|
|||
|
cond
|
|||
|
Is the condition variable to wait on.
|
|||
|
|
|||
|
mutex
|
|||
|
Is the mutex associated with the condition variable.
|
|||
|
|
|||
|
abstime
|
|||
|
Is the absolute time at which the wait is cancelled if not signaled or broadcast.
|
|||
|
|
|||
|
--------------------------------------------------------------------------------
|
|||
|
|
|||
|
RETURN VALUES
|
|||
|
On success, pthread_cond_timedwait() returns 0.
|
|||
|
On error, one of the following values is returned:
|
|||
|
|
|||
|
EINVAL
|
|||
|
cond does not refer to an initialized condition variable,
|
|||
|
or mutex does not refer to an initialized mutex.
|
|||
|
Different mutexes were specified in multiple waits on cond.
|
|||
|
mutex is not owned by the caller.
|
|||
|
|
|||
|
EFAULT
|
|||
|
cond, mutex, or abstime is an invalid pointer.
|
|||
|
|
|||
|
ETIMEDOUT
|
|||
|
The specified absolute time has passed.
|
|||
|
|
|||
|
--------------------------------------------------------------------------------
|
|||
|
|
|||
|
CONFORMANCE
|
|||
|
POSIX P1003.1 (1996)
|
|||
|
|
|||
|
--------------------------------------------------------------------------------
|
|||
|
|
|||
|
MULTITHREAD SAFETY LEVEL
|
|||
|
MT-safe.
|
|||
|
|
|||
|
///////////////////////////////////////////////////////////////////////////////*/
|
|||
|
}/*
|
|||
|
int WaitCondTime(pthread_mutex_t& AR_MutexArg, struct timespec& AR_Expriation)*/
|
|||
|
|
|||
|
int WakeCond()
|
|||
|
{
|
|||
|
return ::pthread_cond_signal(&mh_PThread_Cond);
|
|||
|
}/*
|
|||
|
int WakeCond()*/
|
|||
|
|
|||
|
|
|||
|
/*///////////////////////////////////////////////////////////////////////////////
|
|||
|
|
|||
|
<EFBFBD><EFBFBD> pthread_cond_broadcast() <EFBFBD>Լ<EFBFBD><EFBFBD><EFBFBD> <EFBFBD><EFBFBD><EFBFBD><EFBFBD> <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ϴ<EFBFBD> <EFBFBD><EFBFBD><EFBFBD><EFBFBD> <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>忡<EFBFBD><EFBFBD> <EFBFBD>ñ׳<EFBFBD>
|
|||
|
<EFBFBD><EFBFBD> <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>. <EFBFBD><EFBFBD><EFBFBD><EFBFBD> <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>尡 <EFBFBD>Ͼ<EFBFBD><EFBFBD> <EFBFBD>ǹǷ<EFBFBD> <EFBFBD>밳 <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <EFBFBD><EFBFBD><EFBFBD><EFBFBD> <EFBFBD><EFBFBD><EFBFBD>ɼ<EFBFBD><EFBFBD><EFBFBD> <EFBFBD>ִ<EFBFBD>. <EFBFBD><EFBFBD>
|
|||
|
<EFBFBD><EFBFBD> <EFBFBD>ؾ<EFBFBD> <EFBFBD><EFBFBD> <EFBFBD>۾<EFBFBD><EFBFBD><EFBFBD> 10 <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <EFBFBD><EFBFBD><EFBFBD><EFBFBD> <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> 1 <EFBFBD><EFBFBD><EFBFBD><EFBFBD> <EFBFBD>װ<EFBFBD> <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
|
|||
|
<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <EFBFBD>ڿ<EFBFBD> <EFBFBD>ٽ<EFBFBD> <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ѵ<EFBFBD>. <EFBFBD>̷<EFBFBD><EFBFBD><EFBFBD> <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <EFBFBD><EFBFBD><EFBFBD> <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <EFBFBD>ٽ<EFBFBD> <EFBFBD><EFBFBD><EFBFBD><EFBFBD>
|
|||
|
<EFBFBD><EFBFBD><EFBFBD>·<EFBFBD> <EFBFBD><EFBFBD><EFBFBD><EFBFBD> <EFBFBD><EFBFBD><EFBFBD><EFBFBD> <EFBFBD>ʿ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>带 <EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ű<EFBFBD><EFBFBD> <EFBFBD>ȴ<EFBFBD>. <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <EFBFBD> <EFBFBD><EFBFBD><EFBFBD>쿡 <EFBFBD><EFBFBD>
|
|||
|
<EFBFBD>ε<EFBFBD>ij<EFBFBD><EFBFBD>Ʈ<EFBFBD><EFBFBD> <EFBFBD><EFBFBD> <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <EFBFBD><EFBFBD> <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ؼ<EFBFBD> <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ؾ<EFBFBD> <EFBFBD>Ѵ<EFBFBD>.
|
|||
|
|
|||
|
-- <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <EFBFBD>ý<EFBFBD><EFBFBD><EFBFBD> <EFBFBD><EFBFBD>Ʈ<EFBFBD><EFBFBD>ũ <EFBFBD><EFBFBD><EFBFBD>α<EFBFBD><EFBFBD><EFBFBD>, <EFBFBD>輱<EFBFBD><EFBFBD> <EFBFBD><EFBFBD>, <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ǻ<EFBFBD>
|
|||
|
|
|||
|
///////////////////////////////////////////////////////////////////////////////*/
|
|||
|
|
|||
|
int BoradCast()
|
|||
|
{
|
|||
|
return ::pthread_cond_broadcast(&mh_PThread_Cond) ;
|
|||
|
}/*
|
|||
|
int BoradCast()*/
|
|||
|
|
|||
|
public:
|
|||
|
};/*
|
|||
|
template< typename TData=ZNsMain::ZCEmpty
|
|||
|
>
|
|||
|
class ZtCMutexCond //////////////////////*/
|
|||
|
|
|||
|
|
|||
|
|
|||
|
/*///////////////////////////////////////////////////////////////
|
|||
|
|
|||
|
<EFBFBD><EFBFBD> mutex <EFBFBD><EFBFBD> <EFBFBD><EFBFBD><EFBFBD>Ǻ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> Ŭ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>. ZtCMutexCond<> <EFBFBD><EFBFBD><EFBFBD>ø<EFBFBD><EFBFBD><EFBFBD>
|
|||
|
ZCProcessMutex <EFBFBD><EFBFBD><EFBFBD><EFBFBD> <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <EFBFBD>̿<EFBFBD><EFBFBD>ϸ<EFBFBD> <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <EFBFBD><EFBFBD><EFBFBD><EFBFBD> <EFBFBD><EFBFBD><EFBFBD><EFBFBD>ȭ <EFBFBD>ϱ<EFBFBD> <EFBFBD><EFBFBD>
|
|||
|
<EFBFBD>ؼ<EFBFBD> <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ϴ<EFBFBD> <EFBFBD><EFBFBD><EFBFBD>̴<EFBFBD>.
|
|||
|
|
|||
|
///////////////////////////////////////////////////////////////*/
|
|||
|
|
|||
|
template< typename TData=ZNsMain::ZCEmpty
|
|||
|
>
|
|||
|
class ZtCMutexCondData : public TData
|
|||
|
{
|
|||
|
protected:
|
|||
|
pthread_mutex_t mh_Mutex;
|
|||
|
pthread_cond_t mh_Cond ;
|
|||
|
public :
|
|||
|
|
|||
|
int InitCond(const pthread_mutexattr_t* AP_MutexAttr=0, const pthread_condattr_t* AP_CondAttr=0)
|
|||
|
{
|
|||
|
#if(_CODE_OLD_)
|
|||
|
|
|||
|
// <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20>ڵ<EFBFBD>.
|
|||
|
|
|||
|
bool VB_IsOK1=::pthread_mutex_init(&mh_Mutex, AP_MutexAttr)==ZNsMain::ZNsEnum::ZEThread_OK;
|
|||
|
bool VB_IsOK2=::pthread_cond_init (&mh_Cond, AP_CondAttr )==ZNsMain::ZNsEnum::ZEThread_OK;
|
|||
|
|
|||
|
return (VB_IsOK1 && VB_IsOK2) ? ZNsMain::ZNsEnum::ZEThread_OK : ZNsMain::ZNsEnum::ZEThread_Invalid ;
|
|||
|
|
|||
|
#else
|
|||
|
return ( ::pthread_mutex_init(&mh_Mutex, AP_MutexAttr)==ZNsMain::ZNsEnum::ZEThread_OK &&
|
|||
|
::pthread_cond_init (&mh_Cond, AP_CondAttr )==ZNsMain::ZNsEnum::ZEThread_OK
|
|||
|
/*///*/ ) ? ZNsMain::ZNsEnum::ZEThread_OK : ZNsMain::ZNsEnum::ZEThread_Invalid ;
|
|||
|
#endif
|
|||
|
}/*
|
|||
|
int Init(const pthread_mutexattr_t* AP_MutexAttr=0, const pthread_condattr_t* AP_CondAttr=0)*/
|
|||
|
|
|||
|
int Lock()
|
|||
|
{
|
|||
|
return ::pthread_mutex_lock(&mh_Mutex);
|
|||
|
}/*
|
|||
|
bool Lock()*/
|
|||
|
|
|||
|
int TryLock(const timespec* AP_TimeOut)
|
|||
|
{
|
|||
|
return ::pthread_mutex_trylock(&mh_Mutex);
|
|||
|
}/*
|
|||
|
int TryLock(const timespec* AP_TimeOut)*/
|
|||
|
|
|||
|
int UnLock()
|
|||
|
{
|
|||
|
return ::pthread_mutex_unlock(&mh_Mutex);
|
|||
|
}/*
|
|||
|
int UnLock()*/
|
|||
|
|
|||
|
int WaitCond() // <20>ش<EFBFBD> <20><><EFBFBD>ؽ<EFBFBD><D8BD><EFBFBD> lock <20><> <20>ɷ<EFBFBD> <20>־<EFBFBD><D6BE><EFBFBD> <20>Ѵ<EFBFBD>.
|
|||
|
{
|
|||
|
return ::pthread_cond_wait(&mh_Cond, &mh_Mutex) ;
|
|||
|
}/*
|
|||
|
int WaitCond()*/
|
|||
|
|
|||
|
#ifdef __USE_XOPEN2K
|
|||
|
|
|||
|
int Lock(const timespec* AP_TimeOut)
|
|||
|
{
|
|||
|
return ::pthread_mutex_timedlock(&mh_Mutex, AP_TimeOut);
|
|||
|
}/*
|
|||
|
int Lock(const timespec* AP_TimeOut)*/
|
|||
|
|
|||
|
int WaitCondTime(const timespec* AP_TimeOut)
|
|||
|
{
|
|||
|
return ::pthread_cond_timedwait(&mh_Cond, &mh_Mutex, AP_TimeOut) ;
|
|||
|
}/*
|
|||
|
int WaitCondTime(const timespec* AP_TimeOut)*/
|
|||
|
|
|||
|
int WaitCondTime(int AI_TimeOutMili)
|
|||
|
{
|
|||
|
timespec VO_TimeAbs; // <20><><EFBFBD><EFBFBD><EFBFBD>ð<EFBFBD>
|
|||
|
timeval VO_TimeNow;
|
|||
|
|
|||
|
/*///////////////////////////////////////////////////////
|
|||
|
|
|||
|
<EFBFBD><EFBFBD> timespec
|
|||
|
|
|||
|
struct timespec
|
|||
|
{
|
|||
|
__time_t tv_sec ; // Seconds.
|
|||
|
long int tv_nsec; // Nanoseconds. 10 <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> 1 <20><>, 1 <20>и<EFBFBD><D0B8><EFBFBD>=1000*1000 <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
|
|||
|
};
|
|||
|
|
|||
|
<EFBFBD><EFBFBD> int gettimeofday( struct timeval *tv, struct timezone *tz);
|
|||
|
int settimeofday(const struct timeval *tv,const struct timezone *tz);
|
|||
|
|
|||
|
-- linux manual <EFBFBD><EFBFBD><EFBFBD><EFBFBD>
|
|||
|
|
|||
|
struct timeval
|
|||
|
{
|
|||
|
long tv_sec; // <20><>
|
|||
|
long tv_usec; // <20><><EFBFBD><EFBFBD>ũ<EFBFBD><C5A9><EFBFBD><EFBFBD>
|
|||
|
};
|
|||
|
|
|||
|
struct timezone
|
|||
|
{
|
|||
|
int tz_minuteswest; // <20><EFBFBD><D7B8><EFBFBD>ġ <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD>(minutes)
|
|||
|
int tz_dsttime; // DST <20><><EFBFBD><EFBFBD> Ÿ<><C5B8>
|
|||
|
};
|
|||
|
|
|||
|
timezone struct <EFBFBD><EFBFBD> <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <EFBFBD>ʴ´<EFBFBD>;
|
|||
|
<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> tz_dsttime <EFBFBD>ʵ尡 <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <EFBFBD>ʴ´<EFBFBD>.
|
|||
|
<EFBFBD><EFBFBD><EFBFBD>ݱ<EFBFBD><EFBFBD><EFBFBD> <EFBFBD><EFBFBD><EFBFBD><EFBFBD> <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ε<EFBFBD> libc <EFBFBD><EFBFBD> glibc<EFBFBD><EFBFBD><EFBFBD><EFBFBD> <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <EFBFBD><EFBFBD><EFBFBD><EFBFBD> <EFBFBD><EFBFBD><EFBFBD>̴<EFBFBD>.
|
|||
|
Ŀ<EFBFBD><EFBFBD> <EFBFBD>ҽ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>(<EFBFBD><EFBFBD><EFBFBD><EFBFBD> <EFBFBD>̿ܿ<EFBFBD>) <EFBFBD><EFBFBD> <EFBFBD>ʵ尡 <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <EFBFBD><EFBFBD><EFBFBD><EFBFBD> <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>̴<EFBFBD>.
|
|||
|
<EFBFBD><EFBFBD><EFBFBD><EFBFBD> <EFBFBD><EFBFBD><EFBFBD><EFBFBD> <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <EFBFBD><EFBFBD><EFBFBD>̰Ÿ<EFBFBD><EFBFBD><EFBFBD>.
|
|||
|
|
|||
|
~~~~~~
|
|||
|
|
|||
|
gettimeofday<EFBFBD><EFBFBD> settimeofday <EFBFBD><EFBFBD><EFBFBD><EFBFBD> <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ϸ<EFBFBD> 0<EFBFBD><EFBFBD> <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ϸ<EFBFBD>,
|
|||
|
<EFBFBD><EFBFBD><EFBFBD>нÿ<EFBFBD><EFBFBD><EFBFBD> -1<EFBFBD><EFBFBD> <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ѵ<EFBFBD>.(errno<EFBFBD><EFBFBD> <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ȴ<EFBFBD>.)
|
|||
|
|
|||
|
///////////////////////////////////////////////////////*/
|
|||
|
|
|||
|
::gettimeofday(&VO_TimeNow, NULL);
|
|||
|
|
|||
|
VO_TimeAbs.tv_sec =VO_TimeNow.tv_sec + (AI_TimeOutMili/1000) ;
|
|||
|
VO_TimeAbs.tv_nsec=VO_TimeNow.tv_usec*1000 + (AI_TimeOutMili%1000)*1000*1000 ;
|
|||
|
|
|||
|
return ::pthread_cond_timedwait(&mh_Cond, &mh_Mutex, &VO_TimeAbs) ; // return ZEThread_TimeOut if timeout
|
|||
|
}/*
|
|||
|
int WaitCondTime(int AI_TimeOutMili)*/
|
|||
|
|
|||
|
#endif //__USE_XOPEN2K
|
|||
|
|
|||
|
int WakeCond()
|
|||
|
{
|
|||
|
return ::pthread_cond_signal(&mh_Cond);
|
|||
|
}/*
|
|||
|
int WakeCond()*/
|
|||
|
|
|||
|
int WakeAllCond()
|
|||
|
{
|
|||
|
return ::pthread_cond_broadcast(&mh_Cond);
|
|||
|
}/*
|
|||
|
int WakeAllCond()*/
|
|||
|
|
|||
|
int BroadCast()
|
|||
|
{
|
|||
|
return WakeAllCond();
|
|||
|
}/*
|
|||
|
int BroadCast()*/
|
|||
|
|
|||
|
int FiniCond()
|
|||
|
{
|
|||
|
#if(_CODE_OLD_)
|
|||
|
|
|||
|
// <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20>ڵ<EFBFBD>.
|
|||
|
|
|||
|
bool VB_IsOK1=::pthread_cond_destroy (&mh_Cond )==ZNsMain::ZNsEnum::ZEThread_OK;
|
|||
|
bool VB_IsOK2=::pthread_mutex_destroy(&mh_Mutex)==ZNsMain::ZNsEnum::ZEThread_OK;
|
|||
|
|
|||
|
return (VB_IsOK1 && VB_IsOK2) ? ZNsMain::ZNsEnum::ZEThread_OK : ZNsMain::ZNsEnum::ZEThread_Invalid ;
|
|||
|
|
|||
|
#else
|
|||
|
|
|||
|
return ( ::pthread_cond_destroy (&mh_Cond )==ZNsMain::ZNsEnum::ZEThread_OK &&
|
|||
|
::pthread_mutex_destroy(&mh_Mutex)==ZNsMain::ZNsEnum::ZEThread_OK
|
|||
|
/*///*/ ) ? ZNsMain::ZNsEnum::ZEThread_OK : ZNsMain::ZNsEnum::ZEThread_Invalid ;
|
|||
|
|
|||
|
#endif
|
|||
|
}/*
|
|||
|
int FiniCond()*/
|
|||
|
|
|||
|
public:
|
|||
|
};/*
|
|||
|
template< typename TData=ZNsMain::ZCEmpty
|
|||
|
>
|
|||
|
class ZtCMutexCondData : public TData ///*/
|
|||
|
|
|||
|
|
|||
|
/*//////////////////////////////////////////////////////////////////
|
|||
|
|
|||
|
<EFBFBD><EFBFBD> ZtCEventCond<> <EFBFBD><EFBFBD><EFBFBD>ø<EFBFBD><EFBFBD><EFBFBD> Window <EFBFBD><EFBFBD> event <EFBFBD><EFBFBD> <EFBFBD><EFBFBD><EFBFBD><EFBFBD>, Ư<EFBFBD><EFBFBD> <EFBFBD><EFBFBD><EFBFBD>ǿ<EFBFBD><EFBFBD><EFBFBD> <EFBFBD><EFBFBD>
|
|||
|
<EFBFBD><EFBFBD><EFBFBD>ϴ<EFBFBD> <EFBFBD><EFBFBD><EFBFBD><EFBFBD> <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>带 <EFBFBD>Ѳ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <EFBFBD><EFBFBD><EFBFBD>ؼ<EFBFBD> <EFBFBD>ʿ<EFBFBD><EFBFBD>ϴ<EFBFBD>.
|
|||
|
|
|||
|
Linux <EFBFBD><EFBFBD> pthread_cond_signal() <EFBFBD>Լ<EFBFBD><EFBFBD><EFBFBD> <EFBFBD>ش<EFBFBD> <EFBFBD><EFBFBD><EFBFBD><EFBFBD> <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ϰ<EFBFBD>
|
|||
|
<EFBFBD>ִ<EFBFBD> <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <EFBFBD><EFBFBD> <EFBFBD>ϳ<EFBFBD><EFBFBD><EFBFBD> <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>. event ȿ<EFBFBD><EFBFBD><EFBFBD><EFBFBD> <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
|
|||
|
|
|||
|
pthread_cond_broadcast()
|
|||
|
|
|||
|
<EFBFBD><EFBFBD> <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ؾ<EFBFBD> <EFBFBD>Ѵ<EFBFBD>.
|
|||
|
|
|||
|
<EFBFBD>ܼ<EFBFBD><EFBFBD><EFBFBD> WakeCond() <EFBFBD>Լ<EFBFBD><EFBFBD><EFBFBD> WakeAllCond() <EFBFBD>Լ<EFBFBD><EFBFBD><EFBFBD> <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <EFBFBD>ִ<EFBFBD>.
|
|||
|
|
|||
|
-- 2009-10-25 23:05:00
|
|||
|
|
|||
|
<EFBFBD><EFBFBD> <EFBFBD><EFBFBD><EFBFBD><EFBFBD> <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <EFBFBD>ټ<EFBFBD><EFBFBD><EFBFBD> <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>尡 <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ϰ<EFBFBD> <EFBFBD>ִµ<EFBFBD>, signal <EFBFBD><EFBFBD> 2 ȸ <EFBFBD><EFBFBD><EFBFBD><EFBFBD>
|
|||
|
<EFBFBD><EFBFBD><EFBFBD><EFBFBD> <EFBFBD><EFBFBD><EFBFBD><EFBFBD> <EFBFBD><EFBFBD><EFBFBD>쿡, 2 <EFBFBD><EFBFBD> <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>尡 <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <EFBFBD><EFBFBD><EFBFBD><EFBFBD>ٰ<EFBFBD> <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <EFBFBD><EFBFBD> <EFBFBD><EFBFBD>
|
|||
|
<EFBFBD><EFBFBD>. signal 1 ȸ <EFBFBD><EFBFBD><EFBFBD>ÿ<EFBFBD> context switching <EFBFBD><EFBFBD> <EFBFBD>Ͼ<EFBFBD><EFBFBD> <EFBFBD><EFBFBD><EFBFBD> <EFBFBD><EFBFBD><EFBFBD><EFBFBD>
|
|||
|
<EFBFBD>尡 <EFBFBD><EFBFBD><EFBFBD><EFBFBD> <EFBFBD><EFBFBD><EFBFBD><EFBFBD> <EFBFBD><EFBFBD> <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>, <EFBFBD>ٽ<EFBFBD> <EFBFBD><EFBFBD><EFBFBD><EFBFBD> <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ѵٸ<EFBFBD>, 2 <EFBFBD><EFBFBD>°
|
|||
|
signal <EFBFBD><EFBFBD><EFBFBD><EFBFBD> <EFBFBD><EFBFBD> <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>尡 <EFBFBD><EFBFBD> <EFBFBD><EFBFBD><EFBFBD> <EFBFBD><EFBFBD> <EFBFBD>ִ<EFBFBD> <EFBFBD><EFBFBD><EFBFBD>̴<EFBFBD>.
|
|||
|
|
|||
|
-- 2009-10-26 13:18:00
|
|||
|
|
|||
|
//////////////////////////////////////////////////////////////////*/
|
|||
|
|
|||
|
template< typename TData=ZNsMain::ZCEmpty ///////
|
|||
|
>
|
|||
|
class ZtCEventCond : public ZtCMutexCondData<TData>
|
|||
|
{
|
|||
|
public:
|
|||
|
typedef ZtCMutexCondData<TData> ZCMutexCondData;
|
|||
|
public:
|
|||
|
int WakeCond(){return this->WakeAllCond();}
|
|||
|
public:
|
|||
|
};/*
|
|||
|
template< typename TData=ZNsMain::ZCEmpty ////////
|
|||
|
>
|
|||
|
class ZtCEventCond : public ZtCMutexCondData<TData>*/
|
|||
|
|
|||
|
|
|||
|
typedef ZtCEventCond<> CEventCond;
|
|||
|
|
|||
|
|
|||
|
#if defined(__USE_XOPEN2K) && !defined(__USE_MUTEX_COND_FOR_BARRIER__)
|
|||
|
|
|||
|
template< typename TData=ZNsMain::ZCEmpty
|
|||
|
>
|
|||
|
class ZtCBarrier : public TData ///////////
|
|||
|
{
|
|||
|
protected:
|
|||
|
bool mb_IsValidID;
|
|||
|
::pthread_barrier_t mh_BarrierID; // 0 <20><><EFBFBD><EFBFBD> <20>ʱ<EFBFBD>ȭ<EFBFBD><C8AD> <20><> <20><><EFBFBD><EFBFBD>.
|
|||
|
public :
|
|||
|
|
|||
|
ZtCBarrier()
|
|||
|
{
|
|||
|
mb_IsValidID=false;
|
|||
|
}/*
|
|||
|
ZtCBarrier()*/
|
|||
|
|
|||
|
bool IsValid() const{return mb_IsValidID;}
|
|||
|
|
|||
|
|
|||
|
/*/////////////////////////////////////////////////
|
|||
|
|
|||
|
<EFBFBD><EFBFBD> Init() <EFBFBD><EFBFBD> Fini() <EFBFBD><EFBFBD> <EFBFBD><EFBFBD><EFBFBD>ϰ<EFBFBD><EFBFBD><EFBFBD> <EFBFBD>ٷ<EFBFBD> <EFBFBD><EFBFBD><EFBFBD><EFBFBD>
|
|||
|
|
|||
|
if(CBarrierObj.Init(3)==ZNsEnum::ZEBarrier_OK)
|
|||
|
|
|||
|
<EFBFBD>̷<EFBFBD> <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <EFBFBD>Ѵ<EFBFBD>.
|
|||
|
|
|||
|
/////////////////////////////////////////////////*/
|
|||
|
|
|||
|
int Init(unsigned AI_Count, const ::pthread_barrierattr_t* AP_Attr=0)
|
|||
|
{
|
|||
|
#if(_CODE_OLD_)
|
|||
|
|
|||
|
if(mb_IsValidID==true)
|
|||
|
{
|
|||
|
::pthread_barrier_destroy(&mh_BarrierID); mb_IsValidID=false;
|
|||
|
}/*
|
|||
|
if(mb_IsValidID==true)*/
|
|||
|
|
|||
|
#endif // _CODE_OLD_
|
|||
|
|
|||
|
int VI_Return = ::pthread_barrier_init(&mh_BarrierID, AP_Attr, AI_Count);
|
|||
|
|
|||
|
if(VI_Return==ZNsEnum::ZEBarrier_OK) mb_IsValidID=true; return VI_Return;
|
|||
|
}/*
|
|||
|
int Init(unsigned AI_Count, const ::pthread_barrierattr_t* AP_Attr=0)*/
|
|||
|
|
|||
|
int Fini()
|
|||
|
{
|
|||
|
if(mb_IsValidID==false) return ZNsEnum::ZEBarrier_OK;
|
|||
|
|
|||
|
mb_IsValidID=false; return ::pthread_barrier_destroy(&mh_BarrierID);
|
|||
|
}/*
|
|||
|
int Fini()*/
|
|||
|
|
|||
|
|
|||
|
/*////////////////////////////////////////////////////////////////////////////
|
|||
|
|
|||
|
int pthread_barrier_wait(pthread_barrier_t *barrier);
|
|||
|
|
|||
|
RETURN VALUE
|
|||
|
Upon successful completion, the pthread_barrier_wait() function shall
|
|||
|
return PTHREAD_BARRIER_SERIAL_THREAD for a single (arbitrary) thread
|
|||
|
synchronized at the barrier and zero for each of the other threads.
|
|||
|
Otherwise, an error number shall be returned to indicate the error.
|
|||
|
|
|||
|
ERRORS
|
|||
|
The pthread_barrier_wait() function may fail if:
|
|||
|
|
|||
|
EINVAL The value specified by barrier does not refer to an initialized
|
|||
|
barrier object.
|
|||
|
|
|||
|
This function shall not return an error code of [EINTR].
|
|||
|
|
|||
|
The following sections are informative.
|
|||
|
|
|||
|
////////////////////////////////////////////////////////////////////////////*/
|
|||
|
|
|||
|
bool Wait()
|
|||
|
{
|
|||
|
return ::pthread_barrier_wait(&mh_BarrierID)!=ZNsEnum::ZEThread_Invalid;
|
|||
|
}/*
|
|||
|
bool Wait()*/
|
|||
|
|
|||
|
|
|||
|
// <20>Ʒ<EFBFBD> 2 <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD>쿡<EFBFBD><ECBFA1> <20><><EFBFBD><EFBFBD>.
|
|||
|
|
|||
|
bool GetShared(::pthread_barrierattr_t AH_BarrierAttr, int& ARRI_PShared)
|
|||
|
{
|
|||
|
return ::pthread_barrierattr_getpshared(&AH_BarrierAttr, &ARRI_PShared)==ZNsEnum::ZEThread_OK;
|
|||
|
}/*
|
|||
|
bool GetShared(::pthread_barrierattr_t AH_BarrierAttr, int& ARRI_PShared)*/
|
|||
|
|
|||
|
/* cf) PTHREAD_PROCESS_SHARED, PTHREAD_PROCESS_PRIVATE
|
|||
|
AI_PShared <EFBFBD><EFBFBD> PTHREAD_PROCESS_SHARED <EFBFBD><EFBFBD> <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ϴ<EFBFBD> <EFBFBD><EFBFBD><EFBFBD>쿡
|
|||
|
mh_BarrierID <EFBFBD><EFBFBD> <EFBFBD><EFBFBD><EFBFBD><EFBFBD> <EFBFBD><EFBFBD> <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ؾ<EFBFBD> <EFBFBD>Ѵ<EFBFBD>. */
|
|||
|
|
|||
|
bool SetShared(::pthread_barrierattr_t AH_BarrierAttr, int AI_PShared=PTHREAD_PROCESS_SHARED)
|
|||
|
{
|
|||
|
return ::pthread_barrierattr_setpshared(&AH_BarrierAttr, AI_PShared)==ZNsEnum::ZEThread_OK;
|
|||
|
}/*
|
|||
|
bool SetShared(::pthread_barrierattr_t AH_BarrierAttr, int AI_PShared=PTHREAD_PROCESS_SHARED)*/
|
|||
|
|
|||
|
public:
|
|||
|
};/*
|
|||
|
template< typename TData=ZNsMain::ZCEmpty
|
|||
|
>
|
|||
|
class ZtCBarrier : public TData /////////*/
|
|||
|
|
|||
|
|
|||
|
#else // !defined(__USE_XOPEN2K) || defined(__USE_MUTEX_COND_FOR_BARRIER__)
|
|||
|
|
|||
|
|
|||
|
template< typename TData=ZNsMain::ZCEmpty
|
|||
|
>
|
|||
|
class ZtCBarrier : public TData ///////////
|
|||
|
{
|
|||
|
public :
|
|||
|
typedef ZtCMutexCondData<> ZCMutexCondData;
|
|||
|
protected:
|
|||
|
ZCMutexCondData mo_CCondData;
|
|||
|
bool mb_IsValidID;
|
|||
|
int mi_WaitCount;
|
|||
|
public :
|
|||
|
|
|||
|
ZtCBarrier():mi_WaitCount(0){mb_IsValidID=false;}
|
|||
|
|
|||
|
bool IsValid() const{return mb_IsValidID;}
|
|||
|
|
|||
|
|
|||
|
/*//////////////////////////////////////////////////
|
|||
|
|
|||
|
<EFBFBD><EFBFBD> Init() <EFBFBD><EFBFBD> Fini() <EFBFBD><EFBFBD> <EFBFBD><EFBFBD><EFBFBD>ϰ<EFBFBD><EFBFBD><EFBFBD> <EFBFBD>ٷ<EFBFBD> <EFBFBD><EFBFBD><EFBFBD><EFBFBD>
|
|||
|
|
|||
|
if(CBarrierObj.Init(3)==ZNsEnum::ZEBarrier_OK)
|
|||
|
|
|||
|
<EFBFBD><EFBFBD> <EFBFBD><EFBFBD><EFBFBD>·<EFBFBD> <EFBFBD>Ѵ<EFBFBD>.
|
|||
|
|
|||
|
//////////////////////////////////////////////////*/
|
|||
|
|
|||
|
int Init(unsigned AI_Count)
|
|||
|
{
|
|||
|
if(mb_IsValidID==true)
|
|||
|
{
|
|||
|
mo_CCondData.FiniCond(); mb_IsValidID=false;
|
|||
|
}/*
|
|||
|
if(mb_IsValidID==true)*/
|
|||
|
|
|||
|
mi_WaitCount=AI_Count;
|
|||
|
|
|||
|
int VI_Return = mo_CCondData.InitCond();
|
|||
|
|
|||
|
if(VI_Return==ZNsEnum::ZEThread_OK)
|
|||
|
{
|
|||
|
mb_IsValidID=true; return ZNsEnum::ZEThread_OK;
|
|||
|
}/*
|
|||
|
if(VI_Return==ZNsEnum::ZEThread_OK)*/
|
|||
|
|
|||
|
return ZNsEnum::ZEBarrier_NO;
|
|||
|
}/*
|
|||
|
int Init(unsigned AI_Count)*/
|
|||
|
|
|||
|
int Fini()
|
|||
|
{
|
|||
|
if(mb_IsValidID==false) return ZNsEnum::ZEThread_OK;
|
|||
|
|
|||
|
mb_IsValidID=false;
|
|||
|
mi_WaitCount=0 ;
|
|||
|
|
|||
|
return (mo_CCondData.FiniCond()==ZNsEnum::ZEThread_OK) ?
|
|||
|
ZNsEnum::ZEBarrier_OK : ZNsEnum::ZEBarrier_NO ;
|
|||
|
}/*
|
|||
|
int Fini()*/
|
|||
|
|
|||
|
bool Wait()
|
|||
|
{
|
|||
|
bool VB_IsOK=false;
|
|||
|
|
|||
|
mo_CCondData.Lock();
|
|||
|
{
|
|||
|
if(--mi_WaitCount<=0)
|
|||
|
VB_IsOK=(mo_CCondData.WakeAllCond()==ZNsEnum::ZEThread_OK);
|
|||
|
else
|
|||
|
VB_IsOK=(mo_CCondData.WaitCond ()==ZNsEnum::ZEThread_OK);
|
|||
|
//else
|
|||
|
}
|
|||
|
mo_CCondData.UnLock();
|
|||
|
|
|||
|
return VB_IsOK;
|
|||
|
}/*
|
|||
|
bool Wait()*/
|
|||
|
|
|||
|
public:
|
|||
|
};/*
|
|||
|
template< typename TData=ZNsMain::ZCEmpty
|
|||
|
>
|
|||
|
class ZtCBarrier : public TData /////////*/
|
|||
|
|
|||
|
#endif // !defined(__USE_XOPEN2K) || defined(__USE_MUTEX_COND_FOR_BARRIER__)
|
|||
|
|
|||
|
|
|||
|
typedef ZCSpinLockEasy ZCFastLockEasy;
|
|||
|
|
|||
|
}/*
|
|||
|
namespace ZNsMain*/
|
|||
|
|
|||
|
|
|||
|
|
|||
|
#ifdef __INC_GLIB_ATOMIC_EXCHANGE__
|
|||
|
|
|||
|
|
|||
|
#include <glib/gatomic.h>
|
|||
|
|
|||
|
|
|||
|
namespace ZNsMain
|
|||
|
{
|
|||
|
|
|||
|
/*///////////////////////////////////////////////////////
|
|||
|
|
|||
|
<EFBFBD><EFBFBD> class ZtCAtomicIntSync<>
|
|||
|
|
|||
|
Ŀ<EFBFBD><EFBFBD><EFBFBD>̳<EFBFBD> <EFBFBD><EFBFBD><EFBFBD>̺귯<EFBFBD><EFBFBD><EFBFBD><EFBFBD> <EFBFBD><EFBFBD><EFBFBD><EFBFBD>ȭ object <EFBFBD><EFBFBD> <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <EFBFBD>ʰ<EFBFBD>
|
|||
|
<EFBFBD><EFBFBD><EFBFBD><EFBFBD>ȭ<EFBFBD><EFBFBD> <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ϰ<EFBFBD> <EFBFBD><EFBFBD><EFBFBD><EFBFBD> <EFBFBD><EFBFBD><EFBFBD>쿡 <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ϴ<EFBFBD> Ŭ<EFBFBD><EFBFBD><EFBFBD><EFBFBD> <EFBFBD><EFBFBD><EFBFBD>ø<EFBFBD>.
|
|||
|
volatile gint <EFBFBD><EFBFBD> <EFBFBD><EFBFBD><EFBFBD><EFBFBD> <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <EFBFBD>̿<EFBFBD><EFBFBD>ϰ<EFBFBD> <EFBFBD>ִ<EFBFBD>.
|
|||
|
|
|||
|
<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> lock-free <EFBFBD><EFBFBD>.
|
|||
|
|
|||
|
<EFBFBD><EFBFBD> int sched_yield(void) : IN <sched.h>
|
|||
|
|
|||
|
A process can relinquish the processor voluntarily
|
|||
|
without blocking by calling sched_yield().
|
|||
|
The process will then be moved to the end of the queue
|
|||
|
for its static priority and a new process gets to run.
|
|||
|
|
|||
|
Note: If the current process is the only process
|
|||
|
in the highest priority list at that time,
|
|||
|
this process will continue
|
|||
|
to run after a call to sched_yield().
|
|||
|
|
|||
|
POSIX systems on which sched_yield() is available define _POSIX_PRIORITY_SCHEDULING in <unistd.h>.
|
|||
|
|
|||
|
RETURN VALUE
|
|||
|
|
|||
|
On success, sched_yield() returns 0.
|
|||
|
On error, -1 is returned, and errno is set appropriately.
|
|||
|
|
|||
|
<EFBFBD><EFBFBD> <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> atomic <EFBFBD><EFBFBD><EFBFBD><EFBFBD> <EFBFBD>Լ<EFBFBD><EFBFBD><EFBFBD> <EFBFBD>Ʒ<EFBFBD> <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <EFBFBD><EFBFBD>ȸ<EFBFBD><EFBFBD> <EFBFBD><EFBFBD> <EFBFBD>ִ<EFBFBD>.
|
|||
|
|
|||
|
find /usr/include/ | xargs grep 'atomic' | grep 'add' # or
|
|||
|
find /usr/include/ | xargs grep 'atomic' | grep 'increment'
|
|||
|
|
|||
|
<EFBFBD><EFBFBD> memory barrier <EFBFBD><EFBFBD><EFBFBD><EFBFBD> <EFBFBD>ڵ<EFBFBD><EFBFBD><EFBFBD> <EFBFBD>Ʒ<EFBFBD><EFBFBD><EFBFBD> <EFBFBD><EFBFBD><EFBFBD><EFBFBD>.
|
|||
|
|
|||
|
[root@localhost ~]# find /usr/include/ | xargs grep -n 'MEM_BARRIER' | more
|
|||
|
|
|||
|
/usr/include/c++/4.1.1/tr1/boost_shared_ptr.h:155: _GLIBCXX_READ_MEM_BARRIER;
|
|||
|
/usr/include/c++/4.1.1/tr1/boost_shared_ptr.h:156: _GLIBCXX_WRITE_MEM_BARRIER;
|
|||
|
/usr/include/c++/4.1.1/tr1/boost_shared_ptr.h:175: _GLIBCXX_READ_MEM_BARRIER;
|
|||
|
/usr/include/c++/4.1.1/tr1/boost_shared_ptr.h:176: _GLIBCXX_WRITE_MEM_BARRIER;
|
|||
|
/usr/include/c++/4.1.1/x86_64-redhat-linux/bits/atomic_word.h:42:// #define _GLIBCXX_READ_MEM_BARRIER __asm __volatile ("":::"memory")
|
|||
|
/usr/include/c++/4.1.1/x86_64-redhat-linux/bits/atomic_word.h:46:// #define _GLIBCXX_WRITE_MEM_BARRIER __asm __volatile ("":::"memory")
|
|||
|
/usr/include/c++/4.1.1/bits/atomicity.h:53:#ifndef _GLIBCXX_READ_MEM_BARRIER
|
|||
|
/usr/include/c++/4.1.1/bits/atomicity.h:54:#define _GLIBCXX_READ_MEM_BARRIER __asm __volatile ("":::"memory")
|
|||
|
/usr/include/c++/4.1.1/bits/atomicity.h:56:#ifndef _GLIBCXX_WRITE_MEM_BARRIER
|
|||
|
/usr/include/c++/4.1.1/bits/atomicity.h:57:#define _GLIBCXX_WRITE_MEM_BARRIER __asm __volatile ("":::"memory")
|
|||
|
|
|||
|
<EFBFBD><EFBFBD> glib <EFBFBD><EFBFBD> <EFBFBD>ִ<EFBFBD> <EFBFBD>Ʒ<EFBFBD> <EFBFBD>Լ<EFBFBD><EFBFBD><EFBFBD> <EFBFBD>̿<EFBFBD><EFBFBD>Ѵ<EFBFBD>. (glib <EFBFBD><EFBFBD> gtk+ <EFBFBD><EFBFBD> <EFBFBD><EFBFBD><EFBFBD>̺귯<EFBFBD><EFBFBD><EFBFBD>̴<EFBFBD>.)
|
|||
|
|
|||
|
gboolean g_atomic_int_compare_and_exchange
|
|||
|
(
|
|||
|
volatile gint *atomic,
|
|||
|
gint oldval ,
|
|||
|
gint newval
|
|||
|
);
|
|||
|
//gboolean g_atomic_int_compare_and_exchange
|
|||
|
|
|||
|
Compares oldval with the integer pointed to by atomic and if they are equal,
|
|||
|
atomically exchanges *atomic with newval. Also acts as a memory barrier.
|
|||
|
|
|||
|
Returns : TRUE, if *atomic was equal oldval. FALSE otherwise
|
|||
|
|
|||
|
<EFBFBD><EFBFBD> <EFBFBD>Ʒ<EFBFBD> <EFBFBD>Լ<EFBFBD><EFBFBD><EFBFBD> <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ѵ<EFBFBD>.
|
|||
|
|
|||
|
gboolean g_atomic_pointer_compare_and_exchange
|
|||
|
(
|
|||
|
volatile gpointer *atomic,
|
|||
|
gpointer oldval,
|
|||
|
gpointer newval
|
|||
|
);
|
|||
|
//gboolean g_atomic_pointer_compare_and_exchange
|
|||
|
|
|||
|
<EFBFBD><EFBFBD> -- 2010-04-03 18:05:00
|
|||
|
|
|||
|
<EFBFBD><EFBFBD> <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <EFBFBD><EFBFBD><EFBFBD> ZtCAtomicIntSync<> <EFBFBD><EFBFBD> <EFBFBD><EFBFBD><EFBFBD><EFBFBD>ȭ object <EFBFBD><EFBFBD> <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ؼ<EFBFBD>
|
|||
|
(<EFBFBD><EFBFBD><EFBFBD>̰<EFBFBD>) <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ǵ<EFBFBD> <EFBFBD><EFBFBD><EFBFBD><EFBFBD>, ZtCAtomicIntSync<>::TypeSync Ÿ<EFBFBD><EFBFBD><EFBFBD><EFBFBD> <EFBFBD><EFBFBD><EFBFBD>ؼ<EFBFBD>
|
|||
|
<EFBFBD> <EFBFBD><EFBFBD><EFBFBD><EFBFBD>ȭ object <EFBFBD><EFBFBD> <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ߴ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <EFBFBD><EFBFBD>Ÿ<EFBFBD><EFBFBD> <EFBFBD><EFBFBD><EFBFBD>̴<EFBFBD>.
|
|||
|
|
|||
|
-- 2010-04-17 21:29:00
|
|||
|
|
|||
|
<EFBFBD><EFBFBD> <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> alsa/iatomic.h <EFBFBD><EFBFBD> atomic <EFBFBD><EFBFBD><EFBFBD><EFBFBD> <EFBFBD>Լ<EFBFBD><EFBFBD><EFBFBD> <EFBFBD>ֱ<EFBFBD><EFBFBD><EFBFBD> <EFBFBD>ѵ<EFBFBD>,
|
|||
|
glib <EFBFBD><EFBFBD> g_atomic_int_compare_and_exchange() <EFBFBD><EFBFBD> <EFBFBD>ش<EFBFBD><EFBFBD>ϴ<EFBFBD> <EFBFBD>Լ<EFBFBD><EFBFBD><EFBFBD> <EFBFBD><EFBFBD><EFBFBD><EFBFBD>.
|
|||
|
|
|||
|
-- 2011-06-19 22:49:00
|
|||
|
|
|||
|
<EFBFBD><EFBFBD> (<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> centos)alsa/iatomic.h <EFBFBD><EFBFBD><EFBFBD><EFBFBD> atomic_add(), atomic_sub() <EFBFBD><EFBFBD><EFBFBD><EFBFBD> <EFBFBD>Լ<EFBFBD><EFBFBD><EFBFBD> <EFBFBD><EFBFBD> <EFBFBD><EFBFBD> <EFBFBD>ִ<EFBFBD>.
|
|||
|
|
|||
|
static __inline__ void atomic_add(int i, atomic_t *v)
|
|||
|
{
|
|||
|
__asm__ __volatile__(
|
|||
|
ATOMIC_SMP_LOCK "addl %1,%0"
|
|||
|
:"=m" (v->counter)
|
|||
|
:"ir" (i), "m" (v->counter));
|
|||
|
}
|
|||
|
|
|||
|
static __inline__ void atomic_sub(int i, atomic_t *v)
|
|||
|
{
|
|||
|
__asm__ __volatile__(
|
|||
|
ATOMIC_SMP_LOCK "subl %1,%0"
|
|||
|
:"=m" (v->counter)
|
|||
|
:"ir" (i), "m" (v->counter));
|
|||
|
}
|
|||
|
|
|||
|
-- 2013-06-09 00:16:00
|
|||
|
|
|||
|
///////////////////////////////////////////////////////*/
|
|||
|
|
|||
|
|
|||
|
template< typename TTypeBase=ZNsMain::ZCEmpty
|
|||
|
>
|
|||
|
class ZtCAtomicIntSync : public TTypeBase
|
|||
|
{
|
|||
|
public :
|
|||
|
typedef ZtCAtomicIntSync TypeSync;
|
|||
|
public :
|
|||
|
enum{ZEUseAtomicInt=1};
|
|||
|
public :
|
|||
|
|
|||
|
enum ZESync
|
|||
|
{
|
|||
|
ZESync_Lock =0,
|
|||
|
ZESync_UnLock=1
|
|||
|
};/*
|
|||
|
enum ZESync*/
|
|||
|
|
|||
|
private:
|
|||
|
volatile gint mi_SyncState;
|
|||
|
public :
|
|||
|
|
|||
|
ZtCAtomicIntSync()
|
|||
|
{
|
|||
|
mi_SyncState=ZESync_UnLock;
|
|||
|
}/*
|
|||
|
ZtCAtomicIntSync()*/
|
|||
|
|
|||
|
ZtCAtomicIntSync(const TTypeBase& rhs) : TTypeBase(rhs)
|
|||
|
{
|
|||
|
mi_SyncState=ZESync_UnLock;
|
|||
|
}/*
|
|||
|
ZtCAtomicIntSync(const TTypeBase& rhs)*/
|
|||
|
|
|||
|
ZtCAtomicIntSync(const ZtCAtomicIntSync& rhs) : TTypeBase(rhs)
|
|||
|
{
|
|||
|
mi_SyncState=ZESync_UnLock;
|
|||
|
}/*
|
|||
|
ZtCAtomicIntSync(const ZtCAtomicIntSync& rhs)*/
|
|||
|
|
|||
|
ZtCAtomicIntSync& operator=(const TTypeBase& rhs)
|
|||
|
{
|
|||
|
this->TTypeBase::operator=(rhs); return *this;
|
|||
|
}/*
|
|||
|
ZtCAtomicIntSync& operator=(const TTypeBase& rhs)*/
|
|||
|
|
|||
|
ZtCAtomicIntSync& operator=(const ZtCAtomicIntSync& rhs)
|
|||
|
{
|
|||
|
this->TTypeBase::operator=(rhs); return *this;
|
|||
|
}/*
|
|||
|
ZtCAtomicIntSync& operator=(const ZtCAtomicIntSync& rhs)*/
|
|||
|
|
|||
|
void Lock()
|
|||
|
{
|
|||
|
#define __INTERLOCKED_COMP_EXCHANGE__ \
|
|||
|
::g_atomic_int_compare_and_exchange(&mi_SyncState, ZESync_UnLock, ZESync_Lock)
|
|||
|
|
|||
|
while(__INTERLOCKED_COMP_EXCHANGE__==FALSE)
|
|||
|
{
|
|||
|
// <20><><EFBFBD><EFBFBD> Lock <20><> <20>ɷ<EFBFBD> <20>ִ<EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD>̴<EFBFBD>.
|
|||
|
|
|||
|
::sched_yield();
|
|||
|
}/*
|
|||
|
while(__INTERLOCKED_COMP_EXCHANGE__==FALSE)*/
|
|||
|
|
|||
|
#undef __INTERLOCKED_COMP_EXCHANGE__
|
|||
|
}/*
|
|||
|
void Lock()*/
|
|||
|
|
|||
|
void UnLock()
|
|||
|
{
|
|||
|
mi_SyncState=ZESync_UnLock;
|
|||
|
}/*
|
|||
|
void UnLock()*/
|
|||
|
|
|||
|
public:
|
|||
|
};/*
|
|||
|
template< typename TTypeBase=ZNsMain::ZCEmpty
|
|||
|
>
|
|||
|
class ZtCAtomicIntSync : public TTypeBase ///*/
|
|||
|
|
|||
|
}/*
|
|||
|
namespace ZNsMain */
|
|||
|
|
|||
|
|
|||
|
#else // !__INC_GLIB_ATOMIC_EXCHANGE__
|
|||
|
|
|||
|
|
|||
|
namespace ZNsMain
|
|||
|
{
|
|||
|
|
|||
|
template< typename TTypeBase=ZNsMain::ZCEmpty
|
|||
|
>
|
|||
|
class ZtCAtomicIntSync : public TTypeBase
|
|||
|
{
|
|||
|
public :
|
|||
|
typedef ZCThreadMutexEasy TypeSync;
|
|||
|
public :
|
|||
|
enum{ZEUseAtomicInt=0};
|
|||
|
private:
|
|||
|
TypeSync mo_CSyncEasy;
|
|||
|
public :
|
|||
|
|
|||
|
ZtCAtomicIntSync()
|
|||
|
{
|
|||
|
}/*
|
|||
|
ZtCAtomicIntSync()*/
|
|||
|
|
|||
|
ZtCAtomicIntSync(const TTypeBase& rhs) : TTypeBase(rhs)
|
|||
|
{
|
|||
|
}/*
|
|||
|
ZtCAtomicIntSync(const TTypeBase& rhs)*/
|
|||
|
|
|||
|
ZtCAtomicIntSync(const ZtCAtomicIntSync& rhs) : TTypeBase(rhs)
|
|||
|
{
|
|||
|
}/*
|
|||
|
ZtCAtomicIntSync(const ZtCAtomicIntSync& rhs)*/
|
|||
|
|
|||
|
ZtCAtomicIntSync& operator=(const TTypeBase& rhs)
|
|||
|
{
|
|||
|
}/*
|
|||
|
ZtCAtomicIntSync& operator=(const TTypeBase& rhs)*/
|
|||
|
|
|||
|
ZtCAtomicIntSync& operator=(const ZtCAtomicIntSync& rhs)
|
|||
|
{
|
|||
|
this->TTypeBase::operator=(rhs); return *this;
|
|||
|
}/*
|
|||
|
ZtCAtomicIntSync& operator=(const ZtCAtomicIntSync& rhs)*/
|
|||
|
|
|||
|
void Lock()
|
|||
|
{
|
|||
|
mo_CSyncEasy.Lock();
|
|||
|
}/*
|
|||
|
void Lock()*/
|
|||
|
|
|||
|
void UnLock()
|
|||
|
{
|
|||
|
mo_CSyncEasy.UnLock();
|
|||
|
}/*
|
|||
|
void UnLock()*/
|
|||
|
|
|||
|
public:
|
|||
|
};/*
|
|||
|
template< typename TTypeBase=ZNsMain::ZCEmpty
|
|||
|
>
|
|||
|
class ZtCAtomicIntSync : public TTypeBase ///*/
|
|||
|
|
|||
|
}/*
|
|||
|
namespace ZNsMain */
|
|||
|
|
|||
|
|
|||
|
#endif //!__INC_GLIB_ATOMIC_EXCHANGE__
|
|||
|
|
|||
|
|
|||
|
#endif //__ZCPPMAIN__PROCESS_LINUX_H__
|