0

我需要使用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-

4

1 回答 1

1

您的作家出现段错误,因为您正在打开它进行写入,但没有写入权限。因此fp将是NULL,你的fprintf失败。

您的 FIFO 具有不正确权限的原因可能是因为您的umaskis 022,这意味着这些位正在从您发送到的掩码中清除mkfifo。这将导致您看到的权限。要解决此问题,请更改您的umask使用umask调用,或使用chmod.

但是你真的希望你的 FIFO 是可执行的吗?

于 2015-01-23T13:07:55.210 回答