我试图做 echo“FINN”> / sys / kernel / debug / tracing / trace_marker 在shell(Ubuntu的14)作为根,即时通讯获取下一个错误 bash:echo:写入错误:错误的文件描述符 我不知道什么是错的,我读了如何在这里和这里 (关于如何使用ftrace的文章) 其他的ftrace文件,我必须写入工作正常…
是否有一个现有的function来testing条件“在fd_set中设置的任何位”? 如果可能的话,我想用FD_ISSET()来testing是否在fd_set中设置了任何位,而不是testing是否设置了特定的 fd。 我试图沿(伪代码)的代码行的代码: … select( max_fd + 1, &readfds, &writefds, NULL, NULL ); if ( FD_ISSET( specific_read_fd, &readfds ) ) { handleSpecificReadFdSet(); } else if ( FD_IS_ANY_SET( &readfds ) ) // Desired functionality { handleOtherReadFdSet(); } else if ( FD_ISSET( specific_write_fd, &writefds ) ) { handleSpecificWriteFdSet(); } else // if ( FD_IS_ANY_SET( &writefds ) […]
我的程序按照时间顺序进行以下操作 该程序以root权限启动。 除其他任务之外,只有具有根权限的文件才能被open() 。 根权限被丢弃。 subprocess由clone()和CLONE_FILES | CLONE_FS | CLONE_IO CLONE_FILES | CLONE_FS | CLONE_IO 设置CLONE_FILES | CLONE_FS | CLONE_IO标志,这意味着虽然它们使用虚拟内存的不同区域,但它们共享相同的文件描述符表(以及其他IO东西)。 所有subprocessexecve()自己的程序(不使用FD_CLOEXEC标志)。 原始程序终止。 现在我想让每个产生的程序读取上述文件的内容,但是在他们都读完文件之后,我想让它closures(出于安全原因)。 我现在正在考虑的一个可能的解决scheme是,在步骤3a中,对于每个subprocess,文件的fd都是dup() ,每个subprocess都有自己的fd(作为argv )。 那么每个子程序都会close()他们的fd,这样在指向文件的所有fds都close() d之后,“实际文件”就会closures。 但是这样工作吗? 这样做是否安全(即文件是否真的closures)? 如果没有,是否还有其他更好的方法?
有多个问题和答案如何去做,但是这两个过程必须合作 我可以打开一个套接字并将它传递给Linux中的另一个进程 在不相关的进程之间共享套接字(侦听) 可移植的方式在不同的进程之间传递文件描述符 等等 在systemd ,有function套接字激活 ,你只是在你的过程中打开和准备文件描述符,没有任何合作。 您可以使用文件描述符3 ( SD_LISTEN_FDS_START ),它已经由systemd激活了套接字。 systemd如何做到这一点? 我找不到任何相关的源代码。 编辑: 我知道,如何编写systemd套接字激活服务,但是我感兴趣的是从systemdangular度将文件描述符传递给我的服务的过程。 例如,如果我想写我自己的套接字激活器,那就像systemd一样。
我将audio混音器从Windows上的directsound移植到Linux上的alsa。 我使用系统调用“poll”轮询16个文件描述符。 现在我需要能够以某种方式中止投票。 在Windows上,我正在使用WaitForMultipleObjects使用事件,当我需要中止等待,我只是SetEvent的事件之一导致等待返回。 有没有办法在Linux中标记一个文件描述符“准备就绪”,以便轮询返回? 我看了ppoll,但我不熟悉信号,我不想处理不必要的竞争条件。 我的意思是,如果alsa可以设置文件描述符为“准备好”,我应该也可以;)
在使用一些linux守护进程(比如sendmail)的时候,我注意到其中的一些会在开始的时候在一些描述符(通常是3到255之间)上调用close()。 这是有目的地完成的,还是这样做的其他一些副作用?
如果我有两个线程(Linux,NPTL),并且我有一个轮询一个或多个文件描述符的线程,另一个线程正在closures其中一个线程,那么这是一个合理的操作吗? 我正在做一些我不应该在MT环境中做的事情吗? 我认为这样做的主要原因是我不一定要与轮询线程通信,中断它等等,而是我想closures描述符出于任何原因,当轮询线程唤醒时,我期望revents包含POLLNVAL,这将表明文件描述符应该在下次轮询之前被线程抛弃。 我已经做了一个简单的testing,它确实显示POLLNVAL正是会发生的事情。 但是,在这种情况下,POLLNVAL仅在超时过期时设置,closures套接字似乎不会使poll()返回。 如果是这样的话,我可以杀死线程,使poll()重新启动。 #define _GNU_SOURCE #include <stdio.h> #include <pthread.h> #include <poll.h> #include <errno.h> #include <sys/types.h> #include <unistd.h> #include <string.h> #include <signal.h> static pthread_t main_thread; void * close_some(void*a) { printf("thread #2 (%d) is sleeping\n", getpid()); sleep(2); close(0); printf("socket closed\n"); // comment out the next line to not forcefully interrupt pthread_kill(main_thread, SIGUSR1); return 0; […]
我目前正在研究如何将stream水线pipe理到shell中。 例如,在我的shell中,如果我input“ls | wc | less”。 这个操作的结果将是创build三个进程,ls wc和less。 ls的输出将被input到wc的inputinput中,并且wc的输出将被input到input的input中。 对我来说,这意味着在执行“ls | wc | less”时。 less的标准input不是键盘,而是wc的输出。 但是,less一些仍然会响应我的键盘。 为什么? 我不明白,因为对我来说,由于它已经被pipe道,所以对键盘不太敏感。 有人有一个想法吗? 谢谢
在一个bash脚本中,我可以这样写: exec 2>&1 exec someprog someprog的stderr输出将被redirect到stdout。 有没有办法使用python的os.exec*函数做类似的事情? 这不一定是可移植的,只是在Linux上工作。
考虑下面的代码片段。 #include <fcntl.h> #include <stdio.h> #include <sys/poll.h> #include <unistd.h> int main(int argc, char ** argv) { int fd; char buf[1024]; int i; struct pollfd pfds; fd = open(argv[1], O_RDONLY); while (1) { pfds.fd = fd; pfds.events = POLLIN; poll(&pfds, 1, -1); if (pfds.revents & POLLIN) { i = read(fd, buf, 1024); write(1, buf, i); } […]