我知道机会非常低,但有没有办法看到最近输出的nohup-ed进程是什么?
我仍然打开这个进程,但我已经运行它将所有输出重定向到/ dev/null.
那么有没有办法将这样的过程恢复到控制台,或者它是没有希望的:(
干杯
在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)
但这很乏味.
有没有更好的解决方案?
查看手册页fopen我无法得到这个问题的明确答案.
FILE *fopen(const char *path, const char *mode);
Run Code Online (Sandbox Code Playgroud)
我理解fopen返回一个指向流的文件指针,但是作为副产品创建的文件描述符?我试图确保FD_CLOEXEC在每个创建文件描述符的实例上包含该标志.如果文件描述符实际上是在没有"fd"用作输入的情况下从fopen最佳使用方式创建的fnctl().
谢谢.
我想加载Android摄像头捕获的视频.所以我需要告诉android MediaRecorder将视频流写入我的CipherOutputStream.问题是MediaRecorder.setOutputFile()方法只接受,FileDescriptor并且无法从CipherOutputStream获取加密文件描述符.
所以我的问题是如何模拟FileDescriptor接收数据写入并手动进行加密或以某种方式说服MediaRecorder流视频CipherOutputStream.
当我尝试在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,它已经很高兴从命令行使用多个管道.
-抢
给定一个文件"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)
问题:
我不确定要命名的是什么<(seq 1 10),但这个临时文件描述符和常规文件描述符("foo.txt")之间的区别是什么导致子shell执行的行为不同?
如何在不实际创建文件的情况下实现将a重定向"foo.txt"到子shell但没有临时文件的相同行为.
我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=True在p2解决问题?这是写的:
如果close_fds为true,则在执行子进程之前将关闭除0,1和2之外的所有文件描述符.
因此,即使我能够理解它之间的继承p1,p2仍然p1.stdin不应该被关闭,close_fds=True因为它是标准输入(1).
我知道这个问题似乎是典型的,并且多次回答,但我认为如果您阅读细节并不常见(我没有找到它).
关键是我在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地址.可能吗?或者我误解了文件描述符函数?
考虑到公共文件路径通常在Android Q中不可用的事实,我试图找出如何使FFmpeg音频解码器与文件描述符一起工作,而不将文件复制到应用程序的私有目录中。
我们可以使用Android Q隐私更改中所述的方法轻松获取文件描述符,并且可以使用管道协议打开文件描述符,如将本地fd int从可打开的URI传递给FFMPEG中所述。但是,使用找不到结果,av_seek_frame并且使用的duration成员也不提供持续时间AVFormatContext。
有没有办法使用FFmpeg使用文件描述符进行搜索并检索持续时间?
在我作为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适用于标准输入?file-descriptor ×10
c ×4
bash ×3
unix ×3
android ×2
pipe ×2
process ×2
android-10.0 ×1
c++ ×1
encryption ×1
ffmpeg ×1
fopen ×1
fork ×1
io ×1
java ×1
linux ×1
locking ×1
nohup ×1
parent-child ×1
python ×1
redirect ×1
sockets ×1
subshell ×1
substitution ×1