Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/sockets/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 更改linux套接字文件权限_C++_Sockets_Unix Socket - Fatal编程技术网

C++ 更改linux套接字文件权限

C++ 更改linux套接字文件权限,c++,sockets,unix-socket,C++,Sockets,Unix Socket,首先,是的,这是相关的,但我有一个稍微不同的情况,我的帖子没有得到答案 因此,在我的Dell桌面工作站Ubuntu10.0432位上,我开发了一个服务器程序,该程序旨在为Apache运行的PHP“程序”提供Unix域套接字。(注意:umask=0022)我将套接字文件命名为/home/wmiller/ACT/web\u socket\u文件。(ACT是指产品名称)/home/wmiller/ACT拥有777的权限/home/wmiller/ACT/web_socket_文件的创建权限为777 现

首先,是的,这是相关的,但我有一个稍微不同的情况,我的帖子没有得到答案

因此,在我的Dell桌面工作站Ubuntu10.0432位上,我开发了一个服务器程序,该程序旨在为Apache运行的PHP“程序”提供Unix域套接字。(注意:umask=0022)我将套接字文件命名为/home/wmiller/ACT/web\u socket\u文件。(ACT是指产品名称)/home/wmiller/ACT拥有777的权限/home/wmiller/ACT/web_socket_文件的创建权限为777

现在,我将程序复制到我的测试平台,一个Q7格式的英特尔处理器板,它也有Ubuntu 10.04 32位和umask=0022。相同的目录,相同的目录777权限。但是,现在当我运行code/home/wmiller/ACT/web_socket_文件时,会出现755个权限,Apache/PHP无法打开Unix域套接字,因为它获得的是r-x权限,而不是rw-或rwx。Apache正在uid=www数据中运行

sockaddr_un       webServAddr;
remove( g_webSocketFileName.c_str() );       // to erase any lingering file from last time

memset(&webServAddr, 0, sizeof(webServAddr));
webServAddr.sun_family        = AF_UNIX;
snprintf( webServAddr.sun_path, UNIX_PATH_MAX, "%s", g_webSocketFileName.c_str() );

if (( g_webServerSock = socket(AF_UNIX, SOCK_STREAM, 0)) < 0 )
{
    PLOG( ERROR ) << "Failed to acquire the web Server socket: ";  // uses google glog tool
    return -1;
}

已尝试777和o+w的权限

我甚至试着添加一个

unlink( g_webSocketFileName.c_str() );
但是没有帮助

有人对ir为什么在一台机器上工作而不是在另一台几乎相同的机器上工作有什么建议吗?
我把套接字文件放到别处会更好吗?套接字文件的存放位置是否标准?

在Linux上,在
bind()
之前,需要在Unix域套接字文件描述符上调用
fchmod()
。这样,
bind()
调用将创建具有指定权限的文件系统对象。在已绑定的套接字上调用
fchmod()
无效

使用
chmod()。如果可能,请改用
fchmod()

这是一个特定于Linux的黑客攻击。在大多数BSD系统上,
fchmod()
将在套接字fd上失败并设置
EINVAL


编辑。我通过修补发现了这种依赖于系统的行为差异。也许最好的“源代码”应该是内核源代码本身

  • 在FreeBSD上,Unix域套接字上的
    fchmod()
    似乎被定义为设置
    EINVAL
  • 在Linux上,似乎Unix域套接字fd的创建方式与inode类似,并带有文件模式(但使用
    S_IFSOCK
    bitwise-or'ed in)。Linux的
    fchmod()
    实现将很高兴地对这样的对象应用更改。将Unix域套接字绑定到地址时,文件模式用于创建文件系统对象。根据
    man 2 stat
    S_IFSOCK
    出现在POSIX.1-2001中

如果我读错了源代码,请随时更正。

在Linux上,您需要在
bind()之前调用Unix域套接字文件描述符上的
fchmod()
。这样,
bind()
调用将创建具有指定权限的文件系统对象。在已绑定的套接字上调用
fchmod()
无效

使用
chmod()。如果可能,请改用
fchmod()

这是一个特定于Linux的黑客攻击。在大多数BSD系统上,
fchmod()
将在套接字fd上失败并设置
EINVAL


编辑。我通过修补发现了这种依赖于系统的行为差异。也许最好的“源代码”应该是内核源代码本身

  • 在FreeBSD上,Unix域套接字上的
    fchmod()
    似乎被定义为设置
    EINVAL
  • 在Linux上,似乎Unix域套接字fd的创建方式与inode类似,并带有文件模式(但使用
    S_IFSOCK
    bitwise-or'ed in)。Linux的
    fchmod()
    实现将很高兴地对这样的对象应用更改。将Unix域套接字绑定到地址时,文件模式用于创建文件系统对象。根据
    man 2 stat
    S_IFSOCK
    出现在POSIX.1-2001中

如果我看错了资料来源,请随时更正。

明白了!我所要做的就是将chmod()移到bind()语句之后,它就工作了!。知道了!我所要做的就是将chmod()移到bind()语句之后,它就工作了!。你有在linux上工作的授权来源吗?在手册页中(fchmod(3),而fchmod(2)根本没有谈到套接字),这种行为被描述为未指定。这些组合(绑定前、侦听后)都不起作用。在所有情况下,它都返回0,但未更改文件权限。只有chmod()起作用。您有在linux上进行此工作的授权源吗?在手册页中(fchmod(3),而fchmod(2)根本没有谈到套接字),这种行为被描述为未指定。这些组合(绑定前、侦听后)都不起作用。在所有情况下,它都返回0,但未更改文件权限。只有chmod()起作用。
char temp[100];
sprintf( temp , "chmod o+w %s\n", g_webSocketFileName.c_str() );
system( temp );
unlink( g_webSocketFileName.c_str() );