Aufgabe 1

#include <sys/types.h>
#include <sys/stat.h>    
#include <fcntl.h> 
#include <unistd.h>
int main() {
   close(1);
   open("xyz", O_RDWR | O_CREAT, 00600);
   execlp("ls", "ls", (char *) NULL);

   return 0;
}

Aufgabe 2

#include <sys/types.h>
#include <unistd.h>
#include <sys/types.h>
#include <sys/wait.h>
#include <stdlib.h> 

int cmdc(int argc, char *argv[]) {
   int i;
   int c = 0;
   
   for (i = 0; i < argc; i++) {
      if (! strcmp(argv[i],"@")) c++;
   }
   return c + 1;
}


char **cut_cmd(int nr, char *argv[]) {
   int  i, c;
   char **new_argv;
   
   for (i = 1, c = 0; c < nr; i++) {
      if (!strcmp(argv[i],"@")) c++;
   }
   new_argv = &(argv[i]);
   for (i = i+1; argv[i] != (char *)NULL; i++) {
      if (!strcmp(argv[i],"@")) argv[i] = (char *)NULL;
   }
   return new_argv;
}


int main(int argc, char *argv[]) {
   int c_cmd, i;
   int pid;
   int pfd[2];
   int src_fd = 0;
   int err = 0;

   c_cmd = cmdc(argc, argv);
   for (i=0; i < c_cmd; i++) {
      if (i+1< c_cmd) { pipe(pfd); }
      pid = fork();
      if (pid == 0) {
         argv = cut_cmd(i, argv);
	 if (src_fd != 0) {
	    close(0); dup(src_fd);
	 }
	 if (i+1< c_cmd) {
            close(1); dup(pfd[1]);
	 }
	 if ( execvp(argv[0], argv) < 0) exit(1); 
      }
      close(pfd[1]);
      src_fd = pfd[0];
   }

   while( (pid=wait(&i)) > 0) { if (i) err = 1; }
   
   return err;
}


Michael Lehn 1999-05-06