Как отправить простую строку между двумя программами с помощью труб?
Я пробовал искать в сети, но там почти нет ресурсов. Достаточно привести небольшой пример.
изменить
Я имею в виду, что две разные программы C общаются друг с другом. Одна программа должна отправить "Привет", а другая должна получить его. Что-то вроде того.
7 ответов:
обычная труба может соединять только два связанных процесса. Он создается процессом и исчезнет, когда последний процесс закроет его.
A именованный канал, также называемый FIFO для его поведения, может использоваться для соединения двух несвязанных процессов и существует независимо от процессов; это означает, что он может существовать, даже если никто его не использует. FIFO создается с помощью
mkfifo()библиотека функция.пример
писатель.c
#include <fcntl.h> #include <sys/stat.h> #include <sys/types.h> #include <unistd.h> int main() { int fd; char * myfifo = "/tmp/myfifo"; /* create the FIFO (named pipe) */ mkfifo(myfifo, 0666); /* write "Hi" to the FIFO */ fd = open(myfifo, O_WRONLY); write(fd, "Hi", sizeof("Hi")); close(fd); /* remove the FIFO */ unlink(myfifo); return 0; }читатель.c
#include <fcntl.h> #include <stdio.h> #include <sys/stat.h> #include <unistd.h> #define MAX_BUF 1024 int main() { int fd; char * myfifo = "/tmp/myfifo"; char buf[MAX_BUF]; /* open, read, and display the message from the FIFO */ fd = open(myfifo, O_RDONLY); read(fd, buf, MAX_BUF); printf("Received: %s\n", buf); close(fd); return 0; }Примечание: проверка ошибок была опущена из приведенного выше кода для простоты.
С создание труб в C, это показывает вам, как вилка программы для использования трубы. Если вы не хотите разветвлять (), вы можете использовать именованные каналы.
кроме того, вы можете получить эффект
prog1 | prog2путем отправки выводаprog1stdout и чтениеstdinнаprog2. Вы также можете прочитать stdin, открыв файл с именем/dev/stdin(но не уверен в переносимости этого)./***************************************************************************** Excerpt from "Linux Programmer's Guide - Chapter 6" (C)opyright 1994-1995, Scott Burkett ***************************************************************************** MODULE: pipe.c *****************************************************************************/ #include <stdio.h> #include <stdlib.h> #include <string.h> #include <unistd.h> #include <sys/types.h> int main(void) { int fd[2], nbytes; pid_t childpid; char string[] = "Hello, world!\n"; char readbuffer[80]; pipe(fd); if((childpid = fork()) == -1) { perror("fork"); exit(1); } if(childpid == 0) { /* Child process closes up input side of pipe */ close(fd[0]); /* Send "string" through the output side of pipe */ write(fd[1], string, (strlen(string)+1)); exit(0); } else { /* Parent process closes up output side of pipe */ close(fd[1]); /* Read in a string from the pipe */ nbytes = read(fd[0], readbuffer, sizeof(readbuffer)); printf("Received string: %s", readbuffer); } return(0); }
dup2( STDIN_FILENO, newfd )и
char reading[ 1025 ]; int fdin = 0, r_control; if( dup2( STDIN_FILENO, fdin ) < 0 ){ perror( "dup2( )" ); exit( errno ); } memset( reading, '', 1025 ); while( ( r_control = read( fdin, reading, 1024 ) ) > 0 ){ printf( "<%s>", reading ); memset( reading, '', 1025 ); } if( r_control < 0 ) perror( "read( )" ); close( fdin );но, я думаю, что
fcntlможет быть лучшим решениемecho "salut" | code
то, что одна программа записывает в stdout, может быть прочитано другой через stdin. Так просто, используя c, напишите
prog1чтобы напечатать что-то с помощьюprintf()иprog2читать что-то, используяscanf(). Тогда просто беги./prog1 | ./prog2
int main() { char buff[1024] = {0}; FILE* cvt; int status; /* Launch converter and open a pipe through which the parent will write to it */ cvt = popen("converter", "w"); if (!cvt) { printf("couldn't open a pipe; quitting\n"); exit(1) } printf("enter Fahrenheit degrees: " ); fgets(buff, sizeof (buff), stdin); /*read user's input */ /* Send expression to converter for evaluation */ fprintf(cvt, "%s\n", buff); fflush(cvt); /* Close pipe to converter and wait for it to exit */ status=pclose(cvt); /* Check the exit status of pclose() */ if (!WIFEXITED(status)) printf("error on closing the pipe\n"); return 0; }важными шагами в этой программе являются:
- The
popen()вызов, который устанавливает связь между дочерним процессом и каналом в Родительском.- The
fprintf()вызов, который использует канал в качестве обычного файла для записи в stdin дочернего процесса или чтения из его stdout.- The
pclose()вызов, который закрывает канал и вызывает дочерний процесс для завершения.
во-первых, попросите программу 1 записать строку в stdout (как если бы вы хотели, чтобы она появилась на экране). затем вторая программа должна прочитать строку из stdin, как если бы пользователь печатал с клавиатуры. затем вы бежите:
program_1 / program_2
этот ответ может быть полезен для будущего гуглера.
#include <stdio.h> #include <unistd.h> int main(){ int p, f; int rw_setup[2]; char message[20]; p = pipe(rw_setup); if(p < 0){ printf("An error occured. Could not create the pipe."); _exit(1); } f = fork(); if(f > 0){ write(rw_setup[1], "Hi from Parent", 15); } else if(f == 0){ read(rw_setup[0],message,15); printf("%s %d\n", message, r_return); } else{ printf("Could not create the child process"); } return 0; }вы можете найти расширенный двусторонний канал связи здесь.
Comments