Momenteel ben ik bezig met een server applicatie te schrijven in C die het mogelijk moet maken om onze COBOL programma's uit te voeren. De applicatie zit al op het punt dat er verschillende processen gestart worden en op de specifieke poort luisteren, en het COBOL programma opgestart wordt bij het ontvangen van een request.
Het lastige deel was het zoeken naar een manier om stdout te kunnen redirecten, wat mij uiteindelijk gelukt is met de dup2() system call. Alles wat de COBOL routine naar stdout schrijft, komt aan de andere kant van de socket terecht. Door een close() van de client socket te doen, werd de socket wel niet effectief gesloten, omdat stdout ook nog naar diezelfde socket verwijst. Een close() doen van stdout zorgde ervoor dat de client socket wel werd gesloten. De code die ik nu heb, ziet er nu ruwweg op de volgende manier uit.
En alles verloopt perfect. Althans voor de eerste uitgevoerde request. Bij de volgende krijg ik volgende fout.
Dit is dus een fout bij de tweede call naar dup2(). Deze fout kreeg ik niet wanneer de close(STDOUT_FILENO); er nog niet inzat.
Volgens wat ik lees in de man page van dup2(fd1,fd2), wordt fd2 een verwijzing naar fd1. Wanneer fd2 een filehandle is naar een open file, wordt deze eerst gesloten. Dus hoe je het ook draait of keert, bij de aanroep van dup2 is stdout al gesloten. Toch krijg ik bij de tweede call een fout, hoewel bij allebei stdout al gesloten is.
Zijn er mensen die hiermee ervaring hebben en mij verder op weg kunnen helpen?
Het lastige deel was het zoeken naar een manier om stdout te kunnen redirecten, wat mij uiteindelijk gelukt is met de dup2() system call. Alles wat de COBOL routine naar stdout schrijft, komt aan de andere kant van de socket terecht. Door een close() van de client socket te doen, werd de socket wel niet effectief gesloten, omdat stdout ook nog naar diezelfde socket verwijst. Een close() doen van stdout zorgde ervoor dat de client socket wel werd gesloten. De code die ik nu heb, ziet er nu ruwweg op de volgende manier uit.
C:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
| process_t * this = global_scoreboard[ index ]; // struct met process status,pid, etc... while( ! this->must_shutdown ) { this->status = PROCESS_READY; client = accept( server ); close( STDOUT_FILENO ); if( dup2( client->socket , STDOUT_FILENO ) == -1 ) { DWARF_ERROR( "error duplicating socket file descriptor to stdout: %s" , strerror(errno ) ); } printf( "***** request processed by " __FILE__ " *****\n" ); cobcall( "ons cobol programma" , 0 , NULL ); this->status = PROCESS_CLOSING; close( client ); close( STDOUT_FILENO ); } |
En alles verloopt perfect. Althans voor de eerste uitgevoerde request. Bij de volgende krijg ik volgende fout.
code:
1
| E-error(dwarf_process.c:60 - dwarf_process_run) error duplicating socket file descriptor to stdout: Bad file number |
Dit is dus een fout bij de tweede call naar dup2(). Deze fout kreeg ik niet wanneer de close(STDOUT_FILENO); er nog niet inzat.
Volgens wat ik lees in de man page van dup2(fd1,fd2), wordt fd2 een verwijzing naar fd1. Wanneer fd2 een filehandle is naar een open file, wordt deze eerst gesloten. Dus hoe je het ook draait of keert, bij de aanroep van dup2 is stdout al gesloten. Toch krijg ik bij de tweede call een fout, hoewel bij allebei stdout al gesloten is.
Zijn er mensen die hiermee ervaring hebben en mij verder op weg kunnen helpen?