Files
RepoMain/ZCppMain/ZCProcess_Linux.H

4679 lines
149 KiB
C++
Raw Normal View History

#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__