【问题标题】:Why time is printed same in code for IPC为什么时间在 IPC 的代码中打印相同
【发布时间】:2013-03-07 08:44:25
【问题描述】:

我写了一段代码来了解IPC和读、写功能的基础。 由于读取功能是阻塞的,读取将等待数据被其他进程写入管道的另一端。 我在父进程中的 write() 之前进行了睡眠调用。在 read() 之前和之后的子进程中,我打印了时间。

#include <stdio.h>

int main()
{
    int fd[2], err, pid;
    FILE *fp;
    char *buf;

    buf = malloc(12);
    fp = fopen("BE1.txt","w");
    err = pipe(fd);
    if(err == -1)
        printf("Error while creating pipe");
    pid = fork();
    if(pid == -1)
        printf("Error while creating process");
    if(pid == 0)
    {
        fprintf(fp,"before read %s\n", __TIME__);
        //    fflush(fp);
        read(fd[0], buf, 12);
        fprintf(fp,"%s\n", buf);
        //   fflush(fp);
        fprintf(fp,"after read %s\n", __TIME__);
    }
    else
    {
        sleep(50);
        write(fd[1], "this is it", 12);
    }
    fclose(fp);
    return 0;
}

由于 read 处于阻塞模式,子进程应该在上面的代码中打印不同的时间。 但它的打印时间与

输出:

before read 19:48:16
this is it
after read 19:48:16

为什么会这样?

【问题讨论】:

  • Sleep 休眠指定的 _milli_seconds...
  • 尝试sleep(5000) 获得视觉差异...
  • 睡眠时间以秒为单位。在终止之前,程序等待大约一分钟

标签: c ipc


【解决方案1】:

__TIME__ 是一个预定义的#define 宏,在编译时进行评估,即当编译器看到__TIME__ 时,他会将其替换为当前时间。

gcc 文档说:

__TIME__

此宏扩展为一个字符串常量,描述预处理器运行的时间。字符串常量包含八个字符,看起来像"23:59:01"

如果 GCC 无法确定当前时间,它将发出警告消息(每次编译一次),__TIME__ 将扩展为 "??:??:??"

【讨论】:

  • 如果替换为当前时间,那么在读取调用后,时间应该替换为当前时间??
  • @Ajay:不。您的问题可能是来自(通常)解释型语言,如 Python、PHP 等吗?如果是这样:当 C++ 代码被编译时,它被编译成一个固定的二进制文件。编译器会将编译时那个宏替换为编译时
【解决方案2】:
__TIME__

定义编译时间!

【讨论】:

    【解决方案3】:

    __TIME____FILE____LINE__ 一样,是一个预处理器宏,可扩展到预处理器运行时(通常作为编译器的一部分)。所以,它是一个固定的字符串——你的代码最终会被编译成

    fprintf(fp,"after read %s\n", "19:49:16");
    

    取决于您编译代码的确切时间。

    要为操作计时,请改用clock

    【讨论】:

      【解决方案4】:

      补充以上所有优秀答案:

      如果你想打印时间,那么如何:

      void printCurrentTime()
      {
        time_t rawtime;
        struct tm * timeinfo;
        char buffer [80];
      
        time ( &rawtime );
        timeinfo = localtime ( &rawtime );
      
        strftime (buffer,80,"%Y-%m-%d-%H-%M-%S",timeinfo);
        puts (buffer);
      }
      

      【讨论】:

        【解决方案5】:

        如前所述,__TIME__ 在编译时而不是运行时进行评估。

        如果你想要运行时的实际时间,你需要使用类似的东西:-

         time_t t;
         time(&t);
         printf("%s", ctime(&t));
        

        还有其他打印时间的方法和获取不同格式的方法。

        PS。您需要包含 time.h

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2011-03-17
          • 2019-01-31
          • 2014-07-20
          • 1970-01-01
          • 2013-08-20
          • 1970-01-01
          相关资源
          最近更新 更多