3

マニュアルページで指定されているように、ソースに#include <unistd.h>ヘッダーが含まれていますsync(2)。ただし、プログラムをコンパイルすると、次の警告が表示されます。

./test.c:25:3:警告:関数'sync'の暗黙の宣言</p>

ここで何かが足りませんか?以下は私の小さなテストプログラムのソースコードです。

#include <fcntl.h>
#include <unistd.h>
#include <stdio.h>

int main(int argc, char *argv[]) {
  // Open file ./test.txt and append to it
  int fd = open("./test.txt", O_RDWR | O_CREAT | O_TRUNC, 0);
  if (fd < 0) {
    perror("Failure to open file: ");
    close(fd);
    return(1);
  }
  // Write Hello World\n\0 100 time to ./test.txt
  for (int i = 0; i < 100; ++i) {
    ssize_t bytes = write(fd, "Hello World\n", 12); // 12 for Null '\0'
    if (bytes != 12) {
      perror("Failure to write to file");
      close(fd);
      return(1);
    }
  }

  // Close the file for the exercise
  sync();
  close(fd);

  // This will allow lseek to go back
  fd = open("./test.txt", O_RDWR, 0);
  // This will not allow lseek to go back
  //fd = open("./test.txt", O_RDWR | O_APPEND, 0);
  if (fd < 0) {
    perror("Failure to open files: ");
    close(fd);
    return(1);
  }

  if (lseek(fd, -500, SEEK_END) == -1) {
    perror("Test failed: ");
    close(fd);
    return(1);
  }

  ssize_t bytes = write(fd, "\n\nHello Dog\n\n", 14);
  if(bytes != 14) {
    perror("Failure to write: ");
    close(fd);
    return(1);
  }

  write(1, "Done!!!\n", 9);
  close(fd);


return(0);
}
4

1 に答える 1

1

コメントで、私は尋ねました:

コンパイラのオプションは何ですか? -D_XOPEN_SOURCE=700(または他の値を)設定しましたか?-std=c99、またはそのようなものの代わりに指定しまし-std=gnu99たか?

応答は次のとおりでした。

-std=c99forループ内で変数の初期化を許可していました。-std=gnu99トリックを行うように見えました。

を設定するときは-std=c99、C99 の一部ではないすべてのシンボルを明示的に要求する必要があります (少なくとも最初の概算まで)。-std=gnu99あなたが発見したように、すべてのシンボルを取得する最も簡単な方法は、を使用することです。必要に応じて、このヘッダーなどのオプションを使用して、より正確にすることができます (私はそれを と呼びますposixver.h):

#ifndef JLSS_ID_POSIXVER_H
#define JLSS_ID_POSIXVER_H

/*
** Include this file before including system headers.  By default, with
** C99 support from the compiler, it requests POSIX 2001 support.  With
** C89 support only, it requests POSIX 1997 support.  Override the
** default behaviour by setting either _XOPEN_SOURCE or _POSIX_C_SOURCE.
*/

/* _XOPEN_SOURCE 700 is loosely equivalent to _POSIX_C_SOURCE 200809L */
/* _XOPEN_SOURCE 600 is loosely equivalent to _POSIX_C_SOURCE 200112L */
/* _XOPEN_SOURCE 500 is loosely equivalent to _POSIX_C_SOURCE 199506L */

#if !defined(_XOPEN_SOURCE) && !defined(_POSIX_C_SOURCE)
#if __STDC_VERSION__ >= 199901L
#define _XOPEN_SOURCE 600   /* SUS v3, POSIX 1003.1 2004 (POSIX 2001 + Corrigenda) */
#else
#define _XOPEN_SOURCE 500   /* SUS v2, POSIX 1003.1 1997 */
#endif /* __STDC_VERSION__ */
#endif /* !_XOPEN_SOURCE && !_POSIX_C_SOURCE */

#endif /* JLSS_ID_POSIXVER_H */

Linux では、(POSIX 2008 の場合) 700 に設定することを好むかもしれませんが、私が使用_XOPEN_SOURCEしているマシンの多くはそれを適切にサポートしていません。

于 2012-07-01T05:53:46.760 に答える