fork download
  1. #include <limits.h>
  2. #include <signal.h>
  3. #include <stdio.h>
  4. #include <stdlib.h>
  5. #include <sys/time.h>
  6. #include <time.h>
  7. #include <unistd.h>
  8.  
  9. static unsigned char *sleep_arg[] = {
  10. "0.001","0.002","0.004","0.005",
  11. };
  12. #define N ( sizeof( sleep_arg) / sizeof( sleep_arg[0]))
  13.  
  14. static unsigned char *com_args[] = { "sleep",(char *) NULL,(char *) NULL };
  15. static void d_com( void)
  16. {
  17. int status;
  18. if ( !fork()){
  19. execv("/bin/sleep",com_args);
  20. perror( NULL);
  21. kill( getppid(),SIGINT);
  22. exit( 1);
  23. }
  24. wait( &status);
  25. }
  26.  
  27. static struct timespec nanosleep_req = {0};
  28. static void d_sys( void)
  29. {
  30. nanosleep( &nanosleep_req,NULL);
  31. }
  32.  
  33. static void f_iter( int r[],void ( *func)( void))
  34. {
  35. int j;
  36. struct timeval tv_before,tv_after;
  37. r[0] = INT_MAX;
  38. r[1] = 0;
  39. r[2] = 0;
  40. for ( j = 0; j < 100; j++){
  41. int val;
  42. gettimeofday( &tv_before,NULL);
  43. ( *func)();
  44. gettimeofday( &tv_after,NULL);
  45. val = ( tv_after.tv_sec - tv_before.tv_sec) * 1000000
  46. + tv_after.tv_usec - tv_before.tv_usec;
  47. ( val < r[0]) && ( r[0] = val);
  48. ( r[1] < val) && ( r[1] = val);
  49. r[2] += val;
  50. }
  51. r[2] /= 100;
  52. }
  53.  
  54. int main( int argc,char **argv)
  55. {
  56. int i;
  57. for ( i = 0; i < N; i++){
  58. int r_com[3],r_sys[3];
  59. com_args[1] = sleep_arg[i];
  60. f_iter( r_com,d_com);
  61. nanosleep_req.tv_nsec = strtod( sleep_arg[i],NULL) * 1.0e9;
  62. f_iter( r_sys,d_sys);
  63. printf("%s %d-%d,%d %d-%d,%d\n",
  64. sleep_arg[i],
  65. r_com[0],r_com[1],r_com[2],r_sys[0],r_sys[1],r_sys[2]);
  66. }
  67. return 0;
  68. }
  69.  
Not running #stdin #stdout 0s 0KB
stdin
Standard input is empty
stdout
Standard output is empty