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


Автор: admsasha 8.1.2007, 08:15
Как я понял, через pipe можно сделать общение процесов. Но все примеры которые я видел работают только под windows
<windows.h>

Можете кинуть самый простой пример с именованным pipe, клиент+сервер под linux ?  smile 

Автор: MAKCim 8.1.2007, 10:14
Код

static void do_client(const char *path) {
    int fd = open(path, O_RDONLY);
    if (fd < 0)
        _exit(errno);
    do {
        /* work with FIFO for read */
    } while (1);
}

static void do_server(const char *path) {
    /* we must block here or ignore SIGPIPE */
    int fd = open(path, O_WRONLY);
    if (fd < 0)
        _exit(errno);
    do {
        /* work witch FIFO for write */
    } while (1);
}

static void do_work(const char *path, mode_t mode) {
    if (mkfifo(path, mode) < 0) {
        if (errno == -EEXIST) {
            do_client(path);
            return;
        }
        _exit(errno);
    }
    do_server(path);
}

Автор: admsasha 8.1.2007, 10:51
читаю так
 
Код

       read(fd,line, 1024);
        printf("%s\n",line);

пишу так

Код

write(fd,string,1024);


на экране нечего нет... что не так делаю ?

Завершающий код какой нибуть нужно ставить в string ? 

P.S. Файл создается.

Автор: bilbobagginz 8.1.2007, 13:37
http://www.linuxhq.com/guides/LPG/node7.html
(англ.)
с примерами

Автор: admsasha 8.1.2007, 13:59
Цитата(bilbobagginz @  8.1.2007,  20:37 Найти цитируемый пост)
http://www.linuxhq.com/guides/LPG/node7.html
(англ.)
с примерами 


Большое тебе спасибо !!! нашел что искал. Точнее через pipe передал данные, теперь буду думать толи мне надо =))

Добавлено @ 14:11 
Код

/*****************************************************************************
 Excerpt from "Linux Programmer's Guide - Chapter 6"
 (C)opyright 1994-1995, Scott Burkett
 ***************************************************************************** 
 MODULE: fifoserver.c
 *****************************************************************************/

#include <stdio.h>
#include <stdlib.h>
#include <sys/stat.h>
#include <unistd.h>

#include <linux/stat.h>

#define FIFO_FILE       "MYFIFO"

int main(void)
{
        FILE *fp;
        char readbuf[80];

        /* Create the FIFO if it does not exist */
        umask(0);
        mknod(FIFO_FILE, S_IFIFO|0666, 0);

        while(1)
        {
                fp = fopen(FIFO_FILE, "r");
                fgets(readbuf, 80, fp);
                printf("Received string: %s\n", readbuf);
                fclose(fp);
        }

        return(0);
}
Since a FIFO blocks by default, run the server in the background after you compile it: 


        $ fifoserver&
We will discuss a FIFO's blocking action in a moment. First, consider the following simple client frontend to our server: 


/*****************************************************************************
 Excerpt from "Linux Programmer's Guide - Chapter 6"
 (C)opyright 1994-1995, Scott Burkett
 ***************************************************************************** 
 MODULE: fifoclient.c
 *****************************************************************************/

#include <stdio.h>
#include <stdlib.h>

#define FIFO_FILE       "MYFIFO"

int main(int argc, char *argv[])
{
        FILE *fp;

        if ( argc != 2 ) {
                printf("USAGE: fifoclient [string]\n");
                exit(1);
        }

        if((fp = fopen(FIFO_FILE, "w")) == NULL) {
                perror("fopen");
                exit(1);
        }

        fputs(argv[1], fp);

        fclose(fp);
        return(0);
}



эм.. не всё так просто. 

1. Как сделать что бы client не ждал отправки если сервер я не включил, допустим отправил в "файл" и всё ?

2. Как сделать что бы сервер не ждал ввода, а проверил ввод и пошел дальше, проверил дальше по циклу ?

Автор: GrayCardinal 8.1.2007, 15:50
admsasha, 
Ты меня конечно извини, но хочу заметить что есть такие "страшные" вещи, как :
1. man'ы
2. google.ru
3. opennet.ru
4. книжки (да, черт возьми, да smile ).
может стоит перестать их бояться ?  smile 

Автор: bsa 12.1.2007, 00:19
admsasha, открывай в неблокирующем режиме, а дальше юзай select...

Автор: GrayCardinal 12.1.2007, 04:45
bsa, 
Ты забыл лекцию на пару суток про то что такое "select"  smile 

Автор: MAKCim 12.1.2007, 10:24
Цитата

открывай в неблокирующем режиме

у него вроде как не сокеты

Автор: bilbobagginz 12.1.2007, 12:14
Цитата

у него вроде как не сокеты 

а разьве non-blocking I/O - только для сокетов ?

Автор: admsasha 12.1.2007, 13:04
bsa, Извеняюсь, но тему можно закрывать


Код

fp = open(FIFO_FILE,O_WRONLY|O_NDELAY );


и всё

Автор: MAKCim 12.1.2007, 17:29
Цитата

а разьве non-blocking I/O - только для сокетов ?

man 2 select (special note for Linux)

Автор: bsa 20.1.2007, 20:49
Цитата(MAKCim @ 12.1.2007,  17:29)
man 2 select (special note for Linux)

Цитата(man 2 select)
LINUX NOTES
The  Linux pselect() system call modifies its timeout argument.  However, the glibc wrap-
per function hides this behaviour by using a local variable for the timeout argument that
is  passed  to  the  system call.  Thus, the glibc pselect() function does not modify its
timeout argument; this is the behaviour required by POSIX.1-2001.
.....
Under  Linux,  select() may report a socket file descriptor as "ready for reading", while
nevertheless a subsequent read blocks. This  could  for  example  happen  when  data  has
arrived but upon examination has wrong checksum and is discarded. There may be other cir-
cumstances in which a file descriptor is spuriously reported as ready.  Thus  it  may  be
safer to use O_NONBLOCK on sockets that should not block.
Только какое это отношение имеет к pipe и неблокирующему IO?

Автор: MAKCim 20.1.2007, 20:52
bsa, 
извиняюсь, не Linux notes
а BUGS (последний абзац)

Автор: bsa 20.1.2007, 20:53
Я нашел, но там про сокеты, а не пайпы smile

Автор: MAKCim 20.1.2007, 21:15
Цитата

Я нашел, но там про сокеты, а не пайпы

блин, ну а я что писал
Цитата(MAKCim @  12.1.2007,  10:24 Найти цитируемый пост)
у него вроде как не сокеты 


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