파이프를 사용하여 두 프로그램간에 간단한 문자열을 보내는 방법은 무엇입니까?
인터넷 검색을 시도했지만 리소스가 거의 없습니다. 작은 예만으로도 충분합니다.
편집 내 말은 서로 통신하는 두 개의 다른 C 프로그램입니다. 한 프로그램은 "Hi"를 보내고 다른 프로그램은이를 받아야합니다. 그런 것.
일반 파이프는 두 개의 관련 프로세스 만 연결할 수 있습니다. 프로세스에 의해 생성되며 마지막 프로세스가 닫을 때 사라집니다.
동작을 위해 FIFO라고도 하는 명명 된 파이프 는 관련없는 두 프로세스를 연결하는 데 사용할 수 있으며 프로세스와 독립적으로 존재합니다. 아무도 사용하지 않아도 존재할 수 있다는 의미입니다. FIFO는 mkfifo()
라이브러리 기능을 사용하여 생성 됩니다.
예
writer.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;
}
reader.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;
}
참고 : 단순화를 위해 위 코드에서 오류 검사가 생략되었습니다.
From Creating Pipes in C, this shows you how to fork a program to use a pipe. If you don't want to fork(), you can use named pipes.
In addition, you can get the effect of prog1 | prog2
by sending output of prog1
to stdout and reading from stdin
in prog2
. You can also read stdin by opening a file named /dev/stdin
(but not sure of the portability of that).
/*****************************************************************************
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 )
And read:
char reading[ 1025 ];
int fdin = 0, r_control;
if( dup2( STDIN_FILENO, fdin ) < 0 ){
perror( "dup2( )" );
exit( errno );
}
memset( reading, '\0', 1025 );
while( ( r_control = read( fdin, reading, 1024 ) ) > 0 ){
printf( "<%s>", reading );
memset( reading, '\0', 1025 );
}
if( r_control < 0 )
perror( "read( )" );
close( fdin );
But, I think that fcntl
can be a better solution
echo "salut" | code
What one program writes to stdout can be read by another via stdin. So simply, using c, write prog1
to print something using printf()
and prog2
to read something using scanf()
. Then just run
./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 important steps in this program are:
- The
popen()
call which establishes the association between a child process and a pipe in the parent. - The
fprintf()
call that uses the pipe as an ordinary file to write to the child process's stdin or read from its stdout. - The
pclose()
call that closes the pipe and causes the child process to terminate.
first, have program 1 write the string to stdout (as if you'd like it to appear in screen). then the second program should read a string from stdin, as if a user was typing from a keyboard. then you run:
program_1 | program_2
This answer might be helpful for a future Googler.
#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;
}
You can find an advanced two-way pipe call example here.
'Programming' 카테고리의 다른 글
pdf 문서를 Webview에 어떻게 표시 할 수 있습니까? (0) | 2020.08.11 |
---|---|
Javascript에서 새 줄을 어떻게 생성합니까? (0) | 2020.08.11 |
Ruby에서 모듈 변수 만들기 (0) | 2020.08.11 |
부울 배열을 정수 배열로 변환하는 방법 (0) | 2020.08.11 |
두 좌표 사이의 거리를 계산하는 기능 (0) | 2020.08.11 |