int fd; size_t size; char
/*Программа 05-1.с, иллюстрирующая использование системных вызовов open(), write() и close() для записи информации в файл */ #include <sys/types.h> #include <fcntl.h> #include <stdio.h> int main(){ int fd; size_t size; char string[] = "Hello, world!"; /* Обнуляем маску создания файлов текущего процесса для того, чтобы права доступа у создаваемого файла точно соответствовали чпараметру вызова open() */ (void)umask(0); /* Попытаемся открыть файл с именем myfile в текущей директории только для операций вывода. Если файла не существует, попробуем его создать с правами доступа 0666, т. е. read-write для всех категорий пользователей */ if((fd = open("myfile", O_WRONLY | O_CREAT, 0666)) < 0){ /* Если файл открыть не удалось, печатаем об этом сообщение и прекращаем работу */ printf("Can\'t open file\n"); exit(-1); } /* Пробуем записать в файл 14 байт из нашего массива, т.е. всю строку "Hello, world!" вместе с признаком конца строки */ size = write(fd, string, 14); if(size != 14){ /* Если записалось меньшее количество байт, сообщаем об ошибке */ printf("Can\'t write all string\n"); exit(-1); } /* Закрываем файл */ if(close(fd) < 0){ printf("Can\'t close file\n"); } return 0; } |
Листинг 5.1. Программа 05-1.с, иллюстрирующая использование системных вызовов open(), write() и close() для записи информации в файл |
Закрыть окно |
/* Программа 05-2.с, иллюстрирующая работу с pip'ом в рамках одного процесса */ #include <sys/types.h> #include <unistd.h> #include <stdio.h> int main(){ int fd[2]; size_t size; char string[] = "Hello, world!"; char resstring[14]; /* Попытаемся создать pipe */ if(pipe(fd) < 0){ /* Если создать pipe не удалось, печатаем об этом сообщение и прекращаем работу */ printf("Can\'t create pipe\n"); exit(-1); } /* Пробуем записать в pipe 14 байт из нашего массива, т.е. всю строку "Hello, world!" вместе с признаком конца строки */ size = write(fd[1], string, 14); if(size != 14){ /* Если записалось меньшее количество байт, сообщаем об ошибке */ printf("Can\'t write all string\n"); exit(-1); } /* Пробуем прочитать из pip'а 14 байт в другой массив, т.е. всю записанную строку */ size = read(fd[0], resstring, 14); if(size < 0){ /* Если прочитать не смогли, сообщаем об ошибке */ printf("Can\'t read string\n"); exit(-1); } /* Печатаем прочитанную строку */ printf("%s\n",resstring); /* Закрываем входной поток*/ if(close(fd[0]) < 0){ printf("Can\'t close input stream\n"); } /* Закрываем выходной поток*/ if(close(fd[1]) < 0){ printf("Can\'t close output stream\n"); } return 0; } |
Листинг 5.2. Программа 05-2.с, иллюстрирующая работу с pip'ом в рамках одного процесса |
Закрыть окно |
/* Программа 05-3.с, осуществляющая однонаправленную связь через pipe между процессом-родителем и процессом-ребенком */ #include <sys/types.h> #include <unistd.h> #include <stdio.h> int main(){ int fd[2], result; size_t size; char resstring[14]; /* Попытаемся создать pipe */ if(pipe(fd) < 0){ /* Если создать pipe не удалось, печатаем об этом сообщение и прекращаем работу */ printf("Can\'t create pipe\n"); exit(-1); } /* Порождаем новый процесс */ result = fork(); if(result){ /* Если создать процесс не удалось, сообщаем об этом и завершаем работу */ printf("Can\'t fork child\n"); exit(-1); } else if (result > 0) { /* Мы находимся в родительском процессе, который будет передавать информацию процессу-ребенку. В этом процессе выходной поток данных нам не понадобится, поэтому закрываем его.*/ close(fd[0]); /* Пробуем записать в pipe 14 байт, т.е. всю строку "Hello, world!" вместе с признаком конца строки */ size = write(fd[1], "Hello, world!", 14); if(size != 14){ /* Если записалось меньшее количество байт, сообщаем об ошибке и завершаем работу */ printf("Can\'t write all string\n"); exit(-1); } /* Закрываем входной поток данных, на этом родитель прекращает работу */ close(fd[1]); printf("Parent exit\n"); } else { /* Мы находимся в порожденном процессе, который будет получать информацию от процесса-родителя. Он унаследовал от родителя таблицу открытых файлов и, зная файловые дескрипторы, соответствующие pip, иможет его использовать. В этом процессе входной поток данных нам не ипонадобится, поэтому закрываем его.*/ close(fd[1]); /* Пробуем прочитать из pip'а 14 байт в массив, т.е. всю записанную строку */ size = read(fd[0], resstring, 14); if(size < 0){ /* Если прочитать не смогли, сообщаем об ошибке и завершаем работу */ printf("Can\'t read string\n"); exit(-1); } /* Печатаем прочитанную строку */ printf("%s\n",resstring); /* Закрываем входной поток и завершаем работу */ close(fd[0]); } return 0; } |
Листинг 5.3. Программа 05-3.с, осуществляющая однонаправленную связь через pipe между процессом-родителем и процессом-ребенком |
Закрыть окно |