From: Steve Graegert <graegerts@gmail.com>
To: Glynn Clements <glynn@gclements.plus.com>
Cc: Luiz Fernando Capitulino <lcapitulino@conectiva.com.br>,
linux-c-programming@vger.kernel.org
Subject: Re: errno usage.
Date: Mon, 1 Aug 2005 09:22:55 +0200 [thread overview]
Message-ID: <6a00c8d5050801002272c713e8@mail.gmail.com> (raw)
In-Reply-To: <17131.30968.320224.626111@cerise.gclements.plus.com>
On 7/30/05, Glynn Clements <glynn@gclements.plus.com> wrote:
>
> Luiz Fernando Capitulino wrote:
>
> > I have a question about 'errno' which I'm postponing for some
> > time: is it a bad pratice to set 'errno' by hand in libraries
> > and even in ordinary programs?
> >
> > I mean, AFAIK 'errno' was created to store error codes from system
> > calls, but it's widely used by several libraries. Sometimes is even
> > helpful to set 'errno' in the program itself, something like:
> >
> > int get_foobar_info(char *value)
> > {
> > if (!value) {
> > errno = EINVAL;
> > return -1;
> > }
> >
> > ...
> >
> > return 0;
> > }
> >
> > Is it a bad pratice? Is there a 'limit' for 'errno' usage?
>
> No; there's no reason you can't use errno for your own purposes.
This is acceptable for most cases but is not recommended for
multithreaded applications since two or more threads may set the
globally defined errno variable to report errors, but its use may
result it nondeterministic behavior. POSIX avoids the use of errno
and provides for mechanisms that enable access to thread-specific
errno variables. Most POSIX.1c functions return the error code as the
return value with a value of zero indicating success.
When using errno in a multithreaded environment (which is not
explicitly recommended by POSIX but acceptable to retain
compatibility) ISO/IEC 9945:1-1996 defines that errno.h should be
included in every source file to make sure that every thread accesses
its own errno variable to check for errors. This is crucial to create
libraries that conform to POSIX and are reentrant.
> Many library functions will set errno; even if they don't set it
> explicitly, they can call libc (etc) function which can set it.
When setting errno manually it is always a good idea to store its
previous value in a temporary variable to be able to restore it when
other function/library calls read it to check for errors afterwards.
Regards
\Steve
next prev parent reply other threads:[~2005-08-01 7:22 UTC|newest]
Thread overview: 5+ messages / expand[flat|nested] mbox.gz Atom feed top
2005-07-29 15:00 errno usage Luiz Fernando Capitulino
2005-07-30 12:56 ` Glynn Clements
2005-08-01 7:22 ` Steve Graegert [this message]
2005-08-01 11:00 ` Glynn Clements
2005-08-01 9:46 ` Steve Graegert
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Save the following mbox file, import it into your mail client,
and reply-to-all from there: mbox
Avoid top-posting and favor interleaved quoting:
https://en.wikipedia.org/wiki/Posting_style#Interleaved_style
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to=6a00c8d5050801002272c713e8@mail.gmail.com \
--to=graegerts@gmail.com \
--cc=glynn@gclements.plus.com \
--cc=lcapitulino@conectiva.com.br \
--cc=linux-c-programming@vger.kernel.org \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
* If your mail client supports setting the In-Reply-To header
via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line
before the message body.
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for NNTP newsgroup(s).