[c++] program wywolujacy programy napisane w AWK

0

Witam, mam pewne pytanie... otoz musze napisac program ktory przy pomocy forka bedzie tworzyl podprocesy (wywolywanie odpowiednich programow 1,2,3,4) oraz zeby potem przy pomocy "popen" wyswietlal na ekranie konsoli wynik.
W jaki sposob powinna wygladac skladnia.
Od razu mowie ze moim zamyslem nie jest uzyskanie gotowej odpowiedzi, tylko pomoc w zagadnieniach.
Czytalem manuale fork, popen, exec ale nie do konca je kumam...

0

popen nie potrzebuje forka, ponieważ nie konczy programu.
jexeli uzyjesz exec*() nie uzyjesz popen.

popen mozna sobie samemu napisac (analogicznie do poniższego i do: http://www.unix.com/programming/53220-execl-redirecting-output-text-files.html )

#include <unistd.h>
#include <fcntl.h>

int dofork(){
  int files[2];
  pipe(files);
  pid_t i=fork();
  if(i==-1)return -31;
  if(i){                  // rodzic
    char buf[512];
    ssize_t j;
    do{
      j=read(files[0],buf,512);
      write(STDOUT_FILENO,buf,j);
    }while(j==512); // przy wywolaniu innego programu niz ls oczywiscie inny warunek
    waitpid(i,NULL,0);
  }else{                // potomek
    int ferr=open("/dev/null",O_WRONLY); // bledy na /dev/drzewo
    dup2(files[1],STDOUT_FILENO);
    dup2(ferr,STDERR_FILENO);  // j.w. bledy na /dev/drzewo
    execl("/bin/ls","ls","-la",(char*)0);
  }
  return 0;
}

int main(){

  dofork();

  write(STDOUT_FILENO,"\nok :)\n",7);
  return 0;
}

po dodaniu drugiej pary fifo, mozesz zrobic komunikacje w obu kierunkach:

#include <string.h>
#include <unistd.h>
#include <fcntl.h>
#include <sys/select.h>

#define WELCOME "\n\nWelcome to Jamaica & have a good day!\n\n"

int dofork(){
  int filesin[2];
  int filesout[2];
  pipe(filesin);
  pipe(filesout);
  pid_t i=fork();
  if(i==-1)return -31;
  char buf[512];
  ssize_t j;
  if(i){
    fd_set set;
    write(filesout[1],WELCOME,strlen(WELCOME));  // dla zabawy wysylamy do dziecka ciag. dziecko co odbierze to odesle
    do{
      FD_ZERO(&set);
      FD_SET(STDIN_FILENO,&set);
      FD_SET(filesin[0],&set);
      select(filesin[0]+1,&set,NULL,NULL,NULL);
      if(FD_ISSET(STDIN_FILENO,&set)){
        read(STDIN_FILENO,buf,512);
        write(filesout[1],buf,j);
      }
      if(FD_ISSET(filesin[0],&set)){   // za pierwszym razem odebranie WELCOME
        j=read(filesin[0],buf,512);
        write(STDOUT_FILENO,buf,j);
      }
    }while(j>=0);
    waitpid(i,NULL,0);
  }else{
    int ferr=open("/dev/null",O_WRONLY);
    dup2(filesin[1],STDOUT_FILENO);
    dup2(filesout[0],STDIN_FILENO);
    dup2(ferr,STDERR_FILENO);
    j=read(STDIN_FILENO,buf,512);   // odbieramy WELCOME
    write(STDOUT_FILENO,buf,j);       // i odsylamy
    execl("/bin/bash","-bash",(char*)0);
  }
  return 0;
}

int main(){

  dofork();

  write(STDOUT_FILENO,"\nok :)\n",7);
  return 0;
}

1 użytkowników online, w tym zalogowanych: 0, gości: 1