FC5 system() call
Steven W. Orr
steveo at syslang.net
Fri Sep 22 18:16:56 UTC 2006
On Friday, Sep 22nd 2006 at 07:02 -0700, quoth Brian D. McGrew:
=>Morning all,
=>
=>Using FC3 life is good. I compile up my code on FC5 with gcc-4.1.1 and
=>all of a sudden the system() call is broken.
=>
=>The code:
=>
=>int num_proc = system("cat /proc/cpuinfo | grep -c processor >>
=>/dev/null 2>&!");
=>
=>On every FC3 machine we've run on, this works fine and returns 1, 2 or
=>4.
=>
=>Likewise on every FC5 machine we've ever run on, it returns -1, nothing
=>else. The man page for system() hasn't changed and I can't find any
=>other information about it.
=>
=>Any ideas?
=>
=>:b!
First of all, I suspect you intended to say 2>&1 instead of 2>&!
Next, why say
cat /proc/cpuinfo | grep -c processor
instead of just saying
grep -c processor /proc/cpuinfo
?
Third, What happens if you issue the command directly from the
commandline?
Fourth, why say >> instead of >? Not a big deal but I'm just curious about
the intended semantics of appending to /dev/null.
Fifth, why redirect stderr to stdout in the first place? Is there some
sort of suspicion that /proc/cpuinfo might not be there?
Sixth, whenever you get a system error, you need to find out why you're
getting it and the proper way to get started is to call perror(3) which
looks at the value of errno.
And last, I have no idea what your application is doing, so your error is
more likely the result of a process problem and not related to
permissions. Use this as a suggestion to apply the information from errno
and perror to possible fork/exec problems instead of problems with
open/read/close sequences.
Be aware that system is very handy but has a higher overhead than what
people might expect. There's nothing wrong with using it, but you should
know that when you use it you are forking your process which creates a
full duplicate. Then that new child execs a shell and runs the specified
command. The child then exits and the system call then returns the exit
status of the child. A simple open, read loop, close is going to be a lot
more efficient.
More information about the fedora-list
mailing list