Skip site navigation (1)Skip section navigation (2)
Date:      15 Jun 2021 21:26:04 -0400
From:      "John Levine" <johnl@iecc.com>
To:        freebsd-questions@freebsd.org
Cc:        rfg@tristatelogic.com
Subject:   Re: Is a successful call to write(2) atomic?
Message-ID:  <20210616012606.3C77A1183464@ary.qy>
In-Reply-To: <26258.1623802141@segfault.tristatelogic.com>

next in thread | previous in thread | raw e-mail | index | archive | help
It appears that Ronald F. Guilmette <rfg@tristatelogic.com> said:
>More to the point, if indeed each call to write() *is* "atomic"... at least
>in the sense that the given buffer will be treated like an indivisable whole,
>all of the way along its journey to some physical device... then why are
>users nontheless being encouraged, still, to "use some form of concurrency
>control"?  I mean what would be the point of that if in fact write() never
>busts up the hunks of data given to it into separate sub-hunks?

I think it depends on the device.  If I just want to write stuff to a log
file and not get it scrambled, this should do the trick:

  fd = open("somefile", O_CREAT|O_WRONLY|O_APPEND);

  /* put some stuff in buf[] */
  flock(fd, LOCK_EX);
  write(fd, buf, strlen(buf)): /* O_APPEND ensures it's added at the end */
  flock(fd, LOCK_UN);

R's.
John



Want to link to this message? Use this URL: <https://mail-archive.FreeBSD.org/cgi/mid.cgi?20210616012606.3C77A1183464>