标签: file-descriptor

有没有办法恢复/恢复nohup以查看控制台中的输出?

我知道机会非常低,但有没有办法看到最近输出的nohup-ed进程是什么?

我仍然打开这个进程,但我已经运行它将所有输出重定向到/ dev/null.

那么有没有办法将这样的过程恢复到控制台,或者它是没有希望的:(

干杯

c c++ linux file-descriptor nohup

8
推荐指数
1
解决办法
933
查看次数

防止锁传播

在bash下进行锁定的简单且看似可靠的方法是:

exec 9>>lockfile
flock 9
Run Code Online (Sandbox Code Playgroud)

然而,bash臭名昭着地将这样的fd锁传播给所有分叉的东西,包括执行的程序等.

有没有办法告诉bash不要复制fd?锁定附加到fd是很好的,当程序终止时,无论它如何被终止,它都会被删除.

我知道我可以这样做:

run_some_prog 9>&-
Run Code Online (Sandbox Code Playgroud)

但这很乏味.

有没有更好的解决方案?

bash locking file-descriptor

8
推荐指数
1
解决办法
3093
查看次数

fopen是否创建了文件描述符?

查看手册页fopen我无法得到这个问题的明确答案.

FILE *fopen(const char *path, const char *mode);
Run Code Online (Sandbox Code Playgroud)

我理解fopen返回一个指向流的文件指针,但是作为副产品创建的文件描述符?我试图确保FD_CLOEXEC在每个创建文件描述符的实例上包含该标志.如果文件描述符实际上是在没有"fd"用作输入的情况下从fopen最佳使用方式创建的fnctl().

谢谢.

c unix fopen file-descriptor

8
推荐指数
1
解决办法
3387
查看次数

从Android摄像头即时加密视频

我想加载Android摄像头捕获的视频.所以我需要告诉android MediaRecorder将视频流写入我的CipherOutputStream.问题是MediaRecorder.setOutputFile()方法只接受,FileDescriptor并且无法从CipherOutputStream获取加密文件描述符.

所以我的问题是如何模拟FileDescriptor接收数据写入并手动进行加密或以某种方式说服MediaRecorder流视频CipherOutputStream.

java encryption android file-descriptor android-camera

8
推荐指数
1
解决办法
1972
查看次数

Bash双进程替换提供了错误的文件描述符

当我尝试在bash函数中引用两个进程替换管道时,只有引用的第一个管道工作.第二个给出一个"错误的文件描述符"错误,如下所示:

$ foo(){
> cat "$1"
> cat "$2"
> }
$ foo <(echo hi) <(echo bye)
hi
cat: /dev/fd/62: Bad file descriptor
$ 
Run Code Online (Sandbox Code Playgroud)

看来第二个管道在被引用时被丢弃,但是a)我似乎无法在任何文档中确认这种行为,并且b)我希望它不会.=)

关于我做错了什么的任何想法?FWIW我这样做是为了使包装器使用Mac OS X的FileMerge图形差异工具而不是命令行1,它已经很高兴从命令行使用多个管道.

-抢

bash pipe process file-descriptor substitution

8
推荐指数
2
解决办法
1518
查看次数

子shell IO重定向

给定一个文件"foo.txt",创建自:

$ seq 1 10 > "foo.txt"
Run Code Online (Sandbox Code Playgroud)

我正在尝试读取文件的第一行和最后一行,并且我开始将文件重定向到子shell,以便命令列表将按顺序使用该文件 - 每个命令都使用来自该点的输入最后一个命令离开了,我想:

$ (head -1; tail -1) < "foo.txt"
1
10
Run Code Online (Sandbox Code Playgroud)

但是,如果我尝试使用临时文件描述符,输出不一样:

$ (head -1; tail -1) < <(seq 1 10)
1
Run Code Online (Sandbox Code Playgroud)

问题:

  1. 我不确定要命名的是什么<(seq 1 10),但这个临时文件描述符和常规文件描述符("foo.txt")之间的区别是什么导致子shell执行的行为不同?

  2. 如何在不实际创建文件的情况下实现将a重定向"foo.txt"到子shell但没有临时文件的相同行为.

bash redirect file-descriptor subshell

8
推荐指数
1
解决办法
1516
查看次数

Python close_fds不清楚

close_fds在Python27中遇到了一个问题,所以在做了一些研究后我发现了这个例子:

from subprocess import Popen, PIPE, STDOUT
p1 = Popen(['cat'], stdin=PIPE, stdout=PIPE)
p2 = Popen(['grep', 'a'], stdin=p1.stdout, stdout=PIPE)
p1.stdin.write("aaaaaaaaaaaaaaaa\n")
p1.stdin.close()
p2.stdout.read()
Run Code Online (Sandbox Code Playgroud)

我的问题是,我无法理解为什么p1.stdin仍然开放.p1不是孩子,p2所以p2不应该继承任何明确传递的p1资源p1.stdout.此外,为什么设置close_fds=Truep2解决问题?是写的:

如果close_fds为true,则在执行子进程之前将关闭除0,1和2之外的所有文件描述符.

因此,即使我能够理解它之间的继承p1,p2仍然p1.stdin不应该被关闭,close_fds=True因为它是标准输入(1).

python process file-descriptor parent-child

8
推荐指数
1
解决办法
5904
查看次数

C套接字从accept返回的filedescriptor获取IP地址

我知道这个问题似乎是典型的,并且多次回答,但我认为如果您阅读细节并不常见(我没有找到它).

关键是我在c中开发了一个unix服务,它打开一个套接字并等待连接,当我有一个连接时,我创建一个新进程来处理它,因此可以同时打开多个连接.

int newfd = accept(sockfd, (struct sockaddr *)&clientaddr, (socklen_t*)&clientaddr_size);
Run Code Online (Sandbox Code Playgroud)

后来(后和其他一些方法里面和代码)子进程保存连接信息BBDD和我也需要,在那一时刻,以获取IP地址是打开的连接正在接受治疗.

因为可以同时存在多个连接,并且我传递给accept方法的变量struct sockaddr_in clientaddr为所有进程共享的,所以我不确定以后从这种方式获取IP地址信息是个好主意,因为那时我可以从另一个连接打开获取IP地址.

我希望能够从accept方法(返回的整数)中获取的文件描述符int newfd中访问IP地址.可能吗?或者我误解了文件描述符函数?

c unix sockets fork file-descriptor

8
推荐指数
1
解决办法
2万
查看次数

FFmpeg:无法在Android Q上使用文件描述符进行搜索

考虑到公共文件路径通常在Android Q中不可用的事实,我试图找出如何使FFmpeg音频解码器与文件描述符一起工作,而不将文件复制到应用程序的私有目录中。

我们可以使用Android Q隐私更改中所述的方法轻松获取文件描述符,并且可以使用管道协议打开文件描述符,如将本地fd int从可打开的URI传递给FFMPEG中所述。但是,使用找不到结果,av_seek_frame并且使用的duration成员也不提供持续时间AVFormatContext

有没有办法使用FFmpeg使用文件描述符进行搜索并检索持续时间?

android ffmpeg pipe file-descriptor android-10.0

8
推荐指数
1
解决办法
167
查看次数

在STDOUT和STDIN的文件描述符上执行库函数的奇怪行为

在我作为C程序员的这些年里,我一直对标准流文件描述符感到困惑.有些地方,比如维基百科[1],说:

在C编程语言中,标准输入,输出和错误流分别附加到现有的Unix文件描述符0,1和2.

这有以下支持unistd.h:

/* Standard file descriptors.  */
#define STDIN_FILENO    0       /* Standard input.  */
#define STDOUT_FILENO   1       /* Standard output.  */
#define STDERR_FILENO   2       /* Standard error output.  */
Run Code Online (Sandbox Code Playgroud)

但是,这段代码(在任何系统上):

write(0, "Hello, World!\n", 14);
Run Code Online (Sandbox Code Playgroud)

将打印Hello, World!(和换行)STDOUT.这很奇怪,因为STDOUT文件描述符应该是write1.-文件描述符1也打印到STDOUT.

执行ioctl文件描述符0改变标准输入[2],文件描述符1改变标准输出.但是,在0或1上执行termios功能会改变标准输入[3] [4].

我对文件描述符1和0的行为非常困惑.有谁知道原因:

  • write写入1或0写入标准输出?
  • 执行ioctl1修改标准输出,0修改标准输入,但执行tcsetattr/ tcgetattron 1或0适用于标准输入?

c unix io file-descriptor

7
推荐指数
2
解决办法
418
查看次数