Articles of 文件描述符

放在文件描述符上?

有没有办法做什么ftell()做(返回文件中的当前位置)原始文件描述符而不是FILE *? 我认为应该是,因为你可以使用lseek()来寻找原始文件描述符。 我知道我可以使用fdopen()创build一个对应于文件描述符的FILE *,但我宁愿不这样做。

使用inotify监视文件

我正在使用inotify来监视本地文件,例如“/ root / temp”使用 inotify_add_watch(fd, "/root/temp", mask). 当这个文件被删除时,程序将被read(fd, buf, bufSize)函数阻塞。 即使我创build一个新的“/ root / temp”文件,程序仍然是通过读取function阻止的。 我想知道如果inotify可以检测到监控的文件被创build,并且读取函数可以从fd得到的东西,使读取将永远不会被阻止。 这是我的代码: uint32_t mask = IN_ALL_EVENTS; int fd = inotify_init(); int wd = inotify_add_watch(fd, "/root/temp", mask); char *buf = new char[1000]; int nbytes = read(fd, buf, 500); 我监视了所有事件。

在两个文件描述符之间桥接

我有一个套接字,我正在做select() ,等待其他进程写入。 一旦写入,我读取数据,并将其写入另一个文件描述符。 我的问题是,如果有一种方法可以将套接字连接到文件描述符,那么当数据准备就绪时,它会自动写入其他文件描述符? 这样,我可以抛出我正在使用的缓冲区,并省略系统中的线程。

C读和线程安全(linux)

如果在同一个文件描述符(让我们感兴趣的是一个本地文件,它是一个套接字文件描述符)中调用两个不同的线程中的read (或write ,或两者),将会发生什么情况,而不使用显式的同步机制? 读和写是系统调用,因此,在单核CPU上,两个读操作可能同时执行可能是不吉利的。 但是,多核心… Linux内核将会做什么? 让我们来更一般一点:其他内核(如BSD)的行为总是一样的吗? 编辑:根据closures的文档 ,我们应该确保该文件描述符不被其他线程中的系统调用使用。 因此,在closures一个文件描述符之前,需要明确的同步(如果线程可能调用它仍然在运行,那么还需要读/写)。

两个文件描述符到同一个文件

使用posix read()write()linux调用,可以保证如果我通过一个文件描述符写入并通过另一个文件描述符读取,以串行方式使得这两个动作互相排斥…那我的读文件描述符将总是看到写文件描述符最后写的是什么? 我相信这是事实,但我想确保和手册页是不是很有帮助

为什么select在Linux中使用

我正在浏览一个串行程序,我观察到他们在使用read()之前使用了select() read() 。 为什么这是必需的。 为什么不能直接调用read()并检查是否失败? 还有,为什么我们必须递增文件描述符1,并传递它,而我已经传递文件描述符已设置为select() ? 例: r=select(fd+1, &fds, NULL, NULL, &timeout); 其中fds已经具有fd的值

IOException:打开的文件过多

我试图在Linux上运行Jetty 7.0.1的Java webapp中debugging文件描述符泄漏。 由于打开的文件太多 ,请求开始失败,并且Jetty必须重新启动,该应用程序已经运行了一个月左右。 java.io.IOException: Cannot run program [external program]: java.io.IOException: error=24, Too many open files at java.lang.ProcessBuilder.start(ProcessBuilder.java:459) at java.lang.Runtime.exec(Runtime.java:593) at org.apache.commons.exec.launcher.Java13CommandLauncher.exec(Java13CommandLauncher.java:58) at org.apache.commons.exec.DefaultExecutor.launch(DefaultExecutor.java:246) 起初我以为这个问题是用启动外部程序的代码,但是它使用的是commons-exec ,我看不出有什么问题: CommandLine command = new CommandLine("/path/to/command") .addArgument("…"); ByteArrayOutputStream errorBuffer = new ByteArrayOutputStream(); Executor executor = new DefaultExecutor(); executor.setWatchdog(new ExecuteWatchdog(PROCESS_TIMEOUT)); executor.setStreamHandler(new PumpStreamHandler(null, errorBuffer)); try { executor.execute(command); } catch (ExecuteException executeException) […]

如何使用sendmsg()通过两个进程之间的套接字发送文件描述符?

在@cnicutar回答了这个问题之后 ,我尝试从父进程发送一个文件描述符给它的subprocess。 基于这个例子 ,我写了这个代码: int socket_fd ,accepted_socket_fd, on = 1; int server_sd, worker_sd, pair_sd[2]; struct sockaddr_in client_address; struct sockaddr_in server_address; /* ======================================================================= * Setup the network socket. * ======================================================================= */ if((socket_fd = socket(AF_INET, SOCK_STREAM, 0)) < 0) { perror("socket()"); exit(EXIT_FAILURE); } if((setsockopt(socket_fd, SOL_SOCKET, SO_REUSEADDR, (char *) &on, sizeof(on))) < 0) { perror("setsockopt()"); exit(EXIT_FAILURE); } server_address.sin_family […]

有人可以给我一个例子,说明如何select()提醒fd变成“ready”

我不知道为什么我很难find这个,但我正在看一些我们正在使用select()等待文件描述符的linux代码来报告它已经准备好了。 从select的手册页: select() and pselect() allow a program to monitor multiple file descriptors, waiting until one or more of the file descriptors become "ready" for some class of I/O operation 所以,这很好…我打电话给一些描述符select,给它一些时间的价值,并开始等待指示去。 文件描述符(或描述符的所有者)如何报告它已经“准备就绪”,使得select()语句返回?

如何在Linux中检测何时打开pty(伪terminal)的slave端?

从串口设备(/ dev / ttyXX)中读取多个进程会导致两个进程无法获得所有数据 – 数据将以某种方式在这些进程之间进行分配。 我想编写一个从串口设备读取的程序,创build几个主/从pty对,然后允许从串口设备读取的程序代替从ptys读取,以便所有的读取过程接收数据从串行设备,并有ptys行为像串行设备的意义上说,当他们开始阅读从pty他们只得到最新的数据。 换句话说,在开始阅读之前,不会得到任何写入的数据(这是我的经验,这是/ dev / ttyXX设备的工作方式,或者至less是我正在阅读的RS-232风速计)。 命名pipe道可以通过捕获SIGPIPE来模仿这些语义,以确定没有读者,因此我们可以select不写入特定的命名pipe道。 但是,写入使用terminal的某些二进制文件在与命名pipe道交谈时可能会失败,因为检查isatty()以及像tcsetattr()这样的调用的错误条件可能导致失败的条件。 这里的关键是能够使用为terminal写入的现有二进制文件。 所以,如果我可以检测到pty的从属端打开读取,这应该给我大致相同的语义,因为在命名pipe道情况下没有SIGPIPE。 我注意到HP-UX将TIOCTRAP作为一个ioctl()命令,它似乎正是我想要的,但遗憾的是它在Linux上不可用。 我已经阅读了几天的参考文献,这种types的选项的数量是惊人的。 答案可能在terminal设置,阻塞/非阻塞行为,在某处设置缓冲区大小,从poll()/ select()报告的条件或某种组合。 虽然我似乎无法find任何东西。 我想知道是否有可能需要编写我自己的设备驱动程序,但似乎我应该能够做到这一点,没有那么远。 所以澄清一下: – 问题是:如何在Linux中检测到有人打开pty(伪terminal)的slave端? – 我想要一个阅读器打开pty的slave端,在阅读器打开pty之后严格接收写入的数据(如果我的多重写入过程只是在读取器打开slave端之前写入数据一段时间,数据将缓冲并且最终作者将会阻止,开放的奴隶读者将立即得到所有的缓冲数据 – 这是不可取的,因为我希望它只获得在临近时间附近产生的数据) – 它必须是一个pty,而不是一个命名的pipe道,套接字等,因为isatty()和tcsetattr()等需要确定,以便现有的二进制文件工作