From: Geoff Clare on
Janis Papanagnou wrote:

>> 256 represents the return code of grep, indicating that it did not find
>> any text lines matching its search pattern "/etc/".
>
> man 1 grep
>
> Normally, exit status is 0 if selected lines are found and 1 otherwise.
> But the exit status is 2 if an error occurred
>
> man 3 system
>
> The value returned is -1 on error (e.g. fork failed), and the return
> status of the command otherwise. This latter return status is in the
> format specified in wait(2). Thus, the exit code of the command will be
> WEXITSTATUS(status). In case /bin/sh could not be executed, the exit
> status will be that of a command that does exit(127).
>
> man 2 wait
>
> WEXITSTATUS(status)
> evaluates to the least significant eight bits of the return code of the
> child which terminated, which may have been set as the argument to a call
> to exit() or as the argument for a return statement in the main program.
>
>>
>> (actually, I think 256 is the combined return code of the grep command
>> and the shell that was spawned to execute it.)
>
> The shells alone return codes above 128 (resp. 256, depending on the shell)
> to return signal numbers that lead to a process's termination. Just BTW.
>
> I haven't fiddled much with system(3) - the value of 256 looks somewhat
> strange to me

grep's exit status was 1, as per the man page quote above.
The 256 return from system() "represents" this exit status, in
that WEXITSTATUS(256) would evaluate to 1.

The return value from system() (and wait(), waitpid(), etc.) has
to be able to indicate termination by a signal as well as by
exiting. That's why it is in an encoded form, and you have to
use WIFEXITED, WIFSIGNALED, WEXITSTATUS, etc. to decode it.

--
Geoff Clare <netnews(a)gclare.org.uk>

From: Jonathan de Boyne Pollard on
>
>
> I changed the directory [...]
>
No, you did not.

> What am I trying to do here?
>
Our collective telepathy is on the fritz, today.

From: Phred Phungus on
Ian Collins wrote:
> Phred Phungus wrote:
>>
>> I don't post to be told that I'm putting forth no effort. Why don't
>> you tell me what I didn't read today,
>
> One of W. Richard Stevens Unix programming books? They will give you
> the background to make better sense of man pages and other documentation.
>

It arrived today. It looks great:

http://www.apuebook.com/


$ ls *
DISCLAIMER fig12.16 fig1.6 fig17.36 fig3.2 fig8.25
fig10.10 fig12.17 fig16.10 fig17.37 fig3.4 fig8.28
fig10.11 fig12.4 fig16.14 fig17.38 fig4.12 fig8.29
fig10.12 fig12.8 fig16.15 fig17.39 fig4.16 fig8.3
fig10.14 fig1.3 fig16.16 fig17.4 fig4.21 fig8.30
fig10.15 fig13.1 fig16.17 fig17.40 fig4.22 fig8.5
fig10.18 fig13.6 fig16.18 fig17.6 fig4.23 fig8.6
fig10.19 fig13.7 fig16.20 fig1.8 fig4.24 fig8.8
fig10.2 fig13.8 fig16.8 fig18.10 fig4.25 fig9.11
fig10.20 fig1.4 fig16.9 fig18.11 fig4.3 figB.1
fig10.22 fig14.1 fig1.7 fig18.12 fig4.8 figB.3
fig10.23 fig14.12 fig17.10 fig18.13 fig4.9 figB.4
fig10.24 fig14.16 fig17.11 fig18.14 fig5.11 figC.1
fig10.25 fig14.17 fig17.12 fig18.15 fig5.12 figC.11
fig10.26 fig14.18 fig17.13 fig18.16 fig5.13 figC.12
fig10.28 fig14.19 fig17.14 fig18.17 fig5.4 figC.13
fig10.29 fig14.29a fig17.15 fig18.18 fig5.5 figC.14
fig10.30 fig14.29b fig17.16 fig18.20 fig6.2 figC.15
fig10.5 fig14.32 fig17.17 fig18.21 fig7.1 figC.16
fig10.6 fig14.5 fig17.19 fig18.22 fig7.11 figC.17
fig10.7 fig14.6 fig17.20 fig1.9 fig7.13 figC.18
fig10.8 fig14.7 fig17.21 fig19.10 fig7.14 figC.20
fig10.9 fig14.9 fig17.22 fig19.11 fig7.16 figC.21
fig1.10 fig1.5 fig17.23 fig19.12 fig7.3 figC.3
fig11.10 fig15.11 fig17.24 fig19.13 fig7.4 figC.4
fig11.11 fig15.12 fig17.25 fig19.17 fig7.9 figC.5
fig11.12 fig15.14 fig17.26 fig19.8 fig8.1 figC.6
fig11.13 fig15.15 fig17.27 fig19.9 fig8.12 figC.7
fig11.14 fig15.17 fig17.28 fig20.3 fig8.13 figC.9
fig11.2 fig15.18 fig17.29 fig2.12 fig8.16 Make.defines.freebsd
fig11.3 fig15.19 fig17.30 fig2.13 fig8.17 Make.defines.linux
fig11.4 fig15.31 fig17.31 fig2.15 fig8.20 Make.defines.macos
fig11.5 fig15.33 fig17.32 fig2.16 fig8.21 Make.defines.solaris
fig12.11 fig15.5 fig17.33 fig3.1 fig8.22 Makefile
fig12.12 fig15.6 fig17.34 fig3.10 fig8.23 README
fig12.13 fig15.7 fig17.35 fig3.11 fig8.24 systype.sh

advio:
catgetmsg.c freebsd.mk macos.mk nonblockw.c solaris.mk
devzero.c linux.mk mcopy.c pendlock.c

call:
call.c escape.c linux.mk macos.mk put.c take.c
call.h freebsd.mk loop.poll.c main.c solaris.mk takeput.c

calld:
calld.h ctlstr.c expectstr.c loop.c sendstr.c ttydial.c
childdial.c debug.c freebsd.mk macos.mk sigchld.c ttyopen.c
cliargs.c devfile.c linux.mk main.c solaris.mk
client.c dialfile.c lock.c request.c sysfile.c

daemons:
freebsd.mk linux.mk macos.mk reread.c solaris.mk
init.c lockfile.c reread2.c single.c

datafiles:
freebsd.mk getpwnam.c linux.mk macos.mk solaris.mk

db:
apue_db.h db.c freebsd.mk linux.mk macos.mk solaris.mk t4.c

environ:
cmd1.c doatexit.c getrlimit.c linux.mk opendata.c testjmp.c
cmd2.c freebsd.mk hello1.c macos.mk solaris.mk

exercises:
asyncsocket.c getpw44bsd.c linux.mk prtime.c sleepus_poll.c
freebsd.mk getpwsvr4.c macos.mk sizepipe.c sleepus_select.c
getlogin.c goodexit.c openmax.c sleep.c solaris.mk

file:
access.c fileflags.c hello.c ls1.c solaris.mk unlink.c
cdpwd.c filetype.c hole.c macos.mk testerror.c zap.c
changemod.c freebsd.mk linux.mk mycd.c uidgid.c
devrdev.c ftw4.c longpath.c seek.c umask.c

include:
apue.h

ipc:
add2.c freebsd.mk myuclc.c pipe4.c solaris.mk tshm.c
add2stdio.c linux.mk pipe1.c popen1.c spipe4.c
fifo1.c macos.mk pipe2.c popen2.c tellwait.c

ipp:
freebsd.mk linux.mk print.c print.h util.c
ipp.h macos.mk printd.c solaris.mk

lib:
bsd_ptyopen.c linux.mk popen.c sendfd.c solaris.mk
bufargs.c linux_ptyopen.c prexit.c servaccept.c spipe.c
cliconn.c lockreg.c prmask.c servlisten.c tellwait.c
clrfl.c locktest.c ptyfork.c setfl.c ttymodes.c
daemonize.c macos.mk readn.c signal.c writen.c
error.c nspipe.c recvfd.c signalintr.c
errorlog.c openmax.c semaph.c sleep.c
freebsd.mk pathalloc.c senderr.c sleepus.c

lock:
deadlock.c freebsd.mk linux.mk macos.mk mandatory.c solaris.mk

mycat:
fgetsfputs.c freebsd.mk getcputc.c linux.mk macos.mk mycat.c
solaris.mk

open:
freebsd.mk linux.mk macos.mk open.c open.h solaris.mk

opend:
client.c linux.mk loop.select.c main.c request.c
freebsd.mk loop.poll.c macos.mk opend.h solaris.mk

opend.fe:
cliargs.c linux.mk main.c request.c
freebsd.mk macos.mk opend.h solaris.mk

open.fe:
freebsd.mk linux.mk macos.mk main.c open.c open.h solaris.mk

proc:
awkexample fork1.c pracct.c system.c tellwait2.c wait1.c
echoall.c fork2.c pruids.c systest1.c test1.c zombie.c
echoarg.c freebsd.mk shell1.c systest2.c times1.c
exec1.c linux.mk shell2.c systest3.c vfork1.c
exec2.c macos.mk solaris.mk tellwait1.c vfork3.c

pty:
driver.c freebsd.mk linux.mk loop.c macos.mk main.c solaris.mk

sess:
freebsd.mk linux.mk macos.mk orphan3.c solaris.mk

signals:
abort.c freebsd.mk mask.c reenter.c sigusr.c solaris.mk system.c
child.c linux.mk read1.c setops.c sleep1.c suspend1.c tsleep2.c
critical.c macos.mk read2.c sigtstp.c sleep2.c suspend2.c

sockets:
bindunix.c findsvc.c linux.mk ruptime.c ruptime-dg.c servlisten.c
bo.c freebsd.mk macos.mk ruptimed.c sendfd2.c solaris.mk
clconn.c initsrv1.c recvfd2.c ruptimed-dg.c sendfd.c spipe.c
cliconn.c initsrv2.c recvfd.c ruptimed-fd.c servaccept.c

std:
conf.c.modified linux.mk makeconf.awk pathconf.sym solaris.mk
sysopt.sym
freebsd.mk macos.mk makeopt.awk pathopt.sym sysconf.sym

stdio:
buf.c freebsd.mk linux.mk macos.mk solaris.mk tempfiles.c tempnam.c

streams:
cliconn.c linux.mk recvfd.c servlisten.c strlist.c
freebsd.mk macos.mk sendfd.c solaris.mk t_isastream.c
isastream.c ptyopen.c servaccept.c spipe.c

termios:
csize.c getpass.c macos.mk t_getpass.c t_ttyname.c
ctermid.c isatty.c settty.c t_isatty.c ttyname.c
freebsd.mk linux.mk solaris.mk t_raw.c winch.c

threadctl:
atfork.c freebsd.mk getenv2.c linux.mk solaris.mk timeout.c
detach.c getenv1.c getenv3.c macos.mk suspend.c

threads:
badexit2.c exitstatus.c macos.mk mutex3.c threadid.c
cleanup.c freebsd.mk mutex1.c rwlock.c
condvar.c linux.mk mutex2.c solaris.mk
$
--
fred
From: Ben Bacarisse on
Phred Phungus <Phred(a)example.invalid> writes:

> Ian Collins wrote:
>> Phred Phungus wrote:
>>>
>>> I don't post to be told that I'm putting forth no effort. Why
>>> don't you tell me what I didn't read today,
>>
>> One of W. Richard Stevens Unix programming books? They will give
>> you the background to make better sense of man pages and other
>> documentation.
>
> It arrived today. It looks great:
>
> http://www.apuebook.com/
>
> $ ls *

Why?

<snip list of files from the book's source code>
The book's source code is available online at the link you posted.

--
Ben.
From: Phred Phungus on
Ben Bacarisse wrote:
> Phred Phungus <Phred(a)example.invalid> writes:
>
>> Ian Collins wrote:
>>> Phred Phungus wrote:
>>>> I don't post to be told that I'm putting forth no effort. Why
>>>> don't you tell me what I didn't read today,
>>> One of W. Richard Stevens Unix programming books? They will give
>>> you the background to make better sense of man pages and other
>>> documentation.
>> It arrived today. It looks great:
>>
>> http://www.apuebook.com/
>>
>> $ ls *
>
> Why?
>
> <snip list of files from the book's source code>
> The book's source code is available online at the link you posted.
>

To have the source available without a million keystrokes is huge. I'm
trying to get it set up, but I think I'm having problems with the
include directive:


$ gcc -D_GNU_SOURCE -std=c99 -Iinclude -Wall -Wextra fig1.10.1.c -o out
fig1.10.1.c:38: warning: unused parameter �signo�
/tmp/ccsCEfpI.o: In function `main':
fig1.10.1.c:(.text+0x40): undefined reference to `err_sys'
fig1.10.1.c:(.text+0xa7): undefined reference to `err_sys'
fig1.10.1.c:(.text+0xe8): undefined reference to `err_ret'
fig1.10.1.c:(.text+0x12f): undefined reference to `err_sys'
collect2: ld returned 1 exit status
$ gcc -D_GNU_SOURCE -std=c99 -Iinclude -Wall -Wextra fig1.10.1.c -o out
fig1.10.1.c:38: warning: unused parameter �signo�
/tmp/ccCJrJLK.o: In function `main':
fig1.10.1.c:(.text+0x40): undefined reference to `err_sys'
fig1.10.1.c:(.text+0xa7): undefined reference to `err_sys'
fig1.10.1.c:(.text+0xe8): undefined reference to `err_ret'
fig1.10.1.c:(.text+0x12f): undefined reference to `err_sys'
collect2: ld returned 1 exit status
$ cat fig1.10.1.c
#include "apue.h"
#include <sys/wait.h>

static void sig_int(int); /* our signal-catching function */

int
main(void)
{
char buf[MAXLINE]; /* from apue.h */
pid_t pid;
int status;

if (signal(SIGINT, sig_int) == SIG_ERR)
err_sys("signal error");

printf("%% "); /* print prompt (printf requires %% to print %) */
while (fgets(buf, MAXLINE, stdin) != NULL) {
if (buf[strlen(buf) - 1] == '\n')
buf[strlen(buf) - 1] = 0; /* replace newline with null */

if ((pid = fork()) < 0) {
err_sys("fork error");
} else if (pid == 0) { /* child */
execlp(buf, buf, (char *)0);
err_ret("couldn't execute: %s", buf);
exit(127);
}

/* parent */
if ((pid = waitpid(pid, &status, 0)) < 0)
err_sys("waitpid error");
printf("%% ");
}
exit(0);
}

void
sig_int(int signo)
{
printf("interrupt\n%% ");
}

// gcc -D_GNU_SOURCE -std=c99 -Iinclude -Wall -Wextra fig1.10.1.c -o out
$

It finds apue.h in the include subdirectory.

So /usr/include/sys has a wait.h:



$ ls
acct.h inotify.h personality.h sendfile.h sysinfo.h
ultrasound.h
bitypes.h ioctl.h poll.h shm.h syslog.h un.h
cdefs.h io.h prctl.h signalfd.h sysmacros.h unistd.h
debugreg.h ipc.h procfs.h signal.h termios.h user.h
dir.h kdaemon.h profil.h socket.h timeb.h ustat.h
elf.h kd.h ptrace.h socketvar.h time.h utsname.h
epoll.h klog.h queue.h soundcard.h timerfd.h vfs.h
errno.h mman.h quota.h statfs.h times.h vlimit.h
eventfd.h mount.h raw.h stat.h timex.h vm86.h
fcntl.h msg.h reboot.h statvfs.h ttychars.h vt.h
file.h mtio.h reg.h stropts.h ttydefaults.h vtimes.h
fsuid.h param.h resource.h swap.h types.h wait.h
gmon.h pci.h select.h syscall.h ucontext.h xattr.h
gmon_out.h perm.h sem.h sysctl.h uio.h
$ less wait.h
$ man err_sys
No manual entry for err_sys
$

.... and there's no man page for err_sys nor an entry in susv3.

What gives?
--
fred