c - socketpair() 以只读方式打开套接字端?

标签 c linux

我正在处理一些进程间通信,我正在使用 socketpairs 进行一些处理。我遇到了一些奇怪的行为,不幸的是我无法用一小段代码复制这些行为。我正在以标准方式打开一对套接字:

// setup a socket for read/write functionality
if (socketpair(AF_UNIX, SOCK_STREAM, 0, fds) < 0) {
   <handle error>
}

但是当我去查看我进程的/proc/[pid]/fd 文件夹时:

total 0
dr-x------ 2 user user  0 May 14 16:37 ./
dr-xr-xr-x 8 user user  0 May 14 16:37 ../
lrwx------ 1 user user 64 May 14 16:38 1 -> /dev/pts/4
l-wx------ 1 user user 64 May 14 16:38 10 -> pipe:[19185636]
lr-x------ 1 user user 64 May 14 16:37 11 -> anon_inode:[eventpoll]
lr-x------ 1 user user 64 May 14 16:38 12 -> socket:[19189280]
lr-x------ 1 user user 64 May 14 16:37 13 -> socket:[19189281]
lrwx------ 1 user user 64 May 14 16:38 2 -> /dev/pts/4
lrwx------ 1 user user 64 May 14 16:38 3 -> /run/shm/spork_8902
lrwx------ 1 user user 64 May 14 16:38 4 -> socket:[19184133]
lrwx------ 1 user user 64 May 14 16:38 5 -> anon_inode:[eventpoll]
l-wx------ 1 user user 64 May 14 16:38 6 -> /dev/null
l-wx------ 1 user user 64 May 14 16:37 7 -> anon_inode:[eventpoll]
l-wx------ 1 user user 64 May 14 16:37 8 -> anon_inode:[eventpoll]
lr-x------ 1 user user 64 May 14 16:37 9 -> anon_inode:[eventpoll]

套接字已以只读方式打开(此处为 fds #12/13)。

我没有在我的代码中做任何改变文件权限的事情,而且 valgrind 也没有指示任何不明智的内存访问。有谁知道是什么导致了这种情况?

最佳答案

套接字的权限只影响在创建套接字后尝试连接到套接字的进程。 socketpair() 在创建套接字时将进程连接到套接字,因此此时权限无效。将它们设置为只读可防止与套接字建立新连接,这是适当的,因为它应该是创建该对的进程以及它将它们传递给的任何进程的私有(private)通信。

这类似于创建新文件时权限的工作方式。你可以这样写:

open(filename, O_WRONLY | O_CREAT, 0400);

创建一个具有只读权限的文件,但以写入模式打开它。权限仅影响以后打开文件的尝试,而不影响创建文件的操作——它始终可以访问文件。

关于c - socketpair() 以只读方式打开套接字端?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37232636/

相关文章:

c - 未定义对 `PDC_ungetch' 的引用,而其他函数在 PDcurses 中工作

c - 共享库中的段错误。如何调试?

c - 忽略 C 中的返回值

linux - 如何使用 bash 递归删除大量不同文件夹中的一组目录?

xmllint 捕获错误代码

连接拒绝连接到 1234 以外的任何端口

将 float 转换为 int

c - 向后打印双向链表段错误

linux - 在 linux bash 脚本中的 awk 中执行日期实用程序

linux - .htaccess mod_rewrite 用于 web 服务以及隐藏其他文件