在 bash 脚本中,我可以编写:
exec 2>&1
exec someprog
Run Code Online (Sandbox Code Playgroud)
并且 stderr 输出someprog将被重定向到 stdout。
有没有办法使用 python 的os.exec*函数来做类似的事情?
这不必是可移植的,只需在 Linux 上工作即可。
我有一个程序受到文件描述符增加的影响。当我执行命令 ls -l /proc/5969/fd 时,我看到其中 5969 是 java 程序的 pid 文件描述符的数量不断增加。但我无法打开其中一个文件描述符以查看哪些文件保持打开状态:以下是列表示例:
lrwx------ 1 root root 64 oct 24 16:08 52295 -> socket:[2577706264]
lrwx------ 1 root root 64 oct 24 16:08 52296 -> socket:[2579543392]
lrwx------ 1 root root 64 oct 24 16:08 52297 -> socket:[2578760962]
Run Code Online (Sandbox Code Playgroud)
请帮助我找到解决此文件描述符泄漏的方法,了解哪些文件保持打开状态并增加文件描述符数量。
我目前在程序的事件查看器中收到“句柄不足”错误。
列出哪些进程正在使用文件句柄的好程序是什么?
一个例子是 *nix 世界中的 'lsof'。
我想通过使用文件描述符来读取文件。由于分配规则,我无法使用它的名称。
我通过打电话获得它open并且工作正常。此时我知道我必须使用该read()函数才能读取它。我的问题是该read()函数需要作为参数读取的字节数,并且我想每次从文件中读取整行,所以我不知道要读取多少字节。
例如,如果我使用fscanf(),它可以很好地处理一个简单的字符串,并且我可以根据需要收回整行。所以我的问题是:
是否有类似的函数fscanf()可以使用文件描述符而不是文件指针来调用?
我正在尝试学习 POSIX 中的基本 IO 函数,我编写了以下代码,但它不起作用,并且当我尝试执行代码时返回“错误的文件描述符”错误:
#include <stdio.h>
#include <stdlib.h>
#include <sys/stat.h>
#include <fcntl.h>
#include <unistd.h>
int main(void)
{
int nfd;
ssize_t ret;
mode_t mode = S_IRWXU | S_IRWXG;
nfd = openat(AT_FDCWD, "idx.txt", O_APPEND | O_SYNC | O_CREAT, mode);
if (-1 == nfd)
{
perror("openat()");
exit(EXIT_FAILURE);
}
ret = write(nfd, "HELLO", 5);
if (-1 == ret)
{
perror("write()");
exit(EXIT_FAILURE);
}
close(nfd);
return 0;
}
Run Code Online (Sandbox Code Playgroud)
我想以 O_APPEND 模式写入文件。但:
$ touch idx.txt # it does not work even if the file does not …Run Code Online (Sandbox Code Playgroud) 我们假设我有一个有效的Java FileDescriptor,我用这种方式:
FileInputStream is = new FileInputStream("/some/path/to/file.txt");
FileDescriptor fd = is.getFD();
Run Code Online (Sandbox Code Playgroud)
现在请忘记我知道文件路径.我唯一拥有的是一个FileDescriptor.有没有一种简单的方法来了解文件大小?现在我检查过:
FileDescriptor有valid()方法可以告诉我它是否有效但没有length()或size()功能.FileInputStream 不返回路径,因为它是一个流,它显然不会告诉我文件大小.File(http://docs.oracle.com/javase/7/docs/api/java/io/File.html)其中有length()方法没有能够处理FileDescriptor的构造函数.我知道我可以阅读整个流并总结长度,但我不认为它是简单的方法.
我想打开一个文件描述符仅供阅读
mkfifo my_fifo
exec 3<$my_fifo
Run Code Online (Sandbox Code Playgroud)
这个挂了。
另一方面,当我做
exec 3<>$my_fifo
Run Code Online (Sandbox Code Playgroud)
然后它起作用了。为什么?
int fd = socket(//arguments);
Run Code Online (Sandbox Code Playgroud)
这个描述符是否可以通过IPC传递给另一个进程并且仍然有效,或者它是创建它的进程的本地?
我正在用 Rust 编写的 shell 中实现 I/O 重定向。我通过使用带有原始文件描述符和pipe()libc crate 的不安全代码成功地在两个子进程之间进行管道传输。
当我尝试将stdout最后一个子进程重定向到我有权访问的文件时,它失败了:
extern crate libc;
use std::process::{Command, Stdio};
use std::os::unix::io::{FromRawFd, IntoRawFd};
use std::fs::File;
use self::libc::c_int;
fn main() {
let mut fds = [-1 as c_int, -1 as c_int];
let fd1 = File::open("test1").unwrap().into_raw_fd();
let fd2 = File::open("test2").unwrap().into_raw_fd();
let fd3 = File::open("test3").unwrap().into_raw_fd();
println!("{:?}, {:?}, {:?}", fd1, fd2, fd3);
unsafe {
libc::pipe(&mut fds[0] as *mut c_int);
let cmd1 = Command::new("ls")
.arg("/")
.stdout(Stdio::from_raw_fd(fds[1]))
.spawn()
.unwrap();
let mut cmd2 = Command::new("grep")
.arg("etc")
.stdin(Stdio::from_raw_fd(fds[0])) …Run Code Online (Sandbox Code Playgroud) 具有以下结构:
- project1
- project1.py
- protofile_pb2.py
- protofile_pb2_grpc.py
- project2
- project2.py
- protofile_pb2.py
- protofile_pb2_grpc.py
Run Code Online (Sandbox Code Playgroud)
项目1.py:
- project1
- project1.py
- protofile_pb2.py
- protofile_pb2_grpc.py
- project2
- project2.py
- protofile_pb2.py
- protofile_pb2_grpc.py
Run Code Online (Sandbox Code Playgroud)
项目2.py:
import protofile_pb2.py
...
Run Code Online (Sandbox Code Playgroud)
运行 project2.py 时,出现此错误:
import protofile_pb2
import project1
...
Run Code Online (Sandbox Code Playgroud)