Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- /*
- Задание: Неименованные каналы. Поменять местами соседние строки (1-ю со 2-ой, 3-ю с 4-ой и т.д.).
- Сборка:
- gcc app.c -o app.out
- gcc swap.c -o swap.out
- ./app.out
- */
- /// app.c:
- #include <stdio.h>
- #include <unistd.h>
- #define r 0 //конец канала для чтения
- #define w 1 //конец канала для записи
- int fd; //дескриптор файла с данными
- int pid; //идентификатор процесса
- int p[2],q[2]; //массивы дескрипторов для каналов
- int total; //общее кол-во символов
- char buff[1]; //буфер для чтения и записи
- int n; //количество прочитанных байт
- FILE *fp; //поток fp
- int main(void)
- {
- pipe(p); //создаём канал с дескриптором р
- pipe(q); //создаём канал с дескриптором q
- pid=fork(); //порождаем процесс
- switch(pid)
- {
- case -1: // ошибка
- perror("\n\tError in fork()");
- return 0;
- case 0: // дочерний процесс
- // закрываем концы каналов:
- close(p[w]);
- close(r);
- // дублируем конец канала Р(чтение) на стд. ввод:
- dup(p[r]);
- close(p[r]);
- close(q[r]);
- // дублируем конец канала Q(запись) на стд. вывод:
- dup(q[w]);
- // закрываем конец канала Q(запись):
- close(q[w]);
- // выполняем программу обмена строк:
- if(execl("swap.out", "swap.out", 0) == -1) perror("\n\tError in execl()");
- return 0;
- default: // родительский процесс
- // закрываем концы каналов:
- close(p[r]); //закрываем конец канала р[0] (чтение)
- close(q[w]); //закрываем конец канала q[1] (запись)
- // открываем поток канала p[1](запись):
- fp = fdopen(p[w],"w");
- // открываем файл данных:
- fd = open("data.txt", 0);
- if(fd == -1) {
- perror("\n\tError in open()");
- return 0;
- }
- // читаем из файла символы пока не дойдём до конца файла:
- while((n = read(fd, buff, sizeof(buff)) > 0) && (buff[0] != EOF)) {
- putc(buff[0], fp); //записываем символ в конец канала p[1]
- printf("%c", buff[0]); //выводим символ на экран
- }
- fclose(fp); //закрываем поток конца канала p[1]
- close(r); //закрываем стандартный ввод
- dup(q[r]); //дублируем канала q[0](чтение) на стандартный ввод
- close(q[r]); //закрываем конец канала q[0]
- }
- return 0;
- }
- /// swap.c:
- #include <stdio.h>
- #include <string.h>
- char line1[256], line2[256];
- int len1 = 0, len2 = 0, lind = 0;
- char next;
- void main(void) {
- FILE* f = fopen("result.txt", "w");
- for (next = getchar(); next != EOF; next = getchar()) {
- if (next == '\r' || next == '\n') {
- if (lind == 0) {
- lind = 1;
- } else {
- lind = 0;
- line1[len1] = 0;
- line2[len2] = 0;
- fprintf(f, "%s\n%s\n", line2, line1);
- len1 = len2 = 0;
- }
- } else {
- if (lind == 0) {
- line1[len1++] = next;
- } else {
- line2[len2++] = next;
- }
- }
- }
- if (lind == 1) {
- line1[len1] = 0;
- fprintf(f, "%s\n", line1);
- }
- fclose(f);
- printf("File processed, lines swapped.\nResult is in 'result.txt'\n");
- }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement