1

我写了一段代码来了解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

为什么会这样?

4

5 回答 5

5

__TIME__是一个预定义的#define宏,在编译时被评估,即当编译器看到 时__TIME__,他将用当前时间替换它。

gcc 文档说:

__TIME__

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

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

于 2013-03-07T08:47:59.387 回答
3
__TIME__

定义编译时间!

于 2013-03-07T08:48:25.620 回答
3

__TIME____FILE__与and一样__LINE__,是一个预处理器宏,可扩展至预处理器运行的时间(通常作为编译器的一部分)。所以,它是一个固定的字符串——你的代码最终会像这样编译

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

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

要为操作计时,请clock改用。

于 2013-03-07T08:49:28.357 回答
1

添加到上述所有优秀答案:

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

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);
}
于 2013-03-07T08:51:16.407 回答
1

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

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

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

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

PS。您需要包含 time.h

于 2013-03-07T08:52:17.773 回答