我编写了一段代码来了解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
为什么会这样?
答案 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