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__

このマクロは、プリプロセッサが実行されている時間を表す文字列定数に展開されます。文字列定数には 8 文字が含まれ、次のようになり"23:59:01"ます。

GCC が現在の時刻を特定できない場合、警告メッセージが発行され (コンパイルごとに 1 回)、__TIME__展開され"??:??:??"ます。

于 2013-03-07T08:47:59.387 に答える
3
__TIME__

コンパイルの時間を定義します!

于 2013-03-07T08:48:25.620 に答える
3

__TIME__、 like__FILE__およびは、プリプロセッサが(通常はコンパイラの一部として)実行さ__LINE__れた時点に展開されるプリプロセッサ マクロです。したがって、これは固定文字列です。コードは次のようにコンパイルされます。

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

コードをいつコンパイルしたかによって異なります。

操作のタイミングを計るには、clock代わりに使用します。

于 2013-03-07T08:49:28.357 に答える
1

すでに述べたように、__TIME__実行時ではなくコンパイル時に評価されます。

実行時の実際の時間を知りたい場合は、次のようなものを使用する必要があります。-

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

時間を印刷する方法や、さまざまな形式を取得する方法は他にもあります。

PS。time.hを含める必要があります

于 2013-03-07T08:52:17.773 に答える
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 に答える