socketpair()以只读方式打开套接字结束?

时间:2016-05-14 22:42:27

标签: 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并没有表明任何不幸的内存访问。有没有人知道这会导致什么原因?

1 个答案:

答案 0 :(得分:2)

套接字上的权限仅影响在创建套接字后尝试连接套接字的进程。 socketpair()在创建过程时将进程连接到套接字,因此当时权限不起作用。使它们成为只读可以防止与套接字的新连接,这是合适的,因为它应该是由创建该对的进程以及它传递给它的任何进程的私有通信。

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

open(filename, O_WRONLY | O_CREAT, 0400);

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