const char VERSION[] = "vers. 1.03";
// ΠΈΠΌΡ, ΠΏΠΎΠ΄ ΠΊΠΎΡΠΎΡΡΠΌ Π±ΡΠ΄Π΅Ρ ΡΠ΅Π³ΠΈΡΡΡΠΈΡΠΎΠ²Π°ΡΡΡΡ Π² ΠΏΡΠΎΡΡΡΠ°Π½ΡΡΠ²Π΅
// ΠΈΠΌΠ΅Π½ Π½Π°Ρ ΡΠ΅ΡΡΠΎΠ²ΡΠΉ ΠΌΠ΅Π½Π΅Π΄ΠΆΠ΅Ρ ΡΠ΅ΡΡΡΡΠ°
static const char DEVNAME[_POSIX_PATH_MAX] = "/dev/srr";
// "Π±Π°Π·ΠΎΠ²Π°Ρ ΡΠ°ΡΡΡ" ΠΊΠΎΠΌΠ°Π½Π΄Ρ devctl(), ΠΊΠΎΠ½ΠΊΡΠ΅ΡΠ½ΡΠΉ ΠΊΠΎΠ΄ ΠΊΠΎΠΌΠ°Π½Π΄Ρ Π±ΡΠ΄Π΅Ρ
// ΡΠΎΡΠΌΠΈΡΠΎΠ²Π°ΡΡΡΡ Π΄ΠΈΠ½Π°ΠΌΠΈΡΠ΅ΡΠΊΠΈ Π½Π° ΠΎΡΠ½ΠΎΠ²Π΅ ΡΡΠΎΠΉ ΡΠ°ΡΡΠΈ, Π½ΠΎ ΠΈΡΡ ΠΎΠ΄Ρ
// ΠΈΠ· ΡΠ°ΠΊΡΠΈΡΠ΅ΡΠΊΠΎΠΉ Π΄Π»ΠΈΠ½Ρ Π±Π»ΠΎΠΊΠ° ΠΏΠ΅ΡΠ΅Π΄Π°Π²Π°Π΅ΠΌΡΡ Π΄Π°Π½Π½ΡΡ
const unsigned int DCMD_CMD = 1,
DCMD_SRR = _POSIX_DEVDIR_TOFROM + (_DCMD_NET << 8) + DCMD_CMD;
// ΡΡΡΡΠΊΡΡΡΠ° ΠΎΡΠ²Π΅ΡΠΎΠ² ΠΌΠ΅Π½Π΅Π΄ΠΆΠ΅ΡΠ° ΡΠ΅ΡΡΡΡΠ° ΠΏΠΎ Π·Π°ΠΏΡΠΎΡΡ read()
struct result {
pid_t pid;
int chid;
uint64_t cps;
result(void) {
pid = getpid();
// Π΅ΡΠ»ΠΈ ΡΠΆ Π²ΠΎΠ·Π²ΡΠ°ΡΠ°ΡΡ, ΡΠΎ ΠΈ ΡΠ»ΡΠΆΠ΅Π±Π½ΡΡ ΠΈΠ½ΡΠΎΡΠΌΠ°ΡΠΈΡ ;)
cps = SYSPAGE_ENTRY(qtime)->cycles_per_sec;
}
}
// Π·Π°Π²Π΅ΡΡΠ΅Π½ΠΈΠ΅ Ρ ΠΈΠ·Π²Π΅ΡΠ΅Π½ΠΈΠ΅ΠΌ ΠΊΠΎΠ΄Π° ΠΏΡΠΈΡΠΈΠ½Ρ
inline void exit(const char *msg) {
cout << '\r';
perror(msg);
exit(EXIT_FAILURE);
}
Π ΡΡΠΎΠΉ ΡΠ°ΡΡΠΈ ΠΊΠ°ΠΊΠΈΡ -Π»ΠΈΠ±ΠΎ ΠΊΠΎΠΌΠΌΠ΅Π½ΡΠ°ΡΠΈΠ΅Π² Π·Π°ΡΠ»ΡΠΆΠΈΠ²Π°Π΅Ρ ΡΠ°Π·Π²Π΅ ΡΡΠΎ ΡΡΡΡΠΊΡΡΡΠ° result. ΠΠ°Ρ ΡΠ΅ΡΠ²Π΅Ρ ΡΡΡΡΠΎΠ΅Π½ Β«Π½Π°ΠΎΠ±ΠΎΡΠΎΡΒ»: ΠΈΠ½ΡΠΎΡΠΌΠ°ΡΠΈΠΎΠ½Π½ΡΠΉ ΠΎΠ±ΠΌΠ΅Π½ Π΄Π°Π½Π½ΡΠΌΠΈ ΠΎΠ½ ΠΎΡΡΡΠ΅ΡΡΠ²Π»ΡΠ΅Ρ ΠΏΠΎ Π·Π°ΠΏΡΠΎΡΡ devctl(), Π·Π°ΠΏΡΠΎΡ read() Π½Π°ΠΌ Β«Π½Π΅ Π½ΡΠΆΠ΅Π½Β», ΠΈ ΠΌΡ ΠΈΡΠΏΠΎΠ»ΡΠ·ΡΠ΅ΠΌ Π΅Π³ΠΎ ΡΠΎΠ»ΡΠΊΠΎ Π΄Π»Ρ Π²ΠΎΠ·Π²ΡΠ°ΡΠ° ΠΈΠ½ΡΠΎΡΠΌΠ°ΡΠΈΠΈ (PID + CHID) ΠΎΠ± Π°Π²ΡΠΎΠ½ΠΎΠΌΠ½ΠΎΠΌ ΠΊΠ°Π½Π°Π»Π΅ ΠΎΠ±ΠΌΠ΅Π½Π° ΡΠΎΠΎΠ±ΡΠ΅Π½ΠΈΡΠΌΠΈ. ΠΠ°ΠΎΠ΄Π½ΠΎ ΠΌΡ ΠΏΠ΅ΡΠ΅Π΄Π°Π΅ΠΌ Π² ΠΏΠΎΠ»Π΅ cps ΡΡΠΎΠΉ ΡΡΡΡΠΊΡΡΡΡ Π·Π½Π°ΡΠ΅Π½ΠΈΠ΅ ΡΠ°ΠΊΡΠΎΠ²ΠΎΠΉ ΡΠ°ΡΡΠΎΡΡ ΠΏΡΠΎΡΠ΅ΡΡΠΎΡΠ° ΡΠ΅ΡΠ²Π΅ΡΠ°, ΡΡΠΎ ΠΏΠΎΠ·Π²ΠΎΠ»ΡΠ΅Ρ Π·Π½Π°ΡΡ, Β«Ρ ΠΊΠ΅ΠΌ ΠΌΡ ΠΈΠΌΠ΅Π΅ΠΌ Π΄Π΅Π»ΠΎΒ» ΠΏΡΠΈ ΡΠΊΡΠΏΠ΅ΡΠΈΠΌΠ΅Π½ΡΠ°Ρ Π² ΡΠ΅ΡΠΈ.
Π’Π΅ΠΏΠ΅ΡΡ ΠΌΡ Π²ΠΏΠΎΠ»Π½Π΅ Π³ΠΎΡΠΎΠ²Ρ Π½Π°ΠΏΠΈΡΠ°ΡΡ ΠΊΠΎΠ΄ ΡΠ΅ΡΠ²Π΅ΡΠ°. ΠΡΠΎΡ ΡΠ΅ΡΠ²Π΅Ρ (ΡΠ°ΠΉΠ» srv.cc), Π² ΠΎΡΠ»ΠΈΡΠΈΠ΅ ΠΎΡ ΡΡΠ°Π΄ΠΈΡΠΈΠΎΠ½Π½ΡΡ , ΠΈΠΌΠ΅Π΅Ρ Π΄Π²Π° Π½Π΅Π·Π°Π²ΠΈΡΠΈΠΌΡΡ ΠΊΠ°Π½Π°Π»Π° ΠΏΠΎΠ΄ΠΊΠ»ΡΡΠ΅Π½ΠΈΡ: ΠΊΠ°ΠΊ ΠΌΠ΅Π½Π΅Π΄ΠΆΠ΅Ρ ΡΠ΅ΡΡΡΡΠΎΠ² ΠΈ ΠΊΠ°ΠΊ ΡΠ΅ΡΠ²Π΅Ρ ΠΏΡΠΎΡΡΠΎΠ³ΠΎ ΠΎΠ±ΠΌΠ΅Π½Π° ΡΠΎΠΎΠ±ΡΠ΅Π½ΠΈΡΠΌΠΈ. ΠΠ°ΠΊ ΠΌΠ΅Π½Π΅Π΄ΠΆΠ΅Ρ ΠΎΠ½ ΠΏΠΎ Π·Π°ΠΏΡΠΎΡΡ read() Π²ΠΎΠ·Π²ΡΠ°ΡΠ°Π΅Ρ Π°Π΄ΡΠ΅ΡΠ½ΡΠ΅ ΠΊΠΎΠΌΠΏΠΎΠ½Π΅Π½ΡΡ (PID, CHID) Π΄Π»Ρ ΠΎΠ±ΠΌΠ΅Π½Π° ΡΠΎΠΎΠ±ΡΠ΅Π½ΠΈΡΠΌΠΈ (ND ΠΊΠ»ΠΈΠ΅Π½Ρ Π΄ΠΎΠ»ΠΆΠ΅Π½ Π²ΠΎΡΡΡΠ°Π½ΠΎΠ²ΠΈΡΡ ΡΠ°ΠΌΠΎΡΡΠΎΡΡΠ΅Π»ΡΠ½ΠΎ). ΠΠΎ Π·Π°ΠΏΡΠΎΡΡ devctl(), Π° ΡΠ°ΠΊΠΆΠ΅ ΠΏΠΎ Π·Π°ΠΏΡΠΎΡΡ ΠΏΠΎ Π°Π²ΡΠΎΠ½ΠΎΠΌΠ½ΠΎΠΌΡ ΠΊΠ°Π½Π°Π»Ρ ΠΎΠ±ΠΌΠ΅Π½Π° ΡΠΎΠΎΠ±ΡΠ΅Π½ΠΈΡΠΌΠΈ ΡΠ΅ΡΠ²Π΅Ρ ΠΏΡΠΎΡΡΠΎ ΡΠ΅ΡΡΠ°Π½ΡΠ»ΠΈΡΡΠ΅Ρ ΠΎΠ±ΡΠ°ΡΠ½ΠΎ ΠΏΠΎΠ»ΡΡΠ΅Π½Π½ΡΠΉ ΠΎΡ ΠΊΠ»ΠΈΠ΅Π½ΡΠ° Π±Π»ΠΎΠΊ Π΄Π°Π½Π½ΡΡ (Π² ΠΊΠ°ΠΊΠΎΠΌ-ΡΠΎ ΡΠΌΡΡΠ»Π΅ ΠΏΠΎ ΠΎΠ±ΠΎΠΈΠΌ ΠΊΠ°Π½Π°Π»Π°ΠΌ ΠΎΠ±ΠΌΠ΅Π½Π° Π½Π°Ρ ΡΠ΅ΡΠ²Π΅Ρ ΡΠ²Π»ΡΠ΅ΡΡΡ Β«Π·Π΅ΡΠΊΠ°Π»ΠΎΠΌΒ», ΠΎΡΡΠ°ΠΆΠ°ΡΡΠΈΠΌ Π΄Π°Π½Π½ΡΠ΅).
Π‘Π΅ΡΠ²Π΅Ρ Π·Π°ΠΏΡΠΎΡΠΎΠ²result data;
//---------------------------------------------------------
// ΡΠ΅Π°Π»ΠΈΠ·Π°ΡΠΈΡ ΠΎΠ±ΡΠ°Π±ΠΎΡΡΠΈΠΊΠ° read()
static int readfunc(resmgr_context_t *ctp, io_read_t *msg,
iofunc_ocb_t *ocb) {
int sts = iofunc_read_verify(ctp, msg, ocb, NULL);
if (sts != EOK) return sts;
// Π²ΠΎΠ·Π²ΡΠ°ΡΠ°ΡΡ ΠΎΠ΄Π½ΠΈ ΠΈ ΡΠ΅ ΠΆΠ΅ ΡΡΠ°ΡΠΈΡΠ΅ΡΠΊΠΈΠ΅ Π΄Π°Π½Π½ΡΠ΅...
MsgReply(ctp->rcvid, sizeof(result), &data, sizeof(result));
return _RESMGR_NOREPLY;
}
//---------------------------------------------------------
// ΡΠ΅Π°Π»ΠΈΠ·Π°ΡΠΈΡ ΠΎΠ±ΡΠ°Π±ΠΎΡΡΠΈΠΊΠ° devctl.
static int devctlfunc(resmgr_context_t *ctp, io_devctl_t *msg,
iofunc_ocb_t *ocb) {
int sts = iofunc_devctl_default(ctp, msg, ocb);
if (sts != _RESMGR_DEFAULT) return sts;
// ΡΠ°Π·Π±ΠΎΡ Π΄ΠΈΠ½Π°ΠΌΠΈΡΠ΅ΡΠΊΠΈ ΡΠΎΠ·Π΄Π°Π²Π°Π΅ΠΌΠΎΠ³ΠΎ ΠΊΠΎΠ΄Π° devctl(),
// ΠΈΠ·Π²Π»Π΅ΡΠ΅Π½ΠΈΠ΅ ΠΈΠ· Π½Π΅Π³ΠΎ Π΄Π»ΠΈΠ½Ρ ΠΏΡΠΈΠ½ΡΡΠΎΠ³ΠΎ Π±Π»ΠΎΠΊΠ°
unsigned int nbytes = (msg->i.dcmd - DCMD_SRR) >> 16;
msg->o.nbytes = nbytes;
// ΠΈ ΡΡΡ ΠΆΠ΅ ΡΠ΅ΡΡΠ°Π½ΡΠ»ΡΡΠΈΡ Π±Π»ΠΎΠΊΠ° Π½Π°Π·Π°Π΄
return _RESMGR_PTR(ctp, &msg->i, sizeof(msg->i) + nbytes);
}
//---------------------------------------------------------
// ΡΡΡΠ°Π½ΠΎΠ²ΠΊΠ° ΠΎΠ΄Π½ΠΎΠΏΠΎΡΠΎΡΠ½ΠΎΠ³ΠΎ ΠΌΠ΅Π½Π΅Π΄ΠΆΠ΅ΡΠ°, Π²ΡΠΏΠΎΠ»Π½ΡΠ΅ΠΌΠ°Ρ
// Π² ΠΎΡΠ΄Π΅Π»ΡΠ½ΠΎΠΌ ΠΏΠΎΡΠΎΠΊΠ΅
static void* install(void* data) {
dispatch_t *dpp;
if ((dpp = dispatch_create()) == NULL)
exit("dispatch allocate");
resmgr_attr_t resmgr_attr;
memset(&resmgr_attr, 0, sizeof(resmgr_attr));
resmgr_attr.nparts_max = 1;
resmgr_attr.msg_max_size = 2048;
static resmgr_connect_funcs_t connect_funcs;
static resmgr_io_funcs_t io_funcs;
iofunc_func_init(_RESMGR_CONNECT_NFUNCS, &connect_funcs,
_RESMGR_IO_NFUNCS, &io_funcs);
// ΠΎΠΏΡΠ΅Π΄Π΅Π»ΡΠ΅ΠΌ ΠΎΠ±ΡΠ°Π±ΠΎΡΠΊΡ, ΠΎΡΠ»ΠΈΡΠ½ΡΡ ΠΎΡ ΠΎΠ±ΡΠ°Π±ΠΎΡΠΊΠΈ ΠΏΠΎ ΡΠΌΠΎΠ»ΡΠ°Π½ΠΈΡ,
// ΡΠΎΠ»ΡΠΊΠΎ Π΄Π»Ρ Π΄Π²ΡΡ ΠΊΠΎΠΌΠ°Π½Π΄: read() & devctl()
io_funcs.read = &readfunc;
io_funcs.devctl = &devctlfunc;
static iofunc_attr_t attr;
iofunc_attr_init(&attr, S_IFNAM | 0666, 0, 0);
// ΡΠ²ΡΠ·ΡΠ²Π°Π΅ΠΌ ΠΌΠ΅Π½Π΅Π΄ΠΆΠ΅Ρ Ρ Π΅Π³ΠΎ ΠΏΡΠ΅ΡΠΈΠΊΡΠ½ΡΠΌ ΠΈΠΌΠ΅Π½Π΅ΠΌ
if (resmgr_attach(dpp, &resmgr_attr, DEVNAME,
_FTYPE_ANY, 0, &connect_funcs, &io_funcs, &attr) == -1)
exit("prefix attach");
dispatch_context_t* ctp = dispatch_context_alloc(dpp);
while (true) {
if ((ctp = dispatch_block(ctp)) == NULL)
exit("block error");
dispatch_handler(ctp);
}
}
// ΡΠ°Π·ΠΌΠ΅Ρ Π±ΡΡΠ΅ΡΠ° Π΄Π»Ρ ΠΎΠ±ΠΌΠ΅Π½Π° ΡΠΎΠΎΠ±ΡΠ΅Π½ΠΈΡΠΌΠΈ,
// ΡΡΠΎΠ³ΠΎ Π½Π°ΠΌ Ρ Π²Π°ΡΠΈΡ Ρ Π±ΠΎΠ»ΡΡΠΈΠΌ Π·Π°ΠΏΠ°ΡΠΎΠΌ ΠΈ Π½Π°Π΄ΠΎΠ»Π³ΠΎ ;)
const int blk = 100000;
// ΠΎΠ±ΡΠ°Π±ΠΎΡΡΠΈΠΊ Π½ΠΈΠ·ΠΊΠΎΡΡΠΎΠ²Π½Π΅Π²ΡΡ ΡΠΎΠΎΠ±ΡΠ΅Π½ΠΈΠΉ,
// ΡΠ°ΠΊΠΆΠ΅ ΡΠ°Π±ΠΎΡΠ°ΡΡΠΈΠΉ Π² ΠΎΡΠ΄Π΅Π»ΡΠ½ΠΎΠΌ ΠΏΠΎΡΠΎΠΊΠ΅
void* msginout(void* Ρ) {
static uint8_t bufin[blk];
struct _msg_info info;
while (true) {
int rcvid = MsgReceive(data chid, &bufin, blk, &info);
if (rcvid < 0) exit("message receive");
if (MsgReply(rcvid, EOK, &bufin, info.msglen) < 0)
exit("message reply");
}
}
//--------------------------------------------------------
// "ΠΏΡΡΡΠΎΠΉ" ΠΎΠ±ΡΠ°Π±ΠΎΡΡΠΈΠΊ ΡΠ΅Π°ΠΊΡΠΈΠΈ Π½Π° ^C (ΡΠΈΠ³Π½Π°Π» SIGINT)
inline static void empty(int signo) {}
//--------------------------------------------------------
// Π³Π»Π°Π²Π½Π°Ρ ΠΏΡΠΎΠ³ΡΠ°ΠΌΠΌΠ°, ΠΊΠΎΡΠΎΡΠ°Ρ Π²ΡΠ΅ ΡΡΠΎ "Ρ ΠΎΠ·ΡΠΉΡΡΠ²ΠΎ" ΡΡΡΠ°Π½ΠΎΠ²ΠΈΡ
// ΠΈ Π±ΡΠ΄Π΅Ρ Π±Π΅Π·ΡΠΎΠΏΠΎΡΠ½ΠΎ ΠΆΠ΄Π°ΡΡ Π·Π°Π²Π΅ΡΡΠ΅Π½ΠΈΡ ΠΏΠΎ ^C ;)
int main(int argc, char *argv[]) {
cout << "SRR server: " << VERSION << endl;
// ΠΎΡΠΊΡΡΠ²Π°Π΅ΡΡΡ ΠΌΠ΅Π½Π΅Π΄ΠΆΠ΅Ρ ΡΠ΅ΡΡΡΡΠ° ...
int fd = open(DEVNAME, O_RDONLY);
// Π΅ΡΠ»ΠΈ ΠΌΠ΅Π½Π΅Π΄ΠΆΠ΅Ρ ΠΎΡΠΊΡΡΠ»ΡΡ, ΡΠΎ ΡΡΠΎ Π½Π°ΠΌ Π½Π΅ Π½ΡΠΆΠ½ΠΎ -
// Π΄ΡΠ±Π»ΠΈΠΊΠ°ΡΡ Π½Π΅ ΡΠΎΠ·Π΄Π°Π²Π°ΡΡ!
if (fd > 0)
close(fd), cout << "already in use " << DEVNAME << endl, exit(EXIT_FAILURE);
// ΠΏΠ΅ΡΠ΅Ρ Π²Π°ΡΡΠ²Π°Π΅ΠΌ ΡΠ΅Π°ΠΊΡΠΈΡ ^C:
cout << ". . . . . . waiting ^C. . . . . ." << flush;
signal(SIGINT, empty);
// ΡΠΎΠ·Π΄Π°Π΅ΡΡΡ ΠΊΠ°Π½Π°Π» Π΄Π»Ρ ΠΎΠ±ΠΌΠ΅Π½Π° Π½ΠΈΠ·ΠΊΠΎΡΡΠΎΠ²Π½Π΅Π²ΡΠΌΠΈ ΡΠΎΠΎΠ±ΡΠ΅Π½ΠΈΡΠΌΠΈ
data.chid = ChannelCreate(0);
// ΠΈ Π·Π°ΠΏΡΡΠΊΠ°Π΅ΡΡΡ ΠΎΡΠ΄Π΅Π»ΡΠ½ΡΠΌ ΠΏΠΎΡΠΎΠΊΠΎΠΌ ΡΠ΅ΡΡΠ°Π½ΡΠ»ΡΡΠΎΡ Ρ ΡΡΠΎΠ³ΠΎ ΠΊΠ°Π½Π°Π»Π°
if (pthread_create(NULL, NULL, msginout, NULL) != EOK)
exit("message thread");
// Π·Π°ΠΏΡΡΠΊΠ°Π΅ΡΡΡ ΠΌΠ΅Π½Π΅Π΄ΠΆΠ΅Ρ ΡΠ΅ΡΡΡΡΠ°
if (pthread_create(NULL, NULL, install, NULL) != EOK)
exit("manager thread");
// ... Π²ΡΠ΅! ΠΡ ΡΠ²ΠΎΠ΅ Π΄Π΅Π»ΠΎ ΡΠ΄Π΅Π»Π°Π»ΠΈ ΠΈ ΠΎΠΆΠΈΠ΄Π°Π΅ΠΌ ^C ...
pause();
cout << "\rFinalization... " << endl;
// ... ΠΎΡΠΈΡΡΠΊΠ°, Π·Π°Π²Π΅ΡΡΠ΅Π½ΠΈΠ΅ ...
ChannelDestroy(data.chid);
return EXIT_SUCCESS;
}
ΠΠ΅ΡΠ²Π°Ρ ΠΊΠ»ΠΈΠ΅Π½ΡΡΠΊΠ°Ρ ΠΏΡΠΎΠ³ΡΠ°ΠΌΠΌΠ° (ΡΠ°ΠΉΠ» cli.cc) ΠΏΠΎΡΡΠ»Π°Π΅Ρ ΡΠ΅ΡΠ²Π΅ΡΡ Π±Π»ΠΎΠΊ Π΄Π°Π½Π½ΡΡ ΡΠΊΠ°Π·Π°Π½Π½ΠΎΠΉ Π΄Π»ΠΈΠ½Ρ (Π΄Π»ΠΈΠ½Π° ΠΌΠΎΠΆΠ΅Ρ ΠΈΠ·ΠΌΠ΅Π½ΡΡΡΡΡ Π² ΡΠΈΡΠΎΠΊΠΈΡ ΠΏΡΠ΅Π΄Π΅Π»Π°Ρ ΡΠΊΠ°Π·Π°Π½ΠΈΠ΅ΠΌ ΠΏΡΠΈ Π·Π°ΠΏΡΡΠΊΠ΅ ΠΊΠ»ΡΡΠ° -b) ΠΈ ΠΎΠΆΠΈΠ΄Π°Π΅Ρ ΠΎΡ Π½Π΅Π³ΠΎ ΡΠ΅ΡΡΠ°Π½ΡΠ»ΡΡΠΈΠΈ, ΠΏΠΎΡΠ»Π΅ ΡΠ΅Π³ΠΎ Π·Π°ΠΌΠ΅ΡΡΠ΅Ρ Π²ΡΠ΅ΠΌΡ ΠΎΡΠ²Π΅ΡΠ° ΠΎΡ ΡΠ΅ΡΠ²Π΅ΡΠ°. ΠΡΠΎΡ ΠΏΡΠΎΡΠ΅ΡΡ ΠΏΠΎΠ²ΡΠΎΡΡΠ΅ΡΡΡ ΠΌΠ½ΠΎΠ³ΠΎΠΊΡΠ°ΡΠ½ΠΎ (ΠΊΠ»ΡΡ -m).
ΠΠ΅ΡΠ²ΡΠΉ ΠΊΠ»ΠΈΠ΅Π½ΡΡΠΊΠΈΠΉ ΠΏΡΠΎΡΠ΅ΡΡ#include "common.h"
static uint64_t *tim;
static int num = 10;
// Π²ΡΠ²ΠΎΠ΄ ΡΠ΅Π·ΡΠ»ΡΡΠ°ΡΠΎΠ² Ρ ΠΎΡΠ΅Π½ΠΊΠΎΠΉ ΡΡΠ°ΡΠΈΡΡΠΈΠΊΠΈ: ΡΡΠ΅Π΄Π½Π΅Π΅, Π‘.Π.Π...
static void outtim(void) {
double m = 0., s = 0.;
for (int i = 0; i < num; i++) {
double d = (double)tim[i];
m += d;
s += d * d;
}
m /= num;
s = sqrt(s / num - m * m);
cout << '\t' << (uint64_t)floor(m + 5) << "\t~" << (uint64_t)floor(s + .5) <<
"\t{" << (uint64_t)floor(s / m * 100 + .5) << "%}" << endl;
}
int main(int argc, char **argv) {
cout << "SRR client: " << VERSION << endl;
int opt, val;
unsigned int blk = 100;
char PATH[_POSIX_PATH_MAX] = "";
while ((opt = getopt(argc, argv, "n:b:m:")) != -1) {
switch (opt) {
case 'n': // ΠΈΠΌΡ Ρ ΠΎΡΡΠ° ΡΠ΅ΡΠ²Π΅ΡΠ°
strcpy(PATH, "/net/");
strcat(PATH, optarg);
break;
case 'b': // ΡΠ°Π·ΠΌΠ΅Ρ Π±Π»ΠΎΠΊΠ° ΠΎΠ±ΠΌΠ΅Π½Π° (Π±Π°ΠΉΡ)
if (sscanf(optarg, "%i", &blk) != 1)
exit("parse command line failed");
break;
case 'm': // ΡΠΈΡΠ»ΠΎ ΠΏΠΎΠ²ΡΠΎΡΠ΅Π½ΠΈΠΉ ΡΠ°ΠΊΠΈΡ Π±Π»ΠΎΠΊΠΎΠ²
if (sscanf(optarg, "%i", &num) != 1)
exit("parse command line failed");
break;
default:
exit(EXIT_FAILURE);
}
}
// "ΡΠΎΡΡΠ°Π²ΠΈΡΡ" ΠΏΠΎΠ»Π½ΠΎΠ΅ ΠΈΠΌΡ ΠΌΠ΅Π½Π΅Π΄ΠΆΠ΅ΡΠ°
strcat(PATH, DEVNAME);
cout << "server path. " << PATH << ", block size = "
<< blk << " bytes, repeat = " << num << endl;
// ΠΏΡΠΈ ΠΈΠ½ΠΈΡΠΈΠ°Π»ΠΈΠ·Π°ΡΠΈΠΈ ΠΌΡ ΡΡΠ°Π·Ρ ΠΏΠΎΠ»ΡΡΠ°Π΅ΠΌ ΡΠΊΠΎΡΠΎΡΡΡ ΠΏΡΠΎΡΠ΅ΡΡΠΎΡΠ° ΠΊΠ»ΠΈΠ΅Π½ΡΠ°
result data;
cout << "CPU speed [Ρ.p.s ]: client = " << data.cps;
// ΠΏΡΡΠ°Π΅ΠΌΡΡ ΠΏΠΎΠ΄ΠΊΠ»ΡΡΠΈΡΡΡΡ ΠΊ ΡΠ΅ΡΠ²Π΅ΡΡ-ΠΌΠ΅Π½Π΅Π΄ΠΆΠ΅ΡΡ
int fd = open(PATH, O_RDONLY);
if (fd < 0) exit("server not found");
// ΡΠΈΡΠ°Π΅ΠΌ Π΅Π³ΠΎ ΠΏΠ°ΡΠ°ΠΌΠ΅ΡΡΡ
if (read(fd, &data, sizeof(result)) == -1)
exit("parameter block read");
cout << ", server = " << data.cps << endl;