2015-01-23 5 views
0

슈퍼 유저 프로세스에서 mkfifo()을 사용하여 파이프를 생성해야하는데, 그 파이프는 수퍼 유저가 아닌 프로세스에서 쓰기 가능해야합니다.mkfifo의 슈퍼 사용자 프로세스에서 사용 권한을 부여하십시오.

리더 :

int main() { 
    char *myfifo = "/tmp/myfifo"; 
    int buf; 
    mkfifo(myfifo, 0777); //problem here 

    FILE *fp; 
    fp = fopen(myfifo,"r"); 
    if (fp == NULL) { 
    unlink(myfifo); 
    return -1; 
    } 
    printf("received: %d\n",buf); 

    fclose(fp); 
    unlink(myfifo); 
    return 0; 
} 

저자 :

int main() { 
    FILE *fp; 
    char *myfifo = "/tmp/myfifo"; 

    fp = fopen(myfifo,"w"); 
    if (fp == NULL) 
    return -1; 

    fprintf(fp, "%d ", 2); 
    fclose(fp); 
    return 0; 
} 

내가 ./writersudo ./reader 호출합니다.

필자 필자가 세그먼트 오류를 ​​반환하는 파이프에 쓰려고 할 때. 그리고 내가 /tmp/myfifo을 보면 그 사용 권한이 prwxr-xr-x 인 것을 알았지 만, prw-rw-rw-을 원합니다.

+0

'fopen()'이 파일을 열 었는지 확인하지 않았기 때문에 세그먼테이션 오류가 발생합니다. 권한이 원인 일 가능성이 높지만 'fp == NULL'을 확인하지 않는 것이 좋습니다. –

+0

GDB는 여러분의 친구입니다! segfault * always *는 프로그래밍 오류를 나타냅니다. –

+0

맞아,하지만 이건 예제 야. 이제는 수정하겠습니다. 만약'fp! = NULL'을 확인해도 세그먼트 화 오류가 발생합니다 : – billi90

답변

1

작성자는 쓰기 용으로 열었지만 쓰기 권한이 없으므로 segfaulting입니다. 따라서 fpNULL이되고 fprintf은 실패합니다.

umask022이기 때문에 FIFO가 잘못된 사용 권한을 가지고있는 이유는 해당 비트가 mkfifo으로 보내는 마스크에서 지워지고 있음을 의미합니다. 이렇게하면 표시되는 권한이 생깁니다. 이 문제를 해결하려면 umaskumask 호출을 사용하여 변경하거나 명시 적으로 사용 권한을 chmod으로 설정하십시오.

하지만 실제로 FIFO를 실행 가능하게 만드시겠습니까?

+0

아니요, 내 FIFO가 실행 가능할 필요는 없지만 실행 권한을 주면 나는 희망이 없다. : P – billi90

+0

문제 없음 - 대답을 수락 해 주시기 바랍니다 :-) – abligh

+0

'chmod'를 사용하면 효과가 있지만'umask'는 어떻게 사용합니까? – billi90