Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > C/C++: Программирование под Unix/Linux > как передать информацию через файловую систему?


Автор: abskura 12.12.2009, 16:16
Обращаюсь к достопочтенным форумчанам со следующим вопросом:
- Что на практике означает (какие системные вызовы используются): "Передать полученную информацию через файловую систему в параллельный процесс"?

Понятно, что тут юзается fork(), а вот что значит передать через файловую систему? Это как? Это же явно не pipe(), тут что-то другое, подскажите что.

Полный текст задания:
Написать программу определения типа файла, указанного при зап­росе. Полученную информацию через файловую систему передать в параллельный процесс, где вывести на печать. Предусмотреть возможность поступления неоднократного прерывания от клавиатуры. При поступлении каждого сигнала прерывания выводить количество файлов (из числа ука­занных при запросе), содержащих текст программ на Си.

Автор: MAKCim 12.12.2009, 16:24
скорее всего имеется в виду либо именованный канал (man mkfifo), либо обычный файл

Автор: djamshud 12.12.2009, 16:45
Плюсую fifo. Но и через файл можно: man select, man poll.

Автор: abskura 13.12.2009, 00:32
Реализую через mkfifo

Код
                        
#include <stdlib.h>  
#include <sys/types.h>
#include <unistd.h>  
#include <stdio.h>     
#include <fcntl.h>
#include <string.h>
int main()
{
    char str[256];
    char fileName[80];
    char buf[256];
    int childpid;
    int fd_fifo_w, fd_fifo_r;
    
    printf("\nEnter file name: ");
    scanf("%s", fileName);
    strcpy(str, "file ");
    strcat(str, fileName);
    
    unlink("/tmp/fifo0001.1");
    if((mkfifo("/tmp/fifo0001.1", 0666)) == -1)
        perror("mkfifo");        
    if(childpid=fork() == -1)
        perror("fork");
        
    if(childpid == 0)
    {
        printf("\nСын\n");
        if((fd_fifo_w = open("/tmp/fifo0001.1", O_WRONLY)) == -1)
            perror("open");    
        dup2(fd_fifo_w,1);
        system(str);
        close(fd_fifo_w);
    }
    else
    {
        printf("\nОтец\n");
                wait(0);
        if((fd_fifo_r = open("/tmp/fifo0001.1", O_RDONLY)) == -1)
            perror("open");    
        if(read(fd_fifo_r, &buf, 256) == -1)
            perror("read");
        printf("\nbuf: %s\n", buf);
        close(fd_fifo_r);
    }
    printf("\n");
    return 0;
}


В итоге при выполнении программы появлятеся это:
Код

user@Computer:~/working$ ./prog

Enter file name: file.c

Сын1

Сын1



И программа остаётся не завершённой. На чём-то виснет и не выходит. В процесс отец она получается вообще не попадает, а в сына аж два раза запускала. Завершить её можно нажав ctrl+C. Все перроры молчат... В чём тут может быть загвоздка? Просто первый раз использую mkfifo.

Автор: abskura 13.12.2009, 00:57
Добавил флаг O_NONBLOCK в оба open().
Теперь ситуация выглядит следующим образом
Код

usr@Computer:~/working$ ./prog

Enter file name: file.c

Сын1
open: No such device or address
file.c: ASCII C program text

Сын1
open: No such device or address
file.c: ASCII C program text


usr@Computer:~/working$


Чем не доволен опен?

Автор: MAKCim 13.12.2009, 11:00
Цитата(abskura @  13.12.2009,  00:32 Найти цитируемый пост)
 if(childpid=fork() == -1)
        perror("fork");

тут логическая ошибка

Добавлено через 9 минут и 8 секунд
Цитата(abskura @  13.12.2009,  00:57 Найти цитируемый пост)
Чем не доволен опен? 

в неблокирующем режиме открыть канал на запись можно только если некоторый _уже_ открыл его на чтение

Автор: abskura 13.12.2009, 16:17
MAKCim Спасибо вам огромное, всегда выручаете).
if проглядел). С mkfifo разобрался.

При попытке записи в FIFO, который не открыт в данный момент для чтения ни одним процессом, генерируется сигнал SIGPIPE.  При помощи обработчика сигнала мы эту гадость обходим и радуемся жизни. http://www.opennet.ru/docs/RUS/linux_parallel/node17.html

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)