相关疑难解决方法(0)

如何在C中创建具有特定权限的Unix Domain Socket?

我有一个简单的代码,如:

sockaddr_un address;
address.sun_family = AF_UNIX;
strcpy(address.sun_path, path);
unlink(path);

int fd = socket(AF_UNIX, SOCK_STREAM, 0);
bind(fd, (sockaddr*)(&address), sizeof(address));
listen(fd, 100);
Run Code Online (Sandbox Code Playgroud)

我想以原子方式创建具有特定权限的Unix Domain Socket文件,例如:0777.手册没有说明有关套接字文件权限的umask任何内容.甚至,如果umask确实影响了套接字文件,那么它不是一种原子方式 - 在多线程程序中.

我希望,有一种方法可以在不使用umask()调用同步的情况下实现我的目标.

c unix sockets umask unix-socket

29
推荐指数
3
解决办法
2万
查看次数

如何更改linux套接字文件的权限?

我有一个程序,它创建一个套接字,然后我想更改套接字文件的权限:

ret_val = chmod(filename, 0777);
Run Code Online (Sandbox Code Playgroud)

,但它不会改变,即使ret_val为0.如果我在常规文件上尝试相同的操作,它也可以.

有任何想法吗?

PS:我以root身份运行程序,因此它拥有所需的所有权限.

c sockets permissions

7
推荐指数
1
解决办法
2万
查看次数

UNIX套接字权限(Linux)

我在C中使用UNIX套接字开发服务器。从手册中:

在Linux实现中,文件系统中可见的套接字使用per?所在目录的任务。可以更改其所有者,组和权限。如果进程在创建套接字所在的目录上没有写和搜索(执行)权限,则创建新套接字将失败。连接到套接字对象需要读/写权限。此行为与许多BSD衍生系统不同,后者忽略UNIX域套接字的权限。可移植程序不应依赖此功能来保证安全性。

我有一条世界可写的道路。

    $ ls -ld api
    drwxrwxrwx 2 root www-data 4096 Feb 15 21:57 api
Run Code Online (Sandbox Code Playgroud)

根目录下的进程在此路径中创建一个套接字:

    $  ls -l api/socket
    srwxr-xr-x 1 root root 0 Feb 15 21:57 api/socket
Run Code Online (Sandbox Code Playgroud)

由于权限问题,以用户身份运行的另一个进程无法连接到套接字。如果我手动将套接字权限更改为每个人都可写,则其他进程可以成功连接。

  1. 为什么像文档所说的那样,父级权限不足以使套接字可写?
  2. 在这种情况下,最佳做法是什么?

c unix sockets linux

3
推荐指数
2
解决办法
1万
查看次数

标签 统计

c ×3

sockets ×3

unix ×2

linux ×1

permissions ×1

umask ×1

unix-socket ×1