SHANLEY@MAINE.BITNET (03/23/90)
System: AT&T 3B2-400 Unix V 3.0 4 Meg Ram 72 Meg Hard Disk 286 Meg Hard Disk C language Issue 3.1 11/19/85 Bourne Shell I wrote a c program that accesses the curses library and produces a menu on the terminal. Users select the number of of the menu item they wish to execute. The c program uses the system () command to execute a shell script that acts as an interface to other programs so I don't have to keep recompiling the c program. I have enclosed the appropriate portions of both the c program and the shell scripts. Senerio: The uses selects the FinalBilling choice of the menu selection. The c program executes the system () and access the shell script. The shell script executes an numberinp.x to input the work order numbers that are to be billed. Once these numbers are entered, the users goes back to the c program and the shell script calls itself again and goes on its merry way to do the billing. Problem: The senerio works great for awhile but then suddenly the shell script won't do the billing. nohup menu.s Billout final $inpfile 1>$errfile & It won't execute ... menu.s Billout .... I know it executes the nohup because it produces the file $errfile but it doesn't execute the rest of the command menu.s Billout ... I thought I might have a problem with recursively calling shell scripts so I put the Billout) portion of the shell script in a shell file and called it. Didn't work. nohup billout.s ... & It seems like I am accumlating a counter in some system variable that reaches its limit and refuses to decrement to a lower value once the shell script has finished executing. I have reason to believe that I have too many open files and that the OS is not acknowledging the fact that I am done with the files. To get to the menu program, the processes look like: PID TTY TIME COMMAND 1456 console 0:03 sh 1467 console 0:04 dbmenu 1468 console 0:00 sh 1469 console 0:01 sh 1470 console 0:41 menu.x Am I using up 3 files for each "sh" above? (ie stdin, stdout, and stderr) Any thoughts? ideas? Am I on the right track? menu.c : /* Execute the billing menu */ void billing (c) char c; { /* Choose a menu option */ switch (c) { case '1': menuhelp ("Batches", 0); prtmenu ("Billing"); break; case '2': menuhelp ("FinalBilling", 0); prtmenu ("Billing"); break; case '3': menuhelp ("PartialBilling", 0); prtmenu ("Billing"); break; case '4': menuhelp ("MonthlyBilling", 0); prtmenu ("Billing"); break; case 'cn': prtmenu ("Worksys"); break; default : break; } /* Choose a menu option */ } /* Execute the billing menu */ /* Execute the menu.s program */ void menuhelp (program, getcopy) char *program; long getcopy; { char copies, *reportname[80+1], *command[80+1]; /* Get the report copies */ if (getcopy == 1) { strcpy (reportname, program); strcat (reportname, " Report"); prtmenu (reportname); copies = getch (); move (10, 34); } /* Get the report copies */ attron (A_STANDOUT); addstr (" Executing "); attroff (A_STANDOUT); refresh (); endwin (); sprintf (command, "menu.s %s %c", program, copies); system (command); initscr (); cbreak (); raw (); } /* Execute the menu.s program */ menu.s: # Select a worksys function case $1 in # Billing FinalBilling) inpfile=/usr/tmp/billinp.$$ numberinp.x FinalBilling 1 2>$inpfile if test -s $inpfile then errfile=../bill/`acego -q batchnum`.error # Problem line nohup menu.s Billout final $inpfile 1>$errfile & fi rm -f $inpfile ;; Billout) billtype=$1 echo "cncncncncn" echo "Do you want to print the bills? (Y/N) : cc"; read prtbill batch=`sort -u /usr/tmp/billinp.$$ | billing.x` mv $2 ../bill/$batch.input sort -u ../bill/$batch.input | while read work do # Print new page case $newpage in 1) echo "cf" ;; *) newpage=1 ;; esac # Print new page echo "cncncncncn" > /usr/tmp/billout.$$ acego -q revlab $work >> /usr/tmp/billout.$$ labor=`tail -1 /usr/tmp/billout.$$` labor=`echo $labor | awk '{printf ("%s", $4)}'` echo "cncncncncn" >> /usr/tmp/billout.$$ acego -q revsup $work >> /usr/tmp/billout.$$ supply=`tail -1 /usr/tmp/billout.$$` supply=`echo $supply | awk '{printf ("%s", $2)}'` acego -q billcust $billtype $work $labor $supply cat /usr/tmp/billout.$$ acego -q batchlab $work >> /usr/tmp/billbat.$$ acego -q batchsup $work >> /usr/tmp/billbat.$$ done > ../bill/$batch.output cut -c43-59 /usr/tmp/billbat.$$ | batch.x $batch `date +%m%d` > ../bill/$batch.batch cat /usr/tmp/billbat.$$ >> ../bill/$batch.batch cat ../bill/$batch.batch | lp -c -d$PRINTER -s 2>/dev/null cat ../bill/$batch.error | lp -c -d$PRINTER -s 2>/dev/null # Print the bills case $prtbill in Y) cat ../bill/$batch.output | lp -c -d$PRINTER -s 2>/dev/null ;; y) cat ../bill/$batch.output | lp -c -d$PRINTER -s 2>/dev/null ;; *) ;; esac # Print the bills input=../bill/$batch.input # Archive the work order case $billtype in final) cat $input | archiver.x work arcwork 00/00/00 00/00/00 cat $input | archiver.x estimate arcestimate 00/00/00 00/00/00 ;; *) ;; esac # Archive the work order cat $input | archiver.x labor arclabor 00/00/00 00/00/00 cat $input | archiver.x supply arcsupply 00/00/00 00/00/00 rm /usr/tmp/billout.$$ rm /usr/tmp/billbat.$$ ;; rm $2 esac