⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 sht.c

📁 网络时间协议NTP 源码 版本v4.2.0b 该源码用于linux平台下
💻 C
字号:
/*  * sht.c - Testprogram for shared memory refclock * read/write shared memory segment; see usage */#ifndef SYS_WINNT#include <sys/types.h>#include <sys/ipc.h>#include <sys/shm.h>#include <stdio.h>#include <time.h>#include <unistd.h>#include <stdlib.h>#else#include <windows.h>#include <time.h>#include <stdlib.h>#include <stdio.h>#include <iostream.h>#define sleep(x) Sleep(x*1000)#endif#include <assert.h>struct shmTime {	int    mode; /* 0 - if valid set		      *       use values, 		      *       clear valid		      * 1 - if valid set 		      *       if count before and after read of values is equal,		      *         use values 		      *       clear valid		      */	int    count;	time_t clockTimeStampSec;	int    clockTimeStampUSec;	time_t receiveTimeStampSec;	int    receiveTimeStampUSec;	int    leap;	int    precision;	int    nsamples;	int    valid;};struct shmTime *getShmTime (	int unit	){#ifndef SYS_WINNT	int shmid=shmget (0x4e545030+unit, sizeof (struct shmTime), IPC_CREAT|0777);	if (shmid==-1) {		perror ("shmget");		exit (1);	}	else {		struct shmTime *p=(struct shmTime *)shmat (shmid, 0, 0);		if ((int)(long)p==-1) {			perror ("shmat");			p=0;		}		assert (p!=0);		return p;	}#else	char buf[10];	LPSECURITY_ATTRIBUTES psec=0;	sprintf (buf,"NTP%d",unit);	SECURITY_DESCRIPTOR sd;	SECURITY_ATTRIBUTES sa;	HANDLE shmid;	assert (InitializeSecurityDescriptor(&sd, SECURITY_DESCRIPTOR_REVISION));	assert (SetSecurityDescriptorDacl(&sd,1,0,0));	sa.nLength=sizeof (SECURITY_ATTRIBUTES);	sa.lpSecurityDescriptor=&sd;	sa.bInheritHandle=0;	shmid=CreateFileMapping ((HANDLE)0xffffffff, 0, PAGE_READWRITE,				 psec, sizeof (struct shmTime),buf);	if (!shmid) {		shmid=CreateFileMapping ((HANDLE)0xffffffff, 0, PAGE_READWRITE,					 0, sizeof (struct shmTime),buf);		cout <<"CreateFileMapping with psec!=0 failed"<<endl;	}	if (!shmid) {		char mbuf[1000];		FormatMessage (FORMAT_MESSAGE_FROM_SYSTEM,			       0, GetLastError (), 0, mbuf, sizeof (mbuf), 0);		int x=GetLastError ();		cout <<"CreateFileMapping "<<buf<<":"<<mbuf<<endl;		exit (1);	}	else {		struct shmTime *p=(struct shmTime *) MapViewOfFile (shmid, 								    FILE_MAP_WRITE, 0, 0, sizeof (struct shmTime));		if (p==0) {			char mbuf[1000];			FormatMessage (FORMAT_MESSAGE_FROM_SYSTEM,				       0, GetLastError (), 0, mbuf, sizeof (mbuf), 0);			cout <<"MapViewOfFile "<<buf<<":"<<mbuf<<endl;			exit (1);		}		return p;	}	return 0;#endif}intmain (	int argc,	char *argv[]	){	volatile struct shmTime *p=getShmTime(2);	if (argc<=1) {		printf ("usage: %s r[c][l]|w|snnn\n",argv[0]);		printf ("       r read shared memory\n");		printf ("        c clear valid-flag\n");		printf ("        l loop (so, rcl will read and clear in a loop\n");		printf ("       w write shared memory with current time\n");		printf ("       snnnn set nsamples to nnn\n");		printf ("       lnnnn set leap to nnn\n");		printf ("       pnnnn set precision to -nnn\n");		exit (0);	}	switch (argv[1][0]) {	    case 's': {		    p->nsamples=atoi(&argv[1][1]);	    }	    break;	    case 'l': {		    p->leap=atoi(&argv[1][1]);	    }	    break;	    case 'p': {		    p->precision=-atoi(&argv[1][1]);	    }	    break;	    case 'r': {		    char *ap=&argv[1][1];		    int clear=0;		    int loop=0;		    printf ("reader\n");		    while (*ap) {			    switch (*ap) {				case 'l' : loop=1; break;				case 'c' : clear=1; break;			    }			    ap++;		    }		    do {			    printf ("mode=%d, count=%d, clock=%d.%d, rec=%d.%d,\n",				    p->mode,p->count,p->clockTimeStampSec,p->clockTimeStampUSec,				    p->receiveTimeStampSec,p->receiveTimeStampUSec);			    printf ("  leap=%d, precision=%d, nsamples=%d, valid=%d\n",				    p->leap, p->precision, p->nsamples, p->valid);			    if (!p->valid)				printf ("***\n");			    if (clear) {				    p->valid=0;				    printf ("cleared\n");			    }			    if (loop)				sleep (1);		    } while (loop);	    }	    break;	    case 'w': {		    printf ("writer\n");		    p->mode=0;		    if (!p->valid) {			    p->clockTimeStampSec=time(0)-20;			    p->clockTimeStampUSec=0;			    p->receiveTimeStampSec=time(0)-1;			    p->receiveTimeStampUSec=0;			    printf ("%d %d\n",p->clockTimeStampSec, p->receiveTimeStampSec);			    p->valid=1;		    }		    else {			    printf ("p->valid still set\n"); /* not an error! */		    }	    }	    break;	}}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -