我的所有搜索都没有返回任何内容,我觉得很奇怪,没有任何宏可用作标准输入和输出的读/写系统调用的文件描述符,而不是0(stdout)和1(stdin).
我错过了他们还是他们真的不存在?
我做了命令(来源):
$ exec 3>/tmp/thirdfile
$ exec 4>/tmp/fourthfile
$ echo drib >&3
$ echo drab >&4
$ echo another drib >&3
$ echo another drab >&4
$ exec 3>&-
$ exec 4>&-
Run Code Online (Sandbox Code Playgroud)
我怎样才能看到文件句柄,类似于lsof -l?
我希望使用twisted来控制主进程和一组从进程之间的Linux管道(os.pipe())和fifos(os.mkfifo())之间的通信.虽然我很肯定,但是对于这些类型的文件描述符可以使用twisted(毕竟,对于*nix作为文件描述符抽象的tcp套接字,twisted是很好的),我找不到任何这种用法的例子.任何人有任何链接,示例代码或建议?
我正在用c ++设计MIPS模拟器,我的简化操作系统必须能够偶尔运行stat()(当我的模拟器上执行的程序需要输入或输出时).
问题是,我需要能够将STDIN,STDOUT和STDERR作为参数提供给stat"stat("stdin",buff)"其中buff是指向插入点的指针,对于返回的结构数据,在内存中.实际上我将使用fstat(),它使用文件描述符指向要统计的文件.我的简单操作系统中的文件描述符表为stdin,stdout和stderr保留0,1和2.我对STDIN等有些困惑.它们是流,我意识到,它们是在stdio.h中定义的,但是我在世界上如何获得一个stat结构,其中包含有关每个流的文件的所有相关信息?
我在C/linux中有一个套接字服务器.每次我创建一个新套接字时,都会为其分配一个文件描述符.我想将这些FD用作每个客户端的唯一ID.如果保证它们总是按递增顺序分配(我正在运行的Ubuntu就是这种情况)那么我可以将它们用作数组索引.
所以问题是:从linux套接字分配的文件描述符是否始终保持递增顺序?
我正在使用PHP套接字扩展(基本上是socket(2)相关的linux系统调用的包装器),并希望重新使用我在后续服务中提供一个请求时打开的套接字.性能是一个关键因素.
我打开的套接字都是相同的IP,这使得其他功能的使用pfsockopen()变得不可能(因为它每次都重复使用相同的单个套接字),我一次需要几个.
这个问题
如果我离开套接字,我打开服务一个请求故意打开,(我不打电话socket_close()或socket_shutdown())并将具有完全相同参数的套接字连接到服务于下一个请求的同一IP; linux会重新使用以前打开的socket/file-descriptor吗?
我最终想做的是避免每次请求都有TCP握手.
其他信息:
我使用apache worker MPM - 这意味着不同的请求可以但不一定是来自不同的进程.为简单起见,我们假设所有请求都来自同一个进程.
我可以在PHP中获取打开并连接的套接字的文件描述符ID.我可以打开,读取和写入/dev/fd/{$id},但没有任何目的 - 它不与远程服务器通信(也许这是一种天真的方法).如果有人知道如何完成这项工作,我认为这也是一个可以接受的答案.
我正在使用FIFO和select()系统命令运行测试.这个想法是:
select()命令等待来自FIFO的消息所以这里是代码注意我正在进行错误检查以节省空间:
//process 1's code
int main()
{
int fd, ret;
fd_set rfds;
char buffer[100] = {0};
char * myfifo = "/tmp/myfifo";
struct timeval tv;
tv.tv_sec = 5; // 5 second sleep
tv.tv_usec = 0;
mkfifo(myfifo, 0666); //Make the fifo
fd = open(myfifo, O_RDONLY);
FD_ZERO(&rfds); // clear the flags
FD_SET(fd, &rfds); // set "read" on fd
while((ret = select(fd+1, &rfds, NULL, NULL, &tv)) <= 0) //should be 1 when we're ready …Run Code Online (Sandbox Code Playgroud) 我是一个自学者,今天我的第一个套接字用c代码工作.高兴.
假设我们有sfd一个套接字文件描述符.
执行此代码时:
flags = fcntl (sfd, F_GETFL, 0);
printf("FD MODE 1 - %d\n",fcntl(sfd,F_GETFL));
flags |= O_NONBLOCK;
s = fcntl (sfd, F_SETFL, flags);
printf("FD MODE 2 - %d\n",fcntl(sfd,F_GETFL));
Run Code Online (Sandbox Code Playgroud)
它输出:
2
2050
Run Code Online (Sandbox Code Playgroud)
但是我的fcntl-linux.h说:
...
/* open/fcntl. */
#define O_ACCMODE 0003
#define O_RDONLY 00
#define O_WRONLY 01
#define O_RDWR 02
#ifndef O_CREAT
# define O_CREAT 0100 /* Not fcntl. */
#endif
#ifndef O_EXCL
# define O_EXCL 0200 /* Not fcntl. */
#endif
#ifndef O_NOCTTY
# define O_NOCTTY 0400 …Run Code Online (Sandbox Code Playgroud) 在Zsh中,我知道您可以command &> file.txt将所有文件描述符传递给file.txt(而不是像单独使用command 2>&1 3>&1 > file.txt三个文件描述符那样单独执行每个文件描述符).有没有办法将所有文件描述符传递给另一个命令?如command <mystery operator> cat?
编辑:我错了,正如Chepner和Etan指出的那样; &>只重定向fd的1和2.谢谢!
在下面的示例代码中,我们打开一个文件描述符到sandbox.log,将它作为stdout提供给子进程,然后关闭文件描述符,但子进程仍然可以写入该文件.是subprocess.Popen在内部复制文件描述符吗?将文件描述符传递给子进程后关闭它是否安全?
import subprocess
import os
import time
print 'create or clear sandbox.log'
subprocess.call('touch sandbox.log', shell=True)
subprocess.call('echo "" > sandbox.log', shell=True)
print 'open the file descriptor'
fd = os.open('sandbox.log', os.O_WRONLY)
command = 'sleep 10 && echo "hello world"'
print 'run the command'
p = subprocess.Popen(command, stdout=fd, stderr=subprocess.STDOUT, shell=True)
os.close(fd)
try:
os.close(fd)
except OSError:
print 'fd is already closed'
else:
print 'fd takes some time to close'
if p.poll() is None:
print 'p isnt finished, but fd is closed'
p.wait()
print 'p …Run Code Online (Sandbox Code Playgroud)