Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/c/71.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

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/linux/26.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 更改文件描述符的读/写权限_C_Linux_Unlink_Dup - Fatal编程技术网

C 更改文件描述符的读/写权限

C 更改文件描述符的读/写权限,c,linux,unlink,dup,C,Linux,Unlink,Dup,我正在从事一个LinuxC项目,在使用文件描述符时遇到了问题 我有一个孤立的文件描述符(文件是open()'d,然后取消链接()'d,但是fd仍然是好的),它只有写权限。原始支持文件具有完全权限(使用S|u IRUSR | S|u IWUSR | S|u IRGRP | S|IROTH创建),但遗憾的是,该文件仅使用O|u wroth打开。是否可以复制文件描述符并将副本更改为O_RDWR psudo代码: //open orphan file int fd = open(fname, O_WR

我正在从事一个LinuxC项目,在使用文件描述符时遇到了问题

我有一个孤立的文件描述符(文件是open()'d,然后取消链接()'d,但是fd仍然是好的),它只有写权限。原始支持文件具有完全权限(使用S|u IRUSR | S|u IWUSR | S|u IRGRP | S|IROTH创建),但遗憾的是,该文件仅使用O|u wroth打开。是否可以复制文件描述符并将副本更改为O_RDWR

psudo代码:


//open orphan file
int fd = open(fname, O_WRONLY, ...)
unlink(fname)
//fd is still good, but I can't read from it

//...

//I want to be able to read from orphan file
int fd2 = dup(fd)
//----change fd2 to read/write???----

提前谢谢!
-Andrew

不,没有POSIX功能来更改打开模式。您需要以读/写模式打开它。但是,由于您创建的是一个临时文件,我强烈建议您使用。该函数以读/写模式正确打开文件并取消链接。最重要的是,它避免了命名和创建文件时的竞争条件,从而避免了创建临时文件时的漏洞

fcntl(fd,F_SETFL,fcntl(fd,F_GETFL)| O_RDWR))
似乎就是这样,但手册页特别指出这不起作用。我想内核“需要”这是不可能的,这是有原因的。那么,如果您打算阅读它,为什么要以wronly模式打开它呢?奇怪的是,
freopen
是如何实现的?它失败了吗?@R..:在Linux下,同样的规则也适用。不允许更改访问模式,也不会返回错误(在本例中为空流)。任何读/写尝试也将导致
EBADF
。如果您想知道不允许它的原因,请想象一下将
stdin
更改为允许写入,将
stdout
更改为允许读取-非感知是的,在Linux上,您可以通过打开
/proc/self/fd/n
来实现这一点。看,mkstemp没有解开AFAIK的链接?MK说了什么。我总是可以将O_EXCL添加到open()并在失败时重试请添加一些详细信息
int fd = open(fname, O_WRONLY, ...)
int fd_ro = open(fname, O_RDONLY, ...)
unlink(fname)
{ write to fd }
close (fd);
read or execute(!) fd_ro