| Recent
Articles |
Gates Has Google's Back On Censorship
Like Google and Yahoo, Microsoft has had to adjust its business practices to suit Chinese government information control personnel, not that there's anything wrong with that.
Unix Server Market Melting Away
Hewlett Packard, Sun, and IBM used to own the high-end hardware, high-priced proprietary OS market; all three support open-source operating systems today and that could accelerate the market's continued shrinkage.
MySQL Network For SCO OpenServer 6
The SCO Group announced availability of the MySQL Network for SCO OpenServer 6 at the National Retail Federation Show on Monday. This will allow their customers and channel partners to benefit from high performance, low-cost, easy-to-manage solutions platform.
Unixart: Tracking Site Problems
As some of you know, I have Foo-web.com
and some other sites on another web hosting site. Recently I noticed that I'd
frequently get locked up for thirty seconds or so while editing files on that
site...
Viruses and Unix
I was in a meeting last week where a customer was exploring switching from a Unix platform to Windows.
Windows vs. Unix - the Forgotten Facts (An Opinion)
"Windows Beat Unix, But It Won't Beat Linux" makes some valid points, but I think it leaves out one very important thing.
Lies and Statistics - the Unix Server Market
"There are three types of lies - lies, damn lies, and statistics." The source of that truth seems to be unknown, but it's sure on the mark for statistics reported in the Unix server market.
Microsoft Likes Unix?
The news from Microsoft is that they will be putting more Unix features into their server offerings according to...
|
 |
|
|
02.14.06
How Shells Call Other Programs
By
A.P. Lawrence
An article about How Linux or UNIX Understand which program to run got picked up by a few dozen RSS feeds recently. It's not a bad article.
It's actually slightly incorrect though.
The implication is that the shell reads the command and decides what to do. It's actually the kernel that makes a lot of the decisions.
For example, when you type "date", the shell looks through its PATH, finds /bin/date, but then immediately execs it: the kernel loads and runs "date".
You can see that if you run bash with strace and hen give it various commands. When you type "date", for example, the shell goes looking in its PATH:
stat64("/usr/kerberos/bin/date", 0xbffff750) = -1 ENOENT
(No such
file or directory)
stat64("/usr/local/bin/date", 0xbffff750) = -1 ENOENT
(No such file
or directory)
stat64("/bin/date",
{st_mode=S_IFREG|0755, st_size=38588, ...}) = 0
stat64("/bin/date",
{st_mode=S_IFREG|0755, st_size=38588, ...}) = 0
The shell then clones itself (like "fork" for us older Unix folk; see the man page) and execs /bin/date:
[pid 2088] --- SIGSTOP (Stopped (signal)) @ 0 (0) ---
[pid 2088] getpid() = 2088
[pid 2088] rt_sigprocmask(SIG_SETMASK, [], NULL, 8) = 0
[pid 2088] rt_sigaction(SIGTSTP, {SIG_DFL}, {SIG_IGN}, 8) = 0
[pid 2088] rt_sigaction(SIGTTIN, {SIG_DFL}, {SIG_IGN}, 8) = 0
[pid 2088] rt_sigaction(SIGTTOU, {SIG_DFL}, {SIG_IGN}, 8) = 0
[pid 2088] rt_sigaction(SIGINT, {SIG_DFL}, {0x8082b40, [],
SA_RESTORER, 0x4004feb8}, 8) = 0
[pid 2088] rt_sigaction(SIGQUIT, {SIG_DFL}, {SIG_IGN}, 8) = 0
[pid 2088] rt_sigaction(SIGTERM, {SIG_DFL}, {SIG_IGN}, 8) = 0
[pid 2088] rt_sigaction(SIGCHLD, {SIG_DFL}, {0x8074ff0, [],
SA_RESTORER, 0x4004feb8}, 8) = 0
[pid 2088] execve("/bin/date", ["date"], [/* 22 vars */]) = 0
If you type the name of a shell script instead, the shell does exactly the same thing, but the exec fails, which causes the shell to read the script and interpret it:
[pid 2086] execve("./shellscript", ["./shellscript"], [/* 21 vars
*/]) = -1 ENOEXEC (Exec format error)
[pid 2086] open("./shellscript", O_RDONLY|O_LARGEFILE) = 3
[pid 2086] read(3, "echo foo\n", 80) = 9
However, if the script starts with a "#!" and references some other interpreter, it's the kernel (not the shell) that calls that other interpreter. (like Perl, for example).
[pid 2141] execve("./t.pl", ["./t.pl"], [/* 21 vars */]) = 0
[pid 2141] uname({sys="Linux", node="kerio", ...}) = 0
[pid 2141] brk(0) = 0x804bc18
[pid 2141] open("/etc/ld.so.preload", O_RDONLY) = -1 ENOENT (No
such file or directory)
[pid 2141]
open("/usr/lib/perl5/5.8.0/i386-
linux-thread-multi/CORE/tls/i686/mmx
/libperl.so", O_RDONLY) = -1 ENOENT
(No such file or directory)
.. similar lines deleted
[pid 2141] stat64("/usr/lib/perl5/5.8.0/i386-linux-
thread-multi/CORE/tls/i686/
mmx", 0xbffff220) = -1 ENOENT (No such file or directory)
[pid 2141] open("/usr/lib/perl5/5.8.0/i386-linux-
thread-multi/CORE/libperl.so",
O_RDONLY) = 3
A minor point, perhaps, but more accurate.
*Originally Published at APLawrnce.com
About the Author:
A.P. Lawrence provides SCO Unix and Linux consulting services http://www.pcunix.com
|