我有一个线程从文件描述符中读取数据,使用select()阻塞直到数据可用.当程序需要终止时,我需要关闭该线程,但是它在select时被阻止.
我的问题是,通过关闭文件描述符来通知线程关于我终止意图是一个好习惯吗?
有没有更好的方法来通知线程?我知道总有一个选项可以使用信号,但是我已经在某些地方看到了这些信号pthreads并不能很好地协同工作.
我看过但找不到任何描述以下文件描述符语法如何工作的详细信息的Bash指南:
while read line <&3; do
echo $line
done 3<file.txt
Run Code Online (Sandbox Code Playgroud)
这是while循环的特殊构造,允许Bash查看done文件描述符源吗?是否有某种速记来进行执行召唤?
给定一个FileDescriptor对象,是否有可能以File某种方式从它创建一个?
谢谢!
我需要ls用C语言实现程序。我想找到一种不使用<dirent.h>库的方法。
我可以在 Linux C 中使用文件描述符获取目录中的文件列表吗?
谢谢。
对于SSL连接,FD通过接受呼叫收到的所有信息可以做什么?可以重复使用吗?
我想确切知道的是:
接受连接后,我得到FD。我使用创建SSL句柄(SSL*)SSL_new。使用将,添加FD到此句柄SSL_set_fd。我使用做握手SSL_accept。现在,在这一点上,如果我叫SSL_shutdown上SSL*,将FD被关闭?那SSL_free呢?
如果上述问题的答案是否定的,那么我可以与FD一起使用SSL*吗?
为了确切解释我想要什么,如果我们FD使用handle 从连接中读取一些数据SSL*,那么我们释放或关闭SSL*,是否可以FD使用new 读取其余数据SSL*?
这是示例代码:
int nbajt; int buf[];
// we opened file and get descriptor fd
while ((nbajt = read(fd, buf, 5)) > 0) {
if (write(fd2, buf, nlbajt) == -1) {
perror("ERROR");
exit(1);
}
}
Run Code Online (Sandbox Code Playgroud)
我不明白当我们使用 while 循环时它是如何工作的。这个循环会进行多少次?(长度的倍数buf?)。每个循环步骤后是否nbajt只有1或0 + buf文件位置的值会更改 1 个位置?因此,在第一步中,nlbajt = 1我们将 buf 第一个位置 char 写入,然后将其写入fd2?。最后我们有nlbajt==0所以这意味着它是文件的结尾?我将不胜感激检查我是否错了。我主要关心的是 nbajt 值如何变化。这种态度有何不同:
nbajt = read(fd, buf, 5));
write(fd2, buf, sizeof(a));
Run Code Online (Sandbox Code Playgroud) 我试图找到给定进程的所有TCP 套接字的文件描述符,即。给定它的 pid,这样我就可以在另一个进程中获得套接字选项而无需修改原始进程。
例如,如果我知道文件描述符是fd,那么我希望调用getsockopt(fd, ...)以在另一个进程中检索选项。我想知道这可行吗?如果是这样,如何fd在原始过程之外获得我需要的?
我试图在创建套接字时打印出返回值,即。s = socket(...); printf("%d\n", s);,保持原始进程运行并在getsockopt(s, ...)其他地方调用但它不起作用 - 似乎这样的返回值是依赖于进程的。
我也找到了 unix 域套接字的解决方案,但我不想修改原始进程的代码。
至于\proc\<PID>\fd直接阅读还是利用阅读lsof,我想说我不知道如何从他们那里找到我需要的东西。我的直觉是它们可能是潜在的解决方案。
当然,也欢迎任何其他想法。说实话,我对Linux中的文件描述符机制不是很熟悉。
我需要运行一个名为pg.sh的程序.它报告stdout输出日志.如何将stdout以及stderr和stdout保存到2个单独的日志文件中?
我搜索并得到以下代码
(pg.sh 2>&1 1>&3 ) 3>&1 1>&2 | tee output.log) > final.log 2>&1
Run Code Online (Sandbox Code Playgroud)
我理解1和2是指向stdout和stderr的文件描述符.3是另一个指向stdout的文件描述符.
上面的代码工作正常,但我不明白这是如何实现的.有人可以帮我写代码吗?
我跑了strace,在它的输出中,我得到了如下行:
read(3, "\177ELF\2\1\1\0\0\0\0\0\0\0\0\0\3\0>\0\1\0\0\0\20\273\0\0\0\0\0\0"..., 832) = 832
Run Code Online (Sandbox Code Playgroud)
我已经在读的人读,所以字符串""是指向的buf( ssize_t read(int fd, void *buf, size_t count);),但是那又有什么特定的字符串是什么意思?特别是:
ELF 最有可能与可执行程序链接-为什么在这里输入指针? \ 让我们转义特殊字符-为什么在这里转义数字? > 这是为了什么? 我正在用 C 制作一个自定义 shell,我想知道我应该在哪个 fd 上写我的提示。
mycoolshell $
Run Code Online (Sandbox Code Playgroud)
查看其他经典 shell,我发现它dash使用 STDERR 作为提示。csh并tcsh使用标准输出。对于bash,zsh和 BSDsh我找不到任何东西。我用了
mycoolshell $
Run Code Online (Sandbox Code Playgroud)
检查 dash 的提示 fd。与 csh with 相同,csh 1>file但我对其他的不走运。
是否有标准或 POSIX fd 用于此?可以使用 STDIN 吗?