为什么在IPC的代码中打印时间相同

时间:2013-03-07 08:44:25

标签: c ipc

我编写了一段代码来了解IPC以及读写函数的基本知识。 由于读取功能是阻塞的,因此读取将等待,直到其他进程将数据写入管道的另一端。 我在父进程中的write()之前进行了sleep调用。在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;
}

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

相同

输出:

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

为什么会这样?

5 个答案:

答案 0 :(得分:5)

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

gcc文档说:

  

__TIME__

     

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

     

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

答案 1 :(得分:3)

__TIME__

定义编译的时间!

答案 2 :(得分:3)

__TIME__,如__FILE____LINE__,是一个预处理器宏,可在运行预处理器时扩展到的时间(通常作为编译器的一部分) )。所以,它是一个固定的字符串 - 你的代码最终将被编译为

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

取决于您编译代码的具体时间。

对于操作计时,请改用clock

答案 3 :(得分: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);
}

答案 4 :(得分:1)

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

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

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

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

PS。你需要包括time.h