Path: utzoo!utgpu!jarvis.csri.toronto.edu!rutgers!ucsd!ucbvax!tut.cis.ohio-state.edu!UUNET.UU.NET!h-three!farside!tony From: h-three!farside!tony@UUNET.UU.NET Newsgroups: gnu.bash.bug Subject: bash 1.03 misc on SYSV.3 386 Message-ID: <8910052328.AA26474@uunet.uu.net> Date: 5 Oct 89 23:28:04 GMT Sender: daemon@tut.cis.ohio-state.edu Distribution: gnu Organization: GNUs Not Usenet Lines: 204 Howdy; (I've just started using bash, so some of my comments may have already been discussed on gnu.bash.bug [which I've just begun reading]). My environment is: bash 1.03 386 UNIX V.3 (essentially 386/ix 1.0.6) on a Multibus I 386 machine -- For all intents and purposes equiv to an AT-386. gcc 1.36 (tho not using gas) I now have bash up and running. I encountered several problems that seem to all be SYSV related, and especially related to job control. . terminal mode handling is not SYSV appropriate. TIOC[SG]ETP are used exclusively, instead of the SYSV ioctl TCSETAW, et.al. This wasn't much of a problem as our UNIX port emulates TIOC[SG]ETP. Others might not be so lucky. The readline code seems to use TCSETAW as appropriate. . file nojobs.c missing include's for 'sgtty.h' and 'fcntl.h' . file jobs.c missing include's for 'sys/types.h', 'sys/times.h', and 'fcntl.h' . file nojobs.c basically wouldn't compile/link due to functions missing: - remember_pid() doesn't exist - builtins.c ref's wait_for_background_pids() and wait_for_single_pid() which aren't provided in nojobs.c . make clean doesn't descend into readline subdir properly . SIGCHLD is SIGCLD on SYSV (no 'H') . sigblock, sigsetmask were #ifdef'd SYSV to sighold() and sigrelse(). . since nojobs.c wouldn't work, I decided to use jobs.c and just init job_control variable to 0 instead of 1. This prevents the code from doing all the job control activity that isn't supported (unfortunately) on SYSV. So then it just became a matter of getting the stuff to compile. I did that by adding to config.h the following: #ifdef sci386 -- my machine #define JOB_CONTROL #define SIGCHLD SIGCLD #define SIGCONT (-99) #define SIGTSTP (-100) #define SIGTTOU (-101) #define SIGTTIN (-102) #define TIOCSETN TIOCSETP #define TIOCSPGRP (-299) #define TIOCGETD (-300) #define TIOCSETD (-301) #define NTTYDISC (-400) #define killpg kill #endif [I probably should have also dealt with wait3(), sigblock(), and sigsetmask() here.] This allowed it to compile, and it seems to work fine. . 'times' builtin isn't correct for SYSV. Code in builtins.c seems to assume that times(2) (for SYSV) returns values in seconds. On V.3, it returns values in clock ticks (HZ from param.h). I decided to fix this in add_times() so as to update {user,system}_{minutes,seconds}_used as per: #ifdef sci386 struct tms total_times; time_t seconds; (void) times(&total_times); total_times.tms_utime += total_times.tms_cutime; total_times.tms_stime += total_times.tms_cstime; seconds = total_times.tms_cstime; seconds += HZ - 1; seconds /= HZ; system_minutes_used = seconds / 60; system_seconds_used = seconds % 60; seconds = total_times.tms_cutime; seconds += HZ - 1; seconds /= HZ; user_minutes_used = seconds / 60; user_seconds_used = seconds % 60; #endif Then times_builtin() became as follows (just removed old times(2) stuff: times_builtin (list) WORD_LIST *list; { extern long system_minutes_used, user_minutes_used; extern int system_seconds_used, user_seconds_used; no_args ("times", list); #ifdef SYSV /* * For SYSV we can call add_times() at any time since the * kernel does the child time summations for us. */ add_times(); /* SYSV version has no arg */ #endif printf ("%0dm%0ds %0dm%0ds\n", system_minutes_used, system_seconds_used, user_minutes_used, user_seconds_used); } . In glob.c, were missing a check for __GNUC__'s __builtin_alloca. The line 'extern char *alloca();' caused a problem. . jobs.c calls wait3() which doesn't exist on SYSV. Changed to wait(). [flush_child is never called, since job_control is 0, however] . readline/readline.c needed #include . on SYSV.3 signal handlers return void function pointers. (changed in general.h) . initialized 'do_v9' in echo_builtin() to 1 to be more compatible with SYSV /bin/echo. Overall, bash looks really good. Minor complaints are that it is somewhat slower on shell script interpretation than /bin/sh and it is much bigger (3x code size). A sample timing for my .profile (which is overly complex): time /bin/sh .profile real 4.0 user 0.8 sys 1.7 time bin/bash .profile real 14.2 user 6.5 sys 5.8 Not sure what to attribute the time diffs to. I tried running prof(1), with mixed results. Our version of prof seemed to chop up long routine names, so I don't really trust it, but here are the first few lines from a prof(1) session corresponding to the time'd results above: %Time Seconds Cumsecs #Calls msec/call Name 21.1 0.04 0.04 307 0.14 malloc 19.0 0.04 0.08 2 20. fork 9.5 0.02 0.10 2513 0.008 strcmp 9.5 0.02 0.12 2 10. stat 4.8 0.01 0.13 1 10. initialize_hash_table 4.8 0.01 0.14 brk 4.8 0.01 0.15 2 5. et_next_history 4.8 0.01 0.16 2 5. sighold 4.8 0.01 0.17 2 5. pipe 4.8 0.01 0.18 85 0.1 free 4.8 0.01 0.19 130 0.08 ase_version 2.7 0.01 0.20 malloc_usable_size My guess is that fork() of a larger proc is what is making shell scripts slower. Minor, tentative, wish list: visible bell in ding() filename completion should expand shell variables, ie: $s/gnu/b should expand to either: $s/gnu/bash or to: /ut/tony/src/gnu/bash Gets error on SYSV basename which is a shellscript using expr(1). Haven't looked into this much yet, but the execve() fails with errno == ENOEXEC and bash proceeds to determine that expr (?) is binary and thus can't be interpreted. Here is the line from basename that seems to be the problem: /bin/expr \ "/${1:-.}" : '\(.*[^/]\)/*$' : '.*/\(..*\)' : "\\(.*\\)$2\$" \| \ "/${1:-.}" : '\(.*[^/]\)/*$' : '.*/\(..*\)' \| \ "/${1:-.}" : '.*/\(..*\)' Running expr with a simpler argument works ok. Please let me know if I can provide any help or more information. Thanks. --tony ...!uunet!h-three!tony (919) 549-8334 h-three Systems Corporation h-three!tony@uunet.uu.net POB 12557; RTP, NC 27709; USA t. e. bennett FAX: (919) 549-9868