2016-12-14 10 views
-3

mkfifo 명령을 사용하여 Linux에서 c로 명명 된 파이프를 만들려고합니다. 나는 아직도 배우고mkfifo를 실행하는 프로그램이 작동하지 않습니다.

#include <sys/types.h> 
#include <sys/stat.h> 
#include <unistd.h> 
#include <fcntl.h> 
#include <stdio.h> 
#include <string.h> 
#include <stdlib.h> 
#include <errno.h> 

#define MAX_LINE 80 

int main(int argc, char** argv) { 
int create; 
//mkfifo("/tmp/myfifo", 0666); 
create = mkfifo("tmp/myfifo", 0666); 
if (create==-1) 
{ 
    printf("error%s", strerror(errno)); 
} 
char line[MAX_LINE]; 
int pipe; 
pipe = open("/tmp/myfifo", O_WRONLY); 
if (pipe==-1) 
{printf("error"); 
} 
printf("Enter line: "); 
fgets(line, MAX_LINE, stdin); 
write(pipe, line, strlen(line)); 
sleep (100); 
close(pipe); 
return 0; 
} 

: 나는이 프로그램을 실행할 때, 나는 중 하나는 여기에

내 코드입니다 (콘솔 아무것도 표시되지 않습니다)는 "그런 파일 또는 디렉터리"오류 또는 절대적으로 아무것도 얻을 , 나는 내가 뭘 잘못하고 있는지 이해하지 못한다. 당신의 도움을 주셔서 감사합니다.

+0

[ask]를 보시고, 조언과 형식을 따라하고이 엉망을 정확하게 들여 쓰십시오. – Olaf

답변

1

명명 된 파이프가 유용하기 위해서는 누군가가 그것을 읽어야하고 누군가는 그것을 써야합니다. 일반적으로 이것은 2 개의 분리 된 프로그램이 될 것입니다. 귀하의 프로그램은 작가입니다. 독자는 어디 있습니까?

판독기가없는 경우 프로그램이 O_WRONLY을 열어 차단하는 것이 정상입니다. 그래서 프로그램이 아무 것도하지 않는 것처럼 보일 때, 실제로 이것을하는 것입니다 :

pipe = open("/tmp/myfifo", O_WRONLY); 

독자가 나타나기를 기다립니다.

다른 터미널에서 cat /tmp/myfifo을 실행하십시오. 독자의 존재는 작가가 진전하도록 허용 할 것입니다. 프로그램이 깨어서 Enter line 프롬프트로 이동하면 입력 한 내용이 cat에 의해 읽히고 두 번째 터미널에 기록됩니다.

다른 문제는 파일 이름이 일치하지 않는 것입니다. 한 곳에서 "tmp/myfifo"을 슬래시없이 썼기 때문에 현재 작업 디렉토리 안에있는 tmp 디렉토리에 명명 된 파이프를 만들려고합니다. 그 tmp 디렉토리가 존재하지 않으면 No such file or directory이 결과가됩니다.

+0

두 번째 리더 프로그램을 가지고 있는데 다른 임시 창에서 실행하는 경우에만이 작업을 수행합니다. ./test2 ttime__vdso_get _? @@ –

+0

잘못된 printf() 유형을 사용하고 있습니다. 많은 감사합니다. –