Articles of 文件描述符

在C中使用stdin和select()

我有以下程序: #include <stdio.h> #define STDIN 0 int main() { fd_set fds; int maxfd; // sd is a UDP socket maxfd = (sd > STDIN)?sd:STDIN; while(1){ FD_ZERO(&fds); FD_SET(sd, &fds); FD_SET(STDIN, &fds); select(maxfd+1, &fds, NULL, NULL, NULL); if (FD_ISSET(STDIN, &fds)){ printf("\nUser input – stdin"); } if (FD_ISSET(sd, &fds)){ // socket code } } } 我面对的问题是,一旦在STDIN上检测到input,“用户input – 标准input”信息将继续打印…为什么在循环检查哪些描述符已input时不打印一次? […]

虽然没有任何投入,为什么投票仍在返回?

我写了一个小testing程序来弄清楚如何与poll进行交谈。 我创build了三个文件testa , testb , testc ,并将stringhello\n写入第一个。 所以,这里是我的poll : poll(polls.data(),polls.size(),-1) 根据手册页,超时-1应表明系统调用永远不会超时。 然而,它没有任何东西可以读。 我总是消耗一个字节的input,可以看到你打印的hello\n ,但民意调查并没有停止在那里。 它只是假装在那里有东西要读。 #include <sys/types.h> #include <sys/stat.h> #include <sys/fcntl.h> #include <sys/poll.h> #include <unistd.h> #include <errno.h> #include <vector> #include <map> #include <string> #include <iostream> typedef int fd_t; int main() { fd_t const a = open("testa",O_RDONLY); fd_t const b = open("testb",O_WRONLY); fd_t const c = […]

放在文件描述符上?

有没有办法做什么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 […]