From: SMTP%"carl@SOL1.GPS.CALTECH.EDU" 24-MAY-1994 13:50:39.10 To: EVERHART CC: Subj: Re: Problem getting LIB$SIGNAL() and fprintf(stderr, ...) to work From: carl@SOL1.GPS.CALTECH.EDU (Carl J Lydick) X-Newsgroups: comp.os.vms Subject: Re: Problem getting LIB$SIGNAL() and fprintf(stderr, ...) to work Date: 23 May 1994 22:50:40 GMT Organization: HST Wide Field/Planetary Camera Lines: 251 Distribution: world Message-ID: <2rrc00$aqu@gap.cco.caltech.edu> Reply-To: carl@SOL1.GPS.CALTECH.EDU NNTP-Posting-Host: sol1.gps.caltech.edu To: Info-VAX@CRVAX.SRI.COM X-Gateway-Source-Info: USENET In article <2rqurb$q2a@News1.mcs.com>, hammond@ctt.com (Kevin W. Hammond) writes: =I've also tried using *different* files for SYS$OUTPUT and SYS$ERROR. =(ie., in the above example, i've replaced the second sys_outputd with a =sys_errord that points to a *different* file than sys_outputd.) and =I still don't see the output from LIB$SIGNAL. What you've got here is an interaction between the whatever the condition handler is (or perhaps SYS$PUTMSG) and both the VAXC RTL I/O routines (and in the example below, LIB$PUT_OUTPUT). Summary: For jobs created with the call to SYS$CREPRC you're using, then: 1) If you use use LIB$SIGNAL without first calling any ofLIB$PUT_OUTPUT, fprintf(stdout,...), and fprintf(stderr,...), then a call to LIB$SIGNAL will result in output to both SYS$OUTPUT and SYS$ERROR; 2) If you call LIB$PUT_OUTPUT, then a call to LIB$SIGNAL will no longer result in output to SYS$OUTPUT, but WILL result in output to SYS$ERROR; 3) If you call fprintf(stdout,...), or fprintf(stderr...), then LIB$SIGNAL will no longer result in output to either SYS$OUTPUT or SYS$ERROR. 4) Calls to fprintf(stdout,...), fprintf(stderr,...), and LIB$PUT_OUTPUT don't (in the cases I've tested) interfere with each other (though if you use both LIB$PUT_OUTPUT and fprintf(stdout...), you'll get two versions of the files specified for SYS$OUTPUT in the call to SYS$CREPRC) interfere with each other; just with whether LIB$SIGNAL results in output to the files specified as SYS$OUTPUT and SYS$ERROR. Here's a fairly lengthy demonstration of the various interactions: $ WRITE SYS$OUTPUT F$GETSYI("VERSION") V5.4-2 $ CC/OBJ=TEST SYS$INPUT: #include descrip #include prcdef main() { $DESCRIPTOR(sys_input, "NLA0:"); $DESCRIPTOR(image1, "DISK$USERDISK:[CARL]TEST1"); $DESCRIPTOR(sys_output1, "DISK$USERDISK:[CARL]TESTFILE1.OUT"); $DESCRIPTOR(sys_error1, "DISK$USERDISK:[CARL]TESTFILE1.ERR"); $DESCRIPTOR(prcnam1, "TEST1"); $DESCRIPTOR(image2, "DISK$USERDISK:[CARL]TEST2"); $DESCRIPTOR(sys_output2, "DISK$USERDISK:[CARL]TESTFILE2.OUT"); $DESCRIPTOR(sys_error2, "DISK$USERDISK:[CARL]TESTFILE2.ERR"); $DESCRIPTOR(prcnam2, "TEST2"); $DESCRIPTOR(image3, "DISK$USERDISK:[CARL]TEST3"); $DESCRIPTOR(sys_output3, "DISK$USERDISK:[CARL]TESTFILE3.OUT"); $DESCRIPTOR(sys_error3, "DISK$USERDISK:[CARL]TESTFILE3.ERR"); $DESCRIPTOR(prcnam3, "TEST3"); $DESCRIPTOR(image4, "DISK$USERDISK:[CARL]TEST4"); $DESCRIPTOR(sys_output4, "DISK$USERDISK:[CARL]TESTFILE4.OUT"); $DESCRIPTOR(sys_error4, "DISK$USERDISK:[CARL]TESTFILE4.ERR"); $DESCRIPTOR(prcnam4, "TEST4"); $DESCRIPTOR(image5, "DISK$USERDISK:[CARL]TEST5"); $DESCRIPTOR(sys_output5, "DISK$USERDISK:[CARL]TESTFILE5.OUT"); $DESCRIPTOR(sys_error5, "DISK$USERDISK:[CARL]TESTFILE5.ERR"); $DESCRIPTOR(prcnam5, "TEST5"); $DESCRIPTOR(image6, "DISK$USERDISK:[CARL]TEST6"); $DESCRIPTOR(sys_output6, "DISK$USERDISK:[CARL]TESTFILE6.OUT"); $DESCRIPTOR(sys_error6, "DISK$USERDISK:[CARL]TESTFILE6.ERR"); $DESCRIPTOR(prcnam6, "TEST6"); $DESCRIPTOR(image7, "DISK$USERDISK:[CARL]TEST7"); $DESCRIPTOR(sys_output7, "DISK$USERDISK:[CARL]TESTFILE7.OUT"); $DESCRIPTOR(sys_error7, "DISK$USERDISK:[CARL]TESTFILE7.ERR"); $DESCRIPTOR(prcnam7, "TEST7"); unsigned long pid, status; status = sys$creprc(&pid, &image1, &sys_input, &sys_output1, &sys_error1, 0, 0, &prcnam1, 0, 0, 0, PRC$M_DETACH); printf("ID of created process is %08X\tStatus is %08X\n", pid, status); status = sys$creprc(&pid, &image2, &sys_input, &sys_output2, &sys_error2, 0, 0, &prcnam2, 0, 0, 0, PRC$M_DETACH); printf("ID of created process is %08X\tStatus is %08X\n", pid, status); status = sys$creprc(&pid, &image3, &sys_input, &sys_output3, &sys_error3, 0, 0, &prcnam3, 0, 0, 0, PRC$M_DETACH); printf("ID of created process is %08X\tStatus is %08X\n", pid, status); status = sys$creprc(&pid, &image4, &sys_input, &sys_output4, &sys_error4, 0, 0, &prcnam4, 0, 0, 0, PRC$M_DETACH); printf("ID of created process is %08X\tStatus is %08X\n", pid, status); status = sys$creprc(&pid, &image5, &sys_input, &sys_output5, &sys_error5, 0, 0, &prcnam5, 0, 0, 0, PRC$M_DETACH); printf("ID of created process is %08X\tStatus is %08X\n", pid, status); status = sys$creprc(&pid, &image6, &sys_input, &sys_output6, &sys_error6, 0, 0, &prcnam6, 0, 0, 0, PRC$M_DETACH); printf("ID of created process is %08X\tStatus is %08X\n", pid, status); status = sys$creprc(&pid, &image7, &sys_input, &sys_output7, &sys_error7, 0, 0, &prcnam7, 0, 0, 0, PRC$M_DETACH); printf("ID of created process is %08X\tStatus is %08X\n", pid, status); SYS$EXIT(1); } $ CC/OBJ=TEST1 SYS$INPUT: main() { LIB$SIGNAL(24); } $ CC/OBJ=TEST2 SYS$INPUT: #include descrip main() { $DESCRIPTOR(outmsg, "Using only LIB$PUT_OUTPUT"); LIB$PUT_OUTPUT(&outmsg); LIB$SIGNAL(24); } $ CC/OBJ=TEST3 SYS$INPUT: #include stdio main() { fprintf(stdout, "fprintf to stdout\n"); LIB$SIGNAL(24); } $ CC/OBJ=TEST4 SYS$INPUT: #include stdio main() { fprintf(stderr, "fprintf to stderr\n"); LIB$SIGNAL(24); } $ CC/OBJ=TEST5 SYS$INPUT: #include stdio main() { fprintf(stdout, "fprintf to stdout then to stderr.\n"); fprintf(stderr, "fprintf to stdout then to stderr.\n"); LIB$SIGNAL(24); } $ CC/OBJ=TEST6 SYS$INPUT: #include stdio main() { fprintf(stderr, "fprintf to stderr then to stdout.\n"); fprintf(stdout, "fprintf to stderr then to stdout.\n"); LIB$SIGNAL(24); } $ CC/OBJ=TEST7 SYS$INPUT: #include descrip #include stdio #define outmsg "Write to SYS$OUTPUT, stdout, then stderr\n" main() { $DESCRIPTOR(outdsc, outmsg); LIB$PUT_OUTPUT(&outdsc); fprintf(stdout, outmsg); fprintf(stderr, outmsg); LIB$SIGNAL(24); } $ LINK TEST,SYS$INPUT:/OPT SYS$SHARE:VAXCRTL/SHARE $ LINK TEST1,SYS$INPUT:/OPT SYS$SHARE:VAXCRTL/SHARE $ LINK TEST2,SYS$INPUT:/OPT SYS$SHARE:VAXCRTL/SHARE $ LINK TEST3,SYS$INPUT:/OPT SYS$SHARE:VAXCRTL/SHARE $ LINK TEST4,SYS$INPUT:/OPT SYS$SHARE:VAXCRTL/SHARE $ LINK TEST5,SYS$INPUT:/OPT SYS$SHARE:VAXCRTL/SHARE $ LINK TEST6,SYS$INPUT:/OPT SYS$SHARE:VAXCRTL/SHARE $ LINK TEST7,SYS$INPUT:/OPT SYS$SHARE:VAXCRTL/SHARE $ DELETE TEST*.OBJ;* $ RUN TEST ID of created process is 21A02489 Status is 00000001 ID of created process is 21A0248A Status is 00000001 ID of created process is 21A0248B Status is 00000001 ID of created process is 21A0248C Status is 00000001 ID of created process is 21A0248D Status is 00000001 ID of created process is 21A0248E Status is 00000001 ID of created process is 21A0248F Status is 00000001 $ WAIT 0:0:10.0 $ TYPE TESTFILE%.*;* DISK$USERDISK:[CARL]TESTFILE1.ERR;1 %SYSTEM-W-EXQUOTA, exceeded quota %TRACE-W-TRACEBACK, symbolic stack dump follows module name routine name line rel PC abs PC .MAIN. main 2 00000014 00000214 DISK$USERDISK:[CARL]TESTFILE1.OUT;1 %SYSTEM-W-EXQUOTA, exceeded quota %TRACE-W-TRACEBACK, symbolic stack dump follows module name routine name line rel PC abs PC .MAIN. main 2 00000014 00000214 DISK$USERDISK:[CARL]TESTFILE2.ERR;1 %SYSTEM-W-EXQUOTA, exceeded quota %TRACE-W-TRACEBACK, symbolic stack dump follows module name routine name line rel PC abs PC .MAIN. main 438 00000032 00000432 DISK$USERDISK:[CARL]TESTFILE2.OUT;1 Using only LIB$PUT_OUTPUT DISK$USERDISK:[CARL]TESTFILE3.ERR;1 DISK$USERDISK:[CARL]TESTFILE3.OUT;1 fprintf to stdout DISK$USERDISK:[CARL]TESTFILE4.ERR;1 fprintf to stderr DISK$USERDISK:[CARL]TESTFILE4.OUT;1 DISK$USERDISK:[CARL]TESTFILE5.ERR;1 fprintf to stdout then to stderr. DISK$USERDISK:[CARL]TESTFILE5.OUT;1 fprintf to stdout then to stderr. DISK$USERDISK:[CARL]TESTFILE6.ERR;1 fprintf to stderr then to stdout. DISK$USERDISK:[CARL]TESTFILE6.OUT;1 fprintf to stderr then to stdout. DISK$USERDISK:[CARL]TESTFILE7.ERR;1 Write to SYS$OUTPUT, stdout, then stderr DISK$USERDISK:[CARL]TESTFILE7.OUT;2 Write to SYS$OUTPUT, stdout, then stderr DISK$USERDISK:[CARL]TESTFILE7.OUT;1 Write to SYS$OUTPUT, stdout, then stderr $ DELETE TEST*.EXE;*,TESTFILE%.*;* -------------------------------------------------------------------------------- Carl J Lydick | INTERnet: CARL@SOL1.GPS.CALTECH.EDU | NSI/HEPnet: SOL1::CARL Disclaimer: Hey, I understand VAXen and VMS. That's what I get paid for. My understanding of astronomy is purely at the amateur level (or below). So unless what I'm saying is directly related to VAX/VMS, don't hold me or my organization responsible for it. If it IS related to VAX/VMS, you can try to hold me responsible for it, but my organization had nothing to do with it.