Path: utzoo!utgpu!news-server.csri.toronto.edu!rpi!zaphod.mps.ohio-state.edu!caen!ox.com!math.fu-berlin.de!fub!tmpmbx!scuzzy!src From: src@scuzzy.in-berlin.de (Heiko Blume) Newsgroups: comp.unix.sysv386 Subject: Re: POSIX and ISC 2.2.x -- how many people are using this? Message-ID: <1991Apr23.204602.14556@scuzzy.in-berlin.de> Date: 23 Apr 91 20:46:02 GMT References: <1991Apr14.193335.26288@ddsw1.MCS.COM> <1991Apr16.235122.26807@scuzzy.in-berlin.de> <1991Apr19.215401.1501@am.sublink.org> Organization: Contributed Software Lines: 81 alex@am.sublink.org (Alex Martelli) writes: >src@scuzzy.in-berlin.de (I) wrote: [i say that i made bash work with posix job control] >Ah, just the man for me!-) Being reasonably familiar with BSD job >control, and having tried to gain understanding of Posix jc via the >standards text and some discussions in the comp.std.unix archives, I >find I must have failed, since when I tried to hack bash to posix jc >on my Interactive 2.2 I got no results save a few shell hangs! I bet >I'm not the only one in a similar predicament... would you like to >enlighten us? I think you can assume that BSD jc is understood, >indeed jc-related diffs on Bash with a few theory pointers might be >enough... >I'll gratefully accept 'literature pointers' too, of course. er, in fact i sort of hacked my way through it. ten zillion test programs...the only documentation i had was the isc man pages and some advise from the net, later i managed to get the standard ($100 - ugh). i have posted my diffs for bash-1.05 to alt.sources in january, you should be able to find them on some archive sites. those diffs weren't really posix compliant though, but since bash-1.07 was announced shortly after, i didn't post the better ones. unfortunately 1.07 still isn't out :-( however, here's whats needed (on ISC 2.2.1) as far as i figured out: - replace setjmp() and longjmp() with sigsetjmp() and siglongjmp(). change the variables, casts etc of type jmp_buf to sigjmp_buf. sigsetjmp() needs a second argument specifying whether the signal mask shall be preserved or not. i always used '1' - preserve mask. - replace ioctl(fd, TIOCSPGRP, &pgrp) with tcsetpgrp(fd, pgrp). - replace setpgrp(pid, pgrp) with setpgid(pid, pgrp). - replace killpg(pgrp, SIGNAL) with kill(-(pgrp), SIGNAL). - the signaling functions need some intro: they work on 'objects' in the sense of an abstract data type, and must therefore be 'created/initialized'. i.e. a int oldmask = sigblock(1 << (SIGCHOKE-1)) in BSD style job control translated to posix style jc is sigset_t oldmask, newmask; sigemptyset(&oldmask); /* must initialize */ sigemptyset(&newmask); sigaddset(&newmask, SIGCHOKE); /* add signal to set */ sigprocmask(SIG_BLOCK, &newmask, &oldmask); that looks very bloated, but it has it's advantages. especially the 32 signal limit that a (long) int imposes can be avoided. to restore the old signal mask replace the BSD sigsetmask(oldmask); with the posix call sigprocmask(SIG_SETMASK, &oldmask, (sigset_t *)0); a set of signals can be unblocked using SIG_UNBLOCK. to wait for one or more specific signals, BSD uses int mask=0; /* any will do here */ sigpause(mask); while posix suggests sigset_t nullmask; sigemptyset(&nullmask); /* any signal will do */ sigsuspend(&nullmask); that's about it, i hope i didn't make any mistakes. as usual, corrections are welcome. -- Heiko Blume <-+-> src@scuzzy.in-berlin.de <-+-> (+49 30) 691 88 93 [voice!] public UNIX source archive [HST V.42bis]: scuzzy Any ACU,f 38400 6919520 gin:--gin: nuucp sword: nuucp uucp scuzzy!/src/README /your/home