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
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;
}