Хрестоматия по программированию на Си в Unix



Системные вызовы и взаимодействие с UNIX. Хрестоматия по программированию на Си в Unix - стр. 2


if( append ){ /* >>file */ /* Файл name существует? Пробуем открыть на запись */ if((fd = open (name, O_WRONLY)) < 0) { if (errno == ENOENT) /* Файл еще не существовал */ goto CREATE; else return 0; /* Не имеем права писать в этот файл */ } /* иначе fd == открытый файл, *created == 0 */ }else{ CREATE: /* Пытаемся создать (либо опустошить) файл "name" */ if((fd = creat (name, 0666)) < 0 ) return 0; /* Не могу создать файл */ else *created = 1; /* Был создан новый файл */ } if (append) lseek (fd, 0l, 2); /* на конец файла */ /* перенаправить стандартный вывод */ dup2(fd, 1); if( err_too ) dup2(fd, 2); /* err_too=1 для >& */ close(fd); return 1; }

/* Перенаправить ввод */ int input (name) char *name; { int fd; if((fd = open (name, O_RDONLY)) < 0 ) return 0;/* Не могу читать */ /* перенаправить стандартный ввод */ dup2(fd, 0); close(fd); return 1; } /* запуск команды */ int cmdExec(progr, av, envp, inp, outp, outflg) char *progr; /* имя программы */ char **av; /* список аргументов */ char **envp; /* окружение */ char *inp, *outp; /* файлы ввода-вывода (перенаправления) */ int outflg; /* режимы перенаправления вывода */ { void (*del)(), (*quit)(); int pid; int cr = 0;

del = signal(SIGINT, SIG_IGN); quit = signal(SIGQUIT, SIG_IGN); if( ! (pid = fork())){ /* ветвление */ /* порожденный процесс (сын) */ signal(SIGINT, SIG_DFL); /* восстановить реакции */ signal(SIGQUIT,SIG_DFL); /* по умолчанию */ /* getpid() выдает номер (идентификатор) данного процесса */ printf( "Процесс pid=%d запущен\n", pid = getpid());

/* Перенаправить ввод-вывод */ if( inp ) if(!input( inp )){ fprintf(stderr, "Не могу <%s\n", inp ); goto Err; } if( outp ) if(!output (outp, outflg & APPEND, outflg & ERRTOO, &cr)){ fprintf(stderr, "Не могу >%s\n", outp ); goto Err; } /* Заменить программу: при успехе * данная программа завершается, а вместо нее вызывается * функция main(ac, av, envp) программы, хранящейся в файле progr. * ac вычисляет система. */ execvpe(progr, av, envp);




Содержание  Назад  Вперед