2024年10月linuxsettimer(c语言中syntax error at end of input 是什么错误)

 更新时间:2024-10-12

  ⑴linuxsettimer(c语言中syntaxerroratendofinput是什么错误

  ⑵c语言中syntaxerroratendofinput是什么错误

  ⑶输入端的语法错误;查找程序;哪怕是一个括号没有完全都可能出现此问题以下为C语言编译出现错的参考关于C语言在编译时常出现的错误有哪些?、fatalerrorC:unexpectedendoffilewhilelookingforprepiledheaderdirective。寻找预编译头文件路径时遇到了不该遇到的文件尾。(一般是没有#include“stdafx.h“)、fatalerrorC:Cannotopenincludefile:’R…….h’:Nosuchfileordirectory不能打开包含文件“R…….h”:没有这样的文件或目录。、errorC:’C……’:’class’typeredefinition类“C……”重定义。、errorC:unknowncharacter’xa’不认识的字符’xa’。(一般是汉字或中文标点符号)、errorC:expectedconstantexpression希望是常量表达式。(一般出现在switch语句的case分支中)、errorC:’IDD_MYDIALOG’:undeclaredidentifier“IDD_MYDIALOG”:未声明过的标识符。、errorC:redefinitionofformalparameter’bReset’函数参数“bReset”在函数体中重定义。、errorC:syntaxerror:missing’:’before’{’句法错误:“{”前缺少“;”。、errorC:casevalue’’alreadyused值已经用过。(一般出现在switch语句的case分支中)、errorC:’OnTimer’:memberfunctionnotdeclaredin’CHelloView’成员函数“OnTimer”没有在“CHelloView”中声明。、errorC:’reset’:overloadedmemberfunction’void(int)’notfoundin’B’重载的函数“voidreset(int)”在类“B”中找不到。、errorC:’B::f’:overridingvirtualfunctiondiffersfrom’A::f’onlybyreturntypeorcallingconvention类B对类A中同名函数f的重载仅根据返回值或调用约定上的区别。、errorC:’SetTimer’:functiondoesnottakeparameters“SetTimer”函数不传递个参数。、warningC:’f……’:noreturnvalue“f……”的return语句没有返回值。、warningC:’==’:operatorhasnoeffect;didyouintend’=’?没有效果的运算符“==”;是否改为“=”?、warningC:localvariable’bReset’usedwithouthavingbeeninitialized局部变量“bReset”没有初始化就使用。、errorC:’CMyApp::InitInstance’:mustreturnavalue“CMyApp::InitInstance”函数必须返回一个值。、LINK:fatalerrorLNK:cannotopenDebug/P.exeforwriting连接错误:不能打开P.exe文件,以改写内容。(一般是P.Exe还在运行,未关闭)、errorLNK:unresolvedexternalsymbol“public:virtual__thiscallC……::~C……(void)“

  ⑷c语言中怎么设置计时器

  ⑸#include《iostream》

  ⑹#include《time.h》

  ⑺usingnamespacestd;

  ⑻clock_tstart=clock();

  ⑼//dosomeprocesshere

  ⑽clock_tend=(clock()-start)/CLOCKS_PER_SEC;

  ⑾cout《《“timesumptionis“《《end《《endl;

  ⑿使用linux的系统设置计时器

  ⒀#include《sys/time.h》

  ⒁timevalstarttime,endtime;

  ⒂gettimeofday(&starttime,);

  ⒃//dosomeprocesshere

  ⒄gettimeofday(&endtime,);

  ⒅doubletimeuse=*(endtime.tv_sec-starttime.tv_sec)+endtime.tv_usec-startime.tv_usec;

  ⒆timeuse/=;//除以则进行毫秒计时,如果除以则进行秒级别计时,如果除以则进行微妙级别计时

  ⒇timeval的结构如下:

  ⒈struttimeval

  ⒉longtv_sec;/*秒数*/

  ⒊longtv_usec;/*微秒数*/

  ⒋Linux下的定时器,怎么用

  ⒌时事件,void(*handle)(unionsigvalv)参数就是处理事件的函数指针。intomsSetTimer(timer_t*tId,intvalue,intinterval)就是设置定时器。按你说的,如果要同时起多个定时器,需要定义一个数组timer_ttm;tm就是定时器结构,it用来记录对应的定时器是否已经使用,使用中的就是,没用的就是;主进程消息来了就从it找一个没用的来omsSetTimer,如果收到终止消息,那omsSetTimer定时时间为intomsTimer(timer_t*tId,intiValue,intiSeconds,void(*handle)(unionsigvalv),void*param){structsigeventse;structitimerspects;memset(&se,,sizeof(se));se.sigev_notify=SIGEV_THREAD;se.sigev_notify_function=handle;se.sigev_value.sival_ptr=param;if(timer_create(CLOCK_REALTIME,&se,tId)《){return-;}ts.it_value.tv_sec=iValue;//ts.it_value.tv_sec=;//ts.it_value.tv_nsec=(long)(iValue%)*(L);ts.it_value.tv_nsec=;ts.it_interval.tv_sec=iSeconds;//ts.it_interval.tv_nsec=(long)(iSeconds%)*(L);ts.it_interval.tv_nsec=;if(timer_settime(*tId,TIMER_ABSTIME,&ts,NULL)《){return-;}return;}intomsSetTimer(timer_t*tId,intvalue,intinterval){structitimerspects;ts.it_value.tv_sec=value;//ts.it_value.tv_nsec=(long)(value%)*(L);ts.it_value.tv_nsec=;ts.it_interval.tv_sec=interval;//ts.it_interval.tv_nsec=(long)(interval%)*(L);ts.it_interval.tv_nsec=;if(timer_settime(*tId,TIMER_ABSTIME,&ts,NULL)《){return-;}return;}另外,团IDC网上有许多产品团购,便宜有口碑

  ⒍如何在Linux下实现定时器

  ⒎定时器Timer应用场景非常广泛,在Linux下,有以下几种方法:,使用sleep()和usleep()其中sleep精度是秒,usleep精度是微妙,具体代码就不写了。使用这种方法缺点比较明显,在Linux系统中,sleep类函数不能保证精度,尤其在系统负载比较大时,sleep一般都会有超时现象。,使用信号量SIGALRM+alarm()这种方式的精度能达到秒,其中利用了*nix系统的信号量机制,首先注册信号量SIGALRM处理函数,调用alarm(),设置定时长度,代码如下:viewplaincopy#include《stdio.h》#include《signal.h》voidtimer(intsig){if(SIGALRM==sig){printf(“timer

  ⒏“);alarm();//wecontimuesetthetimer}return;}intmain(){signal(SIGALRM,timer);//relatethesignalandfunctionalarm();//triggerthetimergetchar();return;}alarm方式虽然很好,但是无法首先低于秒的精度。,使用RTC机制RTC机制利用系统硬件提供的RealTimeClock机制,通过读取RTC硬件/dev/rtc,通过ioctl()设置RTC频率,代码如下:viewplaincopy#include《stdio.h》#include《linux/rtc.h》#include《sys/ioctl.h》#include《sys/time.h》#include《sys/types.h》#include《ftl.h》#include《unistd.h》#include《errno.h》#include《stdlib.h》intmain(intargc,char*argv){unsignedlongi=;unsignedlongdata=;intretval=;intfd=open(“/dev/rtc“,O_RDONLY);if(fd《){perror(“open“);exit(errno);}/*SetthefreqasHz*/if(ioctl(fd,RTC_IRQP_SET,)《){perror(“ioctl(RTC_IRQP_SET)“);close(fd);exit(errno);}/*Enableperiodicinterrupts*/if(ioctl(fd,RTC_PIE_ON,)《){perror(“ioctl(RTC_PIE_ON)“);close(fd);exit(errno);}for(i=;i《;i++){if(read(fd,&data,sizeof(unsignedlong))《){perror(“read“);close(fd);exit(errno);}printf(“timer

  ⒐“);}/*Disableperiodicinterrupts*/ioctl(fd,RTC_PIE_OFF,);close(fd);return;}这种方式比较方便,利用了系统硬件提供的RTC,精度可调,而且非常高。,使用select()这种方法在看APUE神书时候看到的,方法比较冷门,通过使用select(),来设置定时器;原理利用select()方法的第个参数,第一个参数设置为,三个文件描述符集都设置为NULL,第个参数为时间结构体,代码如下:viewplaincopy#include《sys/time.h》#include《sys/select.h》#include《time.h》#include《stdio.h》/*seconds:theseconds;mseconds:themicroseconds*/voidsetTimer(intseconds,intmseconds){structtimevaltemp;temp.tv_sec=seconds;temp.tv_usec=mseconds;select(,NULL,NULL,NULL,&temp);printf(“timer

  ⒑“);return;}intmain(){inti;for(i=;i《;i++)setTimer(,);return;}这种方法精度能够达到微妙级别,网上有很多基于select()的多线程定时器,说明select()稳定性还是非常好。总结:如果对系统要求比较低,可以考虑使用简单的sleep(),毕竟一行代码就能解决;如果系统对精度要求比较高,则可以考虑RTC机制和select()机制。

  ⒒C++怎么能间隔一定的时间执行指定的代码

  ⒓可以使用延时函数。在需要间隔的地方执行延时函数可以使系统暂停一段时间,时间由延时函数的参数指定。从而达到要求的目的。延时函数不是C库函数,所以因编译器不同而有所区别。一、windows系统的编译器下,可以使用Sleep函数。注意首字母S大写。函数名:Sleep功能:执行挂起一段时间用法:voidSleep(DWORDdwMilliseconds);头文件:#include《windows.h》参数的时间单位是毫秒,即使用Sleep(n);可以延时n毫秒。比如延时.秒,可以写作Sleep();二、Linux编译器下根据时间的不同,可以使用sleep和usleep,或二者搭配。注意都是小写字母。二者功能都是执行挂起一段时间,其中sleep单位为秒,usleep单位为微秒。头文件都是#include《unistd.h》用法为voidsleep(unsignedlongseconds);voidusleep(unsignedlonguseconds);如果以秒为单位,需要整数部分调用sleep,小数部分乘以^后,调用usleep。比如延时.秒,可以用sleep();usleep();

  ⒔如果我想用的linux库文件不存在怎么办呢,可以安装吗,

  ⒕Ubuntu教程:链接不到库提示库文件不存在的解决办法/home/bear/QtProgram/opencv-build-desktop/opencv:errorwhileloadingsharedlibraries:libopencv_highgui.so..:cannotopensharedobjectfile:Nosuchfileordirectoryerrorwhileloadingsharedlibraries:libXXX.so...:cannotopensharedobjectfile此时你可以locatelibXXX.so...(如果你的文件系统比以前有了变化,如安装了可能是需要的库的开发包,则需要locate-u一下)然后如果发现了libXXX.so...的确存在,就把libXXX.so...所在的目录加入到/etc/ld.so.conf中,或者在/etc/ld.so.conf.d/下新建一文件,如XXX.conf,其内容是libXXX.so...所在的目录。如果发现libXXX.so...不存在,你可能没安装包含库的程序。一般google一下“XXXlinux”就能找到相应的软件。如果提示是errorwhileloadingsharedlibraries:libXXX.so,但你的系统上有libXXX.so.,你可以为libXXX.so.做一个软链接ln-slibXXX.so.libXXX.so如,我执行一个ACE开发包中的样例程序时,出现以下提示:中只有一行:/opt/ace/lib然后再执行ldconfigOK,现在执行logging_app就没有错误了。

  ⒖c语言怎么样编写一个时钟程序

  ⒗c语言时钟程序代码如下:

  ⒘#include《windows.h》

  ⒙#include《math.h》

  ⒚#defineID_TIMER//计时器ID

  ⒛#defiWOPI(*.)

  LRESULTCALLBACKWndProc(HWND,UINT,WPARAM,LPARAM);

  intWINAPIWinMain(HINSTANCEhInstance,HINSTANCEhPrevInstance,LPSTRszCmdLine,intiCmdShow)

  staticTCHARszAppName=TEXT(“Clock“);

  WNDCLASSwndclass;

  wndclass.cbClsExtra=;

  wndclass.cbWndExtra=;

  wndclass.hbrBackground=(HBRUSH)GetStockObject(WHITE_BRUSH);

  wndclass.hCursor=LoadCursor(NULL,IDC_ARROW);

  wndclass.hIcon=LoadIcon(NULL,IDI_APPLICATION);

  wndclass.hInstance=hInstance;

  wndclass.lpfnWndProc=WndProc;

  wndclass.lpszClassName=szAppName;

  wndclass.lpszMenuName=NULL;

  wndclass.style=CS_HREDRAW|CS_VREDRAW;

  if(!RegisterClass(&wndclass))

  MessageBox(NULL,TEXT(“ThisprogramrequiresWindows

  T“),szAppName,MB_ICONERROR);

  hwnd=CreateWindow(szAppName,TEXT(“AnalogClock“),WS_OVERLAPPEDWINDOW,CW_USEDEFAULT,CW_USEDEFAULT,CW_USEDEFAULT,CW_USEDEFAULT,NULL,NULL,hInstance,NULL);

  ShowWindow(hwnd,iCmdShow);

  UpdateWindow(hwnd);

  while(GetMessage(&msg,NULL,,))

  TranslateMessage(&msg);

  DispatchMessage(&msg);

  returnmsg.wParam;

  voidSetsotropic(HDChdc,intcxClient,intcyClient)

  SetMapMode(hdc,MM_ISOTROPIC);

  SetWindowExtEx(hdc,,,NULL);

  SetViewportExtEx(hdc,cxClient/,-cyClient/,NULL);

  SetViewportEx(hdc,cxClient/,cyClient/,NULL);

  voidRotatePoint(POINTpt,intiNum,intiAngle)

  POINTptTemp;

  for(i=;i《iNum;i++)

  ptTemp.x=(int)(pt.y*sin(TWOPI*iAngle/));

  ptTemp.y=(int)(pt.x*sin(TWOPI*iAngle/));

  pt=ptTemp;

  voidDrawClock(HDChdc)

  intiAngle;

  for(iAngle=;iAngle《;iAngle+=)

  RotatePoint(pt,,iAngle);

  pt.y=iAngle%?:;

  SelectObject(hdc,GetStockObject(BLACK_BRUSH));

  Ellipse(hdc,pt.y);

  voidDrawHands(HDChdc,SYSTEMTIME*pst,BOOLfChange)

  staticPOINTpt={,-,,,,,-,,,-,,-,,,,,-,,,-,,,,,,,,,,};

  inti,iAngle;

  POINTptTemp;

  iAngle=(pst-》wHour*)%+pst-》wMinute/;

  iAngle=pst-》wMinute*;

  iAngle=pst-》wSecond*;

  memcpy(ptTemp,pt,sizeof(pt));

  for(i=fChange?:;i《;i++)

  RotatePoint(ptTemp);

  Polyline(hdc,ptTemp,);

  LRESULTCALLBACKWndProc(HWNDhwnd,UINTmessage,WPARAMwParam,LPARAMlParam)

  staticintcxClient,cyClient;

  staticSYSTEMTIMEstPrevious;

  BOOLfChange;

  PAINTSTRUCTps;

  SYSTEMTIMEst;

  switch(message)

  caseWM_CREATE:

  SetTimer(hwnd,ID_TIMER,,NULL);

  GetLocalTime(&st);

  stPrevious=st;

  caseWM_SIZE:

  cxClient=LOWORD(lParam);

  cyClient=HIWORD(lParam);

  caseWM_TIMER:

  GetLocalTime(&st);

  fChange=st.wHour!=stPrevious.wHour||st.wMinute!=stPrevious.wMinute;

  hdc=GetDC(hwnd);

  Setsotropic(hdc,cxClient,cyClient);

  SelectObject(hdc,GetStockObject(WHITE_PEN));

  DrawHands(hdc,&stPrevious,fChange);

  SelectObject(hdc,GetStockObject(BLACK_PEN));

  DrawHands(hdc,&st,TRUE);

  stPrevious=st;

  caseWM_PAINT:

  hdc=BeginPaint(hwnd,&ps);

  Setsotropic(hdc,cxClient,cyClient);

  DrawClock(hdc);

  DrawHands(hdc,&stPrevious,TRUE);

  EndPaint(hwnd,&ps);

  caseWM_DESTROY:

  KillTimer(hwnd,ID_TIMER);

  PostQuitMessage();

  returnDefWindowProc(hwnd,message,wParam,lParam);

  C语言是一门通用计算机编程语言,应用广泛。C语言的设计目标是提供一种能以简易的方式编译、处理低级存储器、产生少量的机器码以及不需要任何运行环境支持便能运行的编程语言。尽管C语言提供了许多低级处理的功能,但仍然保持着良好跨平台的特性,以一个标准规格写出的C语言程序可在许多电脑平台上进行编译,甚至包含一些嵌入式处理器(单片机或称MCU以及超级电脑等作业平台。

  C语言是由UNIX的研制者丹尼斯·里奇(DennisRitchie于年由肯·汤普逊(KenThompson所研制出的B语言的基础上发展和完善起来的。目前,C语言编译器普遍存在于各种不同的操作系统中,例如UNIX、MS-DOS、MicrosoftWindows及Linux等。C语言的设计影响了许多后来的编程语言,例如C++、Objective-C、Java、C#等。

  timeSetEvent函数中第三个参数LPTIMECALLBACKlpTimeProc回调函数中如何实现画图

  介绍我们在衡量一h个n函数运行时间,或者判断一c个d算法的时间效率,或者在程序中我们需要一x个t定时器,定时执行一a个w特定的操作,比如在多媒体中,比如在游戏中等,都会用到时间函数。还比如我们通过记录函数或者算法开o始和截至的时间,然后利用两者之v差得出函数或者算法的运行时间。编译器和操作系统为我们提供了s很多时间函数,这些时间函数的精度也g是各不g相同的,所以,如果我们想得到准确的结果,必须使用合适的时间函数。现在我就介绍windows下e的几z种常用时间函数。:Sleep函数使用:sleep(),在Windows和Linux下p代表的含义b并不m相同,Windows下j的表示毫秒,也h就是秒钟;Linux下i表示秒,Linux下g使用毫秒级别的函数可以使用usleep。原理:sleep函数是使调用sleep函数的线程休眠,线程主动放弃时间片。当经过指定的时间间隔后,再启动线程,继续执行代码。Sleep函数并不g能起到定时的作用,主要作用是延时。在一h些多线程中可能会看到sleep();其主要目的是让出时间片。精度:sleep函数的精度非常低,当系统越忙它精度也h就越低,有时候我们休眠秒,可能秒后才j能继续执行。它的精度取决于l线程自身优先级、其他线程的优先级,以及h线程的数量等因素。:MFC下f的timer事件使用:。调用函数SetTimer()设置定时间隔,如SetTimer(,,NULL)即为设置毫秒的时间间隔;。在应用程序中增加定时响应函数OnTimer(),并在该函数中添加响应的处理语句,用来完成时间到时的操作。原理:同sleep函数一e样。不r同的是timer是一a个q定时器,可以指定回调函数,默认为OnTimer()函数。精度:timer事件的精度范围在毫米级别,系统越忙其精度也a就越差。:C语言下v的Time使用:time_tt;time(&t);Time函数是获取当前时间。原理:time函数主要用于t获取当前时间,比如我们做一a个e电子h时钟程序,就可以使用此函数,获取系统当前的时间。精度:秒级别:对象中的COleDateTime,COleDateTimeSpan类使用:COleDateTimestart_time=COleDateTime::GetCurrentTime();COleDateTimeSpanend_time=COleDateTime::GetCurrentTime()-start_time;While(end_time。GetTotalSeconds()《){。。处理延时或定时期间能处理其他的消息DoSomething()end_time=COleDateTime::GetCurrentTime-start_time;}原理:以上k代表延时秒,而这两秒内我们可以循环调用DoSomething(),从而实现在延时的时候我们也k能够处理其他的函数,或者消息。COleDateTime,COleDateTimeSpan是MFC中CTime,CTimeSpan在中的应用,所以,上x面的方法对于aCTime,CTimeSpa同样有效。精度:秒级别:C语言下x的时钟周期clock()使用:clock_tstart=clock();Sleep();clock_tend=clock();doubled=(double)(start-end)。CLOCKS_PER_SEC;原理:clock()是获取计算机启动后的时间间隔。精度:ms级别,对于z短时间内的定时或者延时可以达到ms级别,对于q时间比较长的定时或者延迟精度还是不q够。在windows下lCLOCKS_PER_SEC为。:Windows下g的GetTickCount()使用:DWORDstart=GetTickCount();Sleep();DWORDend=GetTickCount();原理:GetTickCount()是获取系统启动后的时间间隔。通过进入u函数开t始定时,到退出函数结束定时,从而可以判断出函数的执行时间,这种时间也l并非是函数或者算法的真实执行时间,因为在函数和算法线程不d可能一z直占用CPU,对于b所有判断执行时间的函数都是一w样,不x过基本上z已x经很准确,可以通过查询进行定时。GetTickCount()和Clock()函数是向主板BIOS要realtimeclock时间,会有中断产生,以及v延迟问题。精度:WindowsNT。以及a以后版本精度是ms,它的时间精度比clock函数的要高,GetTickCount()常用于a多媒体中。:Windows下ptimeGetTime使用:需要包含Mmsystem。h,Windows。h,加入x静态库Winmm。lib。timeBeginPeriod();DWORDstart=timeGetTime();Sleep();DWORDend=timeGetTime();timeEndPeriod();原理:timeGetTime也i时常用于u多媒体定时器中,可以通过查询进行定时。通过查询进行定时,本身也p会影响定时器的定时精度。精度:毫秒,与gGetTickCount()相当。但是和GetTickCount相比,timeGetTime可以通过timeBeginPeriod,timeEndPeriod设置定时器的最小e解析精度,timeBeginPeriod,timeEndPeriod必须成对出现。:windows下c的timeSetEvent使用:还记的VC下z的Timer吗?Timer是一u个u定时器,而以上e我们提到几r种时间函数或者类型,实现定时功能只能通过轮训来实现,也x就是必须另外创建一h个j线程单独处理,这样会影响定时精度,好在windows提供了d内置的定时器timeSetEvent,函数原型为MMRESULTtimeSetEvent(UINTuDelay,。。以毫秒指定事件的周期UINTuResolution,。。以毫秒指定延时的精度,数值越小p定时器事件分辨率越高。缺省值为msLPTIMECALLBACKlpTimeProc,。。指向一v个c回调函数WORDdwUser,。。存放用户提供的回调数据UINTfuEvent。。标志参数,TIME_ONESHOT:执行一p次;TIME_PERIODIC:周期性执行具体应用时,可以通过调用timeSetEvent()函数,将需要周期性执行的任务定义h在lpFunction回调函数中(如:定时采样、控制等),从而完成所需处理的事件。需要注意的是:任务处理的时间不h能大c于s周期间隔时间。另外,在定时器使用完毕后,应及z时调用timeKillEvent()将之z释放。原理:可以理解为代回调函数的timeGetTime精度:毫秒,timeSetEvent可以通过timeBeginPeriod,timeEndPeriod设置定时器的最小h解析精度,timeBeginPeriod,timeEndPeriod必须成对出现。:高精度时控函数QueryPerformanceFrequency,QueryPerformanceCounter使用:LARGE_INTEGERm_nFreq;LARGE_INTEGERm_nBeginTime;LARGE_INTEGERnEndTime;QueryPerformanceFrequency(&m_nFreq);。。获取时钟周期QueryPerformanceCounter(&m_nBeginTime);。。获取时钟计数Sleep();QueryPerformanceCounter(&nEndTime);cout《《(nEndTime。QuadPart-m_nBeginTime。QuadPart)*。m_nFreq。QuadPart《《endl;原理:CPU上m也m有一j个e计数器,以机器的clock为单位,可以通过rdtsc读取,而不g用中断,因此其精度与d系统时间相当。精度:计算机获取硬件支h持,精度比较高,可以通过它判断其他时间函数的精度范围。小y结:以上q提到常用的种时间函数,由于n他们的用处不l同,所以他们的精度也l不p尽相同,所以如果简单的延时可以用sleep函数,稍微准确的延时可以使用clock函数,GetTickCount函数,更高级的实用timeGetTime函数;简单的定时事件可以用Timer,准确地可以用timeSetEvent;或取一o般系统时间可以通time,或者CTime,或者COleDateTime,获取准确的时间可以用clock,或者GetTickCount函数,或者timeGetTime函数,而获取准确地系统时间要使用硬件支q持的QueryPerformanceFrequency函数,QueryPerformanceCounter函数。fτ亭vrqⅥ◎ypg波s丹b穿椹qⅥ◎

  求linux下用c语言编写的定时器程序

  //一个示例程序。#include《stdlib.h》#include《unistd.h》#include《signal.h》#include《time.h》#include《sys/time.h》#define?N??//设置最大的定时器个数int?i=,t=;?//i代表定时器的个数;t表示时间,逐秒递增?struct?Timer?//Timer结构体,用来保存一个定时器的信息{????int?total_time;?//每隔total_time秒????int?left_time;?//还剩left_time秒????int?func;?//该定时器超时,要执行的代码的标志}myTimer;?//定义Timer类型的数组,用来保存所有的定时器?void?setTimer(int?t,int?f)?//新建一个计时器{????struct?Timer?a;????a.total_time=t;????a.left_time=t;????a.func=f;????myTimer=a;}?void?timeout()?//判断定时器是否超时,以及超时时所要执行的动作{????printf(“Time:?%d

  “,t++);????int?j;????for(j=;j《i;j++)????{???????if(myTimer.left_time!=)???????????myTimer.left_time--;???????else???????{???????????switch(myTimer.func)???????????{??????//通过匹配myTimer.func,判断下一步选择哪种操作???????????case?:??????????????printf(“------Timer?:?--Hello?Aillo!

  “);break;???????????case?:??????????????printf(“------Timer?:?--Hello?Jackie!

  “);break;???????????case?:??????????????printf(“------Timer?:?--Hello?PiPi!

  “);break;???????????}???????????myTimer.total_time;?//循环计时???????}????}}?int?main()?//测试函数,定义三个定时器{????setTimer(,);????setTimer(,);????setTimer(,);????signal(SIGALRM,timeout);?//接到SIGALRM信号,则执行timeout函数???????while()????{???????sleep();?//每隔一秒发送一个SIGALRM???????kill(getpid(),SIGALRM);????}????exit();}

  每个Linux进程都有三个相互关联的间隔定时器。其各自的间隔计数器都定义在进程的task_struct结构中,如下所示(include/linux/sched.h:structtask_struct{……unsignedlongit_real_value,it_prof_value,it_virt_value;unsignedlongit_real_incr,it_prof_incr,it_virt_incr;structtimer_listreal_timer;……}(真实间隔定时器(ITIMER_REAL:这种间隔定时器在启动后,不管进程是否运行,每个时钟滴答都将其间隔计数器减。当减到值时,内核向进程发送SIGALRM信号。结构类型task_struct中的成员it_real_incr则表示真实间隔定时器的间隔计数器的初始值,而成员it_real_value则表示真实间隔定时器的间隔计数器的当前值。由于这种间隔定时器本质上与上一节的内核定时器时一样的,因此Linux实际上是通过real_timer这个内嵌在task_struct结构中的内核动态定时器来实现真实间隔定时器ITIMER_REAL的。(虚拟间隔定时器ITIMER_VIRT:也称为进程的用户态间隔定时器。结构类型task_struct中成员it_virt_incr和it_virt_value分别表示虚拟间隔定时器的间隔计数器的初始值和当前值,二者均以时钟滴答次数位计数单位。当虚拟间隔定时器启动后,只有当进程在用户态下运行时,一次时钟滴答才能使间隔计数器当前值it_virt_value减。当减到值时,内核向进程发送SIGVTALRM信号(虚拟闹钟信号,并将it_virt_value重置为初值it_virt_incr。具体请见..节中的do_it_virt()函数的实现。(PROF间隔定时器ITIMER_PROF:进程的task_struct结构中的it_prof_value和it_prof_incr成员分别表示PROF间隔定时器的间隔计数器的当前值和初始值(均以时钟滴答为单位。当一个进程的PROF间隔定时器启动后,则只要该进程处于运行中,而不管是在用户态或核心态下执行,每个时钟滴答都使间隔计数器it_prof_value值减。当减到值时,内核向进程发送SIGPROF信号,并将it_prof_value重置为初值it_prof_incr。具体请见..节的do_it_prof()函数。Linux在include/linux/time.h头文件中为上述三种进程间隔定时器定义了索引标识,如下所示:#defineITIMER_REAL#defineITIMER_VIRTUAL#defineITIMER_PROF数据结构:structitimerval,structtimerval,structsigaction()系统调用:time(),gettimeofday(),sigemptyset(),sigaction(),settimer().

您可能感兴趣的文章:

相关文章