我需要从超级用户进程使用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;
}
我致电./writer
和sudo ./reader
。
当我的作家尝试在管道中写入返回分段错误时。如果我查看/tmp/myfifo
,我会发现权限prwxr-xr-x
,但我想要prw-rw-rw-
。
答案 0 :(得分:1)
你的作家是segfaulting,因为你打开它进行写作,但没有权限写入它。因此fp
将为NULL
,而您的fprintf
将失败。
您的FIFO权限不正确的原因可能是因为您的umask
是022
,这意味着这些位正从您发送到mkfifo
的掩码中清除。这将导致您看到的权限。要解决此问题,请使用umask
调用更改umask
,或使用chmod
明确设置权限。
但你真的希望你的FIFO能够执行吗?