2012-10-30 2 views
1

mkfifo() 현재 디렉토리에서 권한 오류가 발생합니다. 여기에 파일을 만들 수있는 권한이 있습니다. 어떤 문제가 어떤 문제 일 수 있습니까?C (명명 된 파이프)의 FIFO

char dir[FILENAME_MAX]; 
getcwd(dir, sizeof(dir)); 


for(i = 0; i<num_nodes; i++) 
{ 
    char path[FILENAME_MAX]; 
    sprintf(path, "%s/%d",dir, i); 
    printf("%s\n", path); 
    fifoArray[i] = mkfifo(path, O_WRONLY); 
    if(fifoArray[i] < 0) 
    { 
     printf("Couldn't create fifo\n"); 
     perror(NULL); 
    } 
} 
+0

"fifo를 만들 수 없습니다."라는 오류 메시지가 나타납니다. 따라서, 그것은 stderr에 속합니다. 단순히'perror (path);를 쓰는 것이 낫겠지 만, 당신의 printf는 아마'errno'를 변경하고 있습니다, 그래서 당신의 perror 호출은 나쁜 정보를 제공합니다. –

+0

'errno'가 무엇으로 설정되었는지 확인 했습니까? – squiguy

+0

printf를 제거하면 perror()는 무엇을 인쇄합니까? – pedr0

답변

1

권한 오류가 발생했다는 것을 알려주기 위해 perror의 결과에 의존하는 경우 오용되었을 가능성이 큽니다. printf를 호출하면 errno가 변경 될 가능성이 높으므로 정보가 위조됩니다. printf를 호출하지 마십시오. 다음과 같이 작성하십시오.

perror(path); 

오류 메시지가 변경되는지 확인하십시오.

+0

이제 "잘못된 인수"가 표시됩니다. 그러나 두 인수 모두 유효합니까? –

4

oflag이 아닌 mode_t으로 생성합니다. 0666 :

mkfifo은 즉 같은 것을 입력 mode_t

의 두 번째 매개 변수를 사용합니다. fcntl.h에 정의 된대로 당신은 그것을에게 oflag을 공급하기 위해 노력하고, 이것은 일반적으로 같은 것입니다 : 따라서

#define O_RDONLY    00 
#define O_WRONLY    01 
#define O_RDWR    02 

, Invalid argument. 다음은 fifo를 여는 방법입니다.

char * myfifo = "/tmp/myfifo"; 
mkfifo(myfifo, 0666); 

if((fd = open(myfifo, O_RDONLY | O_NONBLOCK)) < 0){ 
    printf("Couldn't open the FIFO for reading!\n"); 
    return 0; 
} 
else { 
    //do stuff with the fifo 
관련 문제