|
|
1.1 root 1: .\" @(#)p5 6.3 (Berkeley) 5/10/86
2: .\"
3: .NH
4: PROCESSES
5: .PP
6: It is often easier to use a program written
7: by someone else than to invent one's own.
8: This section describes how to
9: execute a program from within another.
10: .NH 2
11: The ``System'' Function
12: .PP
13: The easiest way to execute a program from another
14: is to use
15: the standard library routine
16: .UL system .
17: .UL system
18: takes one argument, a command string exactly as typed
19: at the terminal
20: (except for the newline at the end)
21: and executes it.
22: For instance, to time-stamp the output of a program,
23: .P1
24: main()
25: {
26: system("date");
27: /* rest of processing */
28: }
29: .P2
30: If the command string has to be built from pieces,
31: the in-memory formatting capabilities of
32: .UL sprintf
33: may be useful.
34: .PP
35: Remember than
36: .UL getc
37: and
38: .UL putc
39: normally buffer their input;
40: terminal I/O will not be properly synchronized unless
41: this buffering is defeated.
42: For output, use
43: .UL fflush ;
44: for input, see
45: .UL setbuf
46: in the appendix.
47: .NH 2
48: Low-Level Process Creation \(em Execl and Execv
49: .PP
50: If you're not using the standard library,
51: or if you need finer control over what
52: happens,
53: you will have to construct calls to other programs
54: using the more primitive routines that the standard
55: library's
56: .UL system
57: routine is based on.
58: .PP
59: The most basic operation is to execute another program
60: .ul
61: without
62: .IT returning ,
63: by using the routine
64: .UL execl .
65: To print the date as the last action of a running program,
66: use
67: .P1
68: execl("/bin/date", "date", NULL);
69: .P2
70: The first argument to
71: .UL execl
72: is the
73: .ul
74: file name
75: of the command; you have to know where it is found
76: in the file system.
77: The second argument is conventionally
78: the program name
79: (that is, the last component of the file name),
80: but this is seldom used except as a place-holder.
81: If the command takes arguments, they are strung out after
82: this;
83: the end of the list is marked by a
84: .UL NULL
85: argument.
86: .PP
87: The
88: .UL execl
89: call
90: overlays the existing program with
91: the new one,
92: runs that, then exits.
93: There is
94: .ul
95: no
96: return to the original program.
97: .PP
98: More realistically,
99: a program might fall into two or more phases
100: that communicate only through temporary files.
101: Here it is natural to make the second pass
102: simply an
103: .UL execl
104: call from the first.
105: .PP
106: The one exception to the rule that the original program never gets control
107: back occurs when there is an error, for example if the file can't be found
108: or is not executable.
109: If you don't know where
110: .UL date
111: is located, say
112: .P1
113: execl("/bin/date", "date", NULL);
114: execl("/usr/bin/date", "date", NULL);
115: fprintf(stderr, "Someone stole 'date'\en");
116: .P2
117: .PP
118: A variant of
119: .UL execl
120: called
121: .UL execv
122: is useful when you don't know in advance how many arguments there are going to be.
123: The call is
124: .P1
125: execv(filename, argp);
126: .P2
127: where
128: .UL argp
129: is an array of pointers to the arguments;
130: the last pointer in the array must be
131: .UL NULL
132: so
133: .UL execv
134: can tell where the list ends.
135: As with
136: .UL execl ,
137: .UL filename
138: is the file in which the program is found, and
139: .UL argp[0]
140: is the name of the program.
141: (This arrangement is identical to the
142: .UL argv
143: array for program arguments.)
144: .PP
145: Neither of these routines provides the niceties of normal command execution.
146: There is no automatic search of multiple directories \(em
147: you have to know precisely where the command is located.
148: Nor do you get the expansion of metacharacters like
149: .UL < ,
150: .UL > ,
151: .UL * ,
152: .UL ? ,
153: and
154: .UL []
155: in the argument list.
156: If you want these, use
157: .UL execl
158: to invoke the shell
159: .UL sh ,
160: which then does all the work.
161: Construct a string
162: .UL commandline
163: that contains the complete command as it would have been typed
164: at the terminal, then say
165: .P1
166: execl("/bin/sh", "sh", "-c", commandline, NULL);
167: .P2
168: The shell is assumed to be at a fixed place,
169: .UL /bin/sh .
170: Its argument
171: .UL -c
172: says to treat the next argument
173: as a whole command line, so it does just what you want.
174: The only problem is in constructing the right information
175: in
176: .UL commandline .
177: .NH 2
178: Control of Processes \(em Fork and Wait
179: .PP
180: So far what we've talked about isn't really all that useful by itself.
181: Now we will show how to regain control after running
182: a program with
183: .UL execl
184: or
185: .UL execv .
186: Since these routines simply overlay the new program on the old one,
187: to save the old one requires that it first be split into
188: two copies;
189: one of these can be overlaid, while the other waits for the new,
190: overlaying program to finish.
191: The splitting is done by a routine called
192: .UL fork :
193: .P1
194: proc_id = fork();
195: .P2
196: splits the program into two copies, both of which continue to run.
197: The only difference between the two is the value of
198: .UL proc_id ,
199: the ``process id.''
200: In one of these processes (the ``child''),
201: .UL proc_id
202: is zero.
203: In the other
204: (the ``parent''),
205: .UL proc_id
206: is non-zero; it is the process number of the child.
207: Thus the basic way to call, and return from,
208: another program is
209: .P1
210: if (fork() == 0)
211: execl("/bin/sh", "sh", "-c", cmd, NULL); /* in child */
212: .P2
213: And in fact, except for handling errors, this is sufficient.
214: The
215: .UL fork
216: makes two copies of the program.
217: In the child, the value returned by
218: .UL fork
219: is zero, so it calls
220: .UL execl
221: which does the
222: .UL command
223: and then dies.
224: In the parent,
225: .UL fork
226: returns non-zero
227: so it skips the
228: .UL execl.
229: (If there is any error,
230: .UL fork
231: returns
232: .UL -1 ).
233: .PP
234: More often, the parent wants to wait for the child to terminate
235: before continuing itself.
236: This can be done with
237: the function
238: .UL wait :
239: .P1
240: int status;
241:
242: if (fork() == 0)
243: execl(...);
244: wait(&status);
245: .P2
246: This still doesn't handle any abnormal conditions, such as a failure
247: of the
248: .UL execl
249: or
250: .UL fork ,
251: or the possibility that there might be more than one child running simultaneously.
252: (The
253: .UL wait
254: returns the
255: process id
256: of the terminated child, if you want to check it against the value
257: returned by
258: .UL fork .)
259: Finally, this fragment doesn't deal with any
260: funny behavior on the part of the child
261: (which is reported in
262: .UL status ).
263: Still, these three lines
264: are the heart of the standard library's
265: .UL system
266: routine,
267: which we'll show in a moment.
268: .PP
269: The
270: .UL status
271: returned by
272: .UL wait
273: encodes in its low-order eight bits
274: the system's idea of the child's termination status;
275: it is 0 for normal termination and non-zero to indicate
276: various kinds of problems.
277: The next higher eight bits are taken from the argument
278: of the call to
279: .UL exit
280: which caused a normal termination of the child process.
281: It is good coding practice
282: for all programs to return meaningful
283: status.
284: .PP
285: When a program is called by the shell,
286: the three file descriptors
287: 0, 1, and 2 are set up pointing at the right files,
288: and all other possible file descriptors
289: are available for use.
290: When this program calls another one,
291: correct etiquette suggests making sure the same conditions
292: hold.
293: Neither
294: .UL fork
295: nor the
296: .UL exec
297: calls affects open files in any way.
298: If the parent is buffering output
299: that must come out before output from the child,
300: the parent must flush its buffers
301: before the
302: .UL execl .
303: Conversely,
304: if a caller buffers an input stream,
305: the called program will lose any information
306: that has been read by the caller.
307: .NH 2
308: Pipes
309: .PP
310: A
311: .ul
312: pipe
313: is an I/O channel intended for use
314: between two cooperating processes:
315: one process writes into the pipe,
316: while the other reads.
317: The system looks after buffering the data and synchronizing
318: the two processes.
319: Most pipes are created by the shell,
320: as in
321: .P1
322: ls | pr
323: .P2
324: which connects the standard output of
325: .UL ls
326: to the standard input of
327: .UL pr .
328: Sometimes, however, it is most convenient
329: for a process to set up its own plumbing;
330: in this section, we will illustrate how
331: the pipe connection is established and used.
332: .PP
333: The system call
334: .UL pipe
335: creates a pipe.
336: Since a pipe is used for both reading and writing,
337: two file descriptors are returned;
338: the actual usage is like this:
339: .P1
340: int fd[2];
341:
342: stat = pipe(fd);
343: if (stat == -1)
344: /* there was an error ... */
345: .P2
346: .UL fd
347: is an array of two file descriptors, where
348: .UL fd[0]
349: is the read side of the pipe and
350: .UL fd[1]
351: is for writing.
352: These may be used in
353: .UL read ,
354: .UL write
355: and
356: .UL close
357: calls just like any other file descriptors.
358: .PP
359: If a process reads a pipe which is empty,
360: it will wait until data arrives;
361: if a process writes into a pipe which
362: is too full, it will wait until the pipe empties somewhat.
363: If the write side of the pipe is closed,
364: a subsequent
365: .UL read
366: will encounter end of file.
367: .PP
368: To illustrate the use of pipes in a realistic setting,
369: let us write a function called
370: .UL popen(cmd,\ mode) ,
371: which creates a process
372: .UL cmd
373: (just as
374: .UL system
375: does),
376: and returns a file descriptor that will either
377: read or write that process, according to
378: .UL mode .
379: That is,
380: the call
381: .P1
382: fout = popen("pr", WRITE);
383: .P2
384: creates a process that executes
385: the
386: .UL pr
387: command;
388: subsequent
389: .UL write
390: calls using the file descriptor
391: .UL fout
392: will send their data to that process
393: through the pipe.
394: .PP
395: .UL popen
396: first creates the
397: the pipe with a
398: .UL pipe
399: system call;
400: it then
401: .UL fork s
402: to create two copies of itself.
403: The child decides whether it is supposed to read or write,
404: closes the other side of the pipe,
405: then calls the shell (via
406: .UL execl )
407: to run the desired process.
408: The parent likewise closes the end of the pipe it does not use.
409: These closes are necessary to make end-of-file tests work properly.
410: For example, if a child that intends to read
411: fails to close the write end of the pipe, it will never
412: see the end of the pipe file, just because there is one writer
413: potentially active.
414: .P1
415: #include <stdio.h>
416:
417: #define READ 0
418: #define WRITE 1
419: #define tst(a, b) (mode == READ ? (b) : (a))
420: static int popen_pid;
421:
422: popen(cmd, mode)
423: char *cmd;
424: int mode;
425: {
426: int p[2];
427:
428: if (pipe(p) < 0)
429: return(NULL);
430: if ((popen_pid = fork()) == 0) {
431: close(tst(p[WRITE], p[READ]));
432: close(tst(0, 1));
433: dup(tst(p[READ], p[WRITE]));
434: close(tst(p[READ], p[WRITE]));
435: execl("/bin/sh", "sh", "-c", cmd, 0);
436: _exit(1); /* disaster has occurred if we get here */
437: }
438: if (popen_pid == -1)
439: return(NULL);
440: close(tst(p[READ], p[WRITE]));
441: return(tst(p[WRITE], p[READ]));
442: }
443: .P2
444: The sequence of
445: .UL close s
446: in the child
447: is a bit tricky.
448: Suppose
449: that the task is to create a child process that will read data from the parent.
450: Then the first
451: .UL close
452: closes the write side of the pipe,
453: leaving the read side open.
454: The lines
455: .P1
456: close(tst(0, 1));
457: dup(tst(p[READ], p[WRITE]));
458: .P2
459: are the conventional way to associate the pipe descriptor
460: with the standard input of the child.
461: The
462: .UL close
463: closes file descriptor 0,
464: that is, the standard input.
465: .UL dup
466: is a system call that
467: returns a duplicate of an already open file descriptor.
468: File descriptors are assigned in increasing order
469: and the first available one is returned,
470: so
471: the effect of the
472: .UL dup
473: is to copy the file descriptor for the pipe (read side)
474: to file descriptor 0;
475: thus the read side of the pipe becomes the standard input.
476: (Yes, this is a bit tricky, but it's a standard idiom.)
477: Finally, the old read side of the pipe is closed.
478: .PP
479: A similar sequence of operations takes place
480: when the child process is supposed to write
481: from the parent instead of reading.
482: You may find it a useful exercise to step through that case.
483: .PP
484: The job is not quite done,
485: for we still need a function
486: .UL pclose
487: to close the pipe created by
488: .UL popen .
489: The main reason for using a separate function rather than
490: .UL close
491: is that it is desirable to wait for the termination of the child process.
492: First, the return value from
493: .UL pclose
494: indicates whether the process succeeded.
495: Equally important when a process creates several children
496: is that only a bounded number of unwaited-for children
497: can exist, even if some of them have terminated;
498: performing the
499: .UL wait
500: lays the child to rest.
501: Thus:
502: .P1
503: #include <signal.h>
504:
505: pclose(fd) /* close pipe fd */
506: int fd;
507: {
508: register r, (*hstat)(), (*istat)(), (*qstat)();
509: int status;
510: extern int popen_pid;
511:
512: close(fd);
513: istat = signal(SIGINT, SIG_IGN);
514: qstat = signal(SIGQUIT, SIG_IGN);
515: hstat = signal(SIGHUP, SIG_IGN);
516: while ((r = wait(&status)) != popen_pid && r != -1);
517: if (r == -1)
518: status = -1;
519: signal(SIGINT, istat);
520: signal(SIGQUIT, qstat);
521: signal(SIGHUP, hstat);
522: return(status);
523: }
524: .P2
525: The calls to
526: .UL signal
527: make sure that no interrupts, etc.,
528: interfere with the waiting process;
529: this is the topic of the next section.
530: .PP
531: The routine as written has the limitation that only one pipe may
532: be open at once, because of the single shared variable
533: .UL popen_pid ;
534: it really should be an array indexed by file descriptor.
535: A
536: .UL popen
537: function, with slightly different arguments and return value is available
538: as part of the standard I/O library discussed below.
539: As currently written, it shares the same limitation.
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.