bc als Rechner in einem C-Programm nutzen
von heinz- SNIPPET_TEXT:
-
- #include <unistd.h>
- #include <stdio.h>
- #include <stdlib.h>
- #include <sys/wait.h>
- #include <string.h>
- const int PIPE_LESEN=0;
- const int PIPE_SCHREIBEN=1;
- int pipesE[2]; /* Eltern-Pipes */
- int pipesK[2]; /* Kind-Pipes */
- int kind_pid=0; /* Prozess-Pid */
- bool Pipe_verbinden(char*);/* (externes_programm) */
- int main()
- {
- /* Programmname */
- char bc_programm[]={"/usr/bin/bc"};
- /* Pipes erzeugen und bc starten */
- if(!Pipe_verbinden(bc_programm))// (externes_programm)
- {
- exit(1);
- }
- /* Schreib und lese-speicher */
- char bufs[32]={""};
- char bufl[32]={""};
- /* Mehrere testformeln verschicken */
- for(int z=10;z<200;z+=10)
- {
- /* Formel erstellen */
- /* sprintf(bufs,"%i+%i\n",z,z);*/
- sprintf(bufs,"scale=6;(%i+%i)/3\n",z,z);
- /* Formel senden */
- write(PIPE_SCHREIBEN,bufs,strlen(bufs));
- /* Lesespeicher leeren */
- memset(bufl,0,32);
- /* Lesen */
- read(PIPE_LESEN,bufl,32);
- /* Ausgeben */
- fprintf(stderr,">%i>\033[0;33;40m%s\033[0m=\033[0;32;40m%f\033[0m<\n",z,bufs,atof(bufl));
- }
- /* bc beenden */
- write(PIPE_SCHREIBEN,"quit\n",strlen(bufs));
- /* Auf ende des Kind-Prozesses warten */
- wait(&kind_pid);
- /* Pipes schliessen */
- close(PIPE_LESEN);
- close(PIPE_SCHREIBEN);
- }
- bool Pipe_verbinden(char* EP)// (externes_programm)
- {
- /* Pipes erzeugen */
- if(pipe(pipesE)<0)
- {
- return(false);
- }
- if(pipe(pipesK)<0)
- {
- return(false);
- }
- fflush(0);
- /* Prozess forken */
- kind_pid=fork();
- fprintf(stderr,"kind_pid=%i\n",kind_pid);
- /* Bei Fehler */
- if(kind_pid<0)
- {
- close(pipesE[PIPE_LESEN]);
- close(pipesE[PIPE_SCHREIBEN]);
- close(pipesK[PIPE_LESEN]);
- close(pipesK[PIPE_SCHREIBEN]);
- return(false);
- }
- /* Kind Prozess */
- if(kind_pid==0)
- {
- fprintf(stderr,"bc-start\n");
- /* Pipes bearbeiten */
- close(PIPE_LESEN);
- dup2(pipesE[PIPE_LESEN],PIPE_LESEN);
- close(pipesE[PIPE_LESEN]);
- close(pipesE[PIPE_SCHREIBEN]);
- close(PIPE_SCHREIBEN);
- dup2(pipesK[PIPE_SCHREIBEN],PIPE_SCHREIBEN);
- close(pipesK[PIPE_SCHREIBEN]);
- close(pipesK[PIPE_LESEN]);
- /* bc Starten */
- execl(EP,EP,"-q","-l",NULL);
- /* Pipes schliessen */
- close(PIPE_LESEN);
- close(PIPE_SCHREIBEN);
- }
- /* Eltern Prozess */
- if(kind_pid>0)
- {
- /* Pipes bearbeiten */
- close(PIPE_LESEN);
- dup2(pipesK[PIPE_LESEN],PIPE_LESEN);
- close(pipesK[PIPE_LESEN]);
- close(pipesK[PIPE_SCHREIBEN]);
- close(PIPE_SCHREIBEN);
- dup2(pipesE[PIPE_SCHREIBEN],PIPE_SCHREIBEN);
- close(pipesE[PIPE_SCHREIBEN]);
- close(pipesE[PIPE_LESEN]);
- }
- return(true);
- }
Quellcode
Hier kannst du den Code kopieren und ihn in deinen bevorzugten Editor einfügen. PASTEBIN_DOWNLOAD_SNIPPET_EXPLAIN