sipp代码 中 时间和多线程编程

sipp中多线程

代码拿出来:

#include <unistd.h>
#include <stdlib.h>
#include <stdio.h>
#include <sys/types.h>
#include <sys/wait.h>
int main()
{
    pid_t  l_pid;
    char x[100]= "ls";
    switch(l_pid = fork())
    {
        case -1:
            // error when forking !
            printf("Forking error main");
            break;

        case 0:
            // first child process - execute the command
            if((l_pid = fork()) < 0) {
                printf("Forking error child");
            } else {
                if( l_pid == 0){
                    int ret;
                    ret = system("./time"); // second child runs
                    if(ret == -1) {
                        printf("system call error for %s",x);
                    }
                }
                exit(-1); 
            }
            break;
        default:
            // parent process continue
            // reap first child immediately
            pid_t ret;
            while ((ret=waitpid(l_pid, NULL, 0)) != l_pid) {
                if (ret != -1) {
                    printf("waitpid returns %1d for child %1d",ret,l_pid);
                }
            }
            break;
    }
}

两次 fork实现了孙子进程与父进程的脱离。

其中time的代码是:

#include <string.h>
#include <unistd.h>
#include <stdio.h>
#include <time.h>
using namespace std;

char* formatTime (struct timeval* P_tv, bool microseconds)
{
  static char L_time [50];
  struct tm * L_currentDate;

  // Get the current date and time
  time(&P_tv->tv_sec);
  L_currentDate = localtime ((const time_t *)&P_tv->tv_sec);

  // Format the time
  if (L_currentDate == NULL)
    {
      memset (L_time, 0, 50);
    } 
  else
    {
 if (microseconds) {
   sprintf(L_time, "%4.4d-%2.2d-%2.2d %2.2d:%2.2d:%2.2d:%03.03f",
       L_currentDate->tm_year + 1900,
       L_currentDate->tm_mon + 1,
       L_currentDate->tm_mday,
       L_currentDate->tm_hour,
       L_currentDate->tm_min,
       L_currentDate->tm_sec,
       (double)P_tv->tv_usec/(double)1000.0);
 } else {
          sprintf(L_time, "%4.4d-%2.2d-%2.2d/t%2.2d:%2.2d:%2.2d:%3.3d/t%10.10d.%6.6d",
       L_currentDate->tm_year + 1900,
       L_currentDate->tm_mon + 1,
       L_currentDate->tm_mday,
       L_currentDate->tm_hour,
       L_currentDate->tm_min,
       L_currentDate->tm_sec,
              (int) (P_tv->tv_usec)/1000,
              (long) (P_tv->tv_sec),
              (long) (P_tv->tv_usec));       
 }
    }
  return (L_time);
} /* end of formatTime */

int main()
{
    struct timeval currenttime;
    printf("%s\n",formatTime(¤ttime,true));
    sleep(5);
    printf("%s\n",formatTime(¤ttime,true));

waitpid等待子进程结束。

解释 如下:

 wait() and waitpid()
       The wait() system call suspends execution of the calling process until one of its children terminates.  The call wait(&status)  is
       equivalent to:


           waitpid(-1, &status, 0);


       The waitpid() system call suspends execution of the calling process until a child specified by pid argument has changed state.  By
       default, waitpid() waits only for terminated children, but this behavior is modifiable via  the  options  argument,  as  described
       below.


       The value of pid can be:


       < -1   meaning wait for any child process whose process group ID is equal to the absolute value of pid.


       -1     meaning wait for any child process.


       0      meaning wait for any child process whose process group ID is equal to that of the calling process.


       > 0    meaning wait for the child whose process ID is equal to the value of pid.

而 localtime是获取当前时间

localtime:根据给定的与1970年1月1日相减得秒数,取得当地的时区的时间和日期

time:此函数会返回从公元1970年1月1日的UTC时间从0时0分0秒算起到现在所经过的秒数

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值