我成功地使用 sed 文件描述符并在标准输出上给出结果。给出一个文件“file.txt”,其中包含:
$ cat file.txt
foo
Foo
Run Code Online (Sandbox Code Playgroud)
我打开 file.txt 的文件描述符,打开子 shell,然后将此文件描述符提供给 sed :
$ (sed "/Foo/c\\bar" <&9 ) 9< file.txt
foo
bar
Run Code Online (Sandbox Code Playgroud)
结果是正确的。
现在,如果我想使用 sed 的 -i 选项就地更改,我就会遇到麻烦。我以读写模式打开文件描述符,然后将其作为输入文件提供给 sed :
$ (sed -i "/Foo/c\\bar" <&9 ) 9<> file.txt
sed: no input file
Run Code Online (Sandbox Code Playgroud)
我不明白为什么缺少输入文件。也许 sed 在使用 -i 选项时需要文件名,而不是文件描述符?
我尝试了一种解决方法,当然,它不能按预期工作:
$ (sed "/Foo/c\\bar" <&9 >&9 ) 9<> file.txt
$ cat file.txt
foo
Foo
foo
bar
Run Code Online (Sandbox Code Playgroud)
虽然我期望:
$ cat file.txt
foo
bar
Run Code Online (Sandbox Code Playgroud)
在此先感谢您的帮助 !杜纳托塔托斯
我需要帮助来理解文件描述符
所以这是我的代码:
int main()
{
char ch;
close(1);
//now opening a file so that it gets the lowest possible fd i.e. 1
int fd=open("txt",O_RDWR);
//check..
printf("first printtf is executed\n");
scanf("%c",&ch);
printf("ur value is %c\n",ch);
printf("second printf is executed\n");
return 0;
}
Run Code Online (Sandbox Code Playgroud)
在上面的程序中,我尝试将 的输出重定向printf到txt文件而不是标准输出,即终端。但是如何恢复标准输出文件描述符,以便printf在第二种情况下再次正常工作,即第二个printtf应该只向终端提供输出..
我有客户端 - 服务器应用程序.服务器在C.服务器具有以下结构:
int main (... ) {
FILE * fp;
fp = fopen("serverLog.log","w");
//init variables
//bind server
//listen server on port
while(1) {
//some code
//accept
//some code
int check = pthread_create(&thread, NULL, handle_client,&ctx);
}
fclose(fp);
return EXIT_SUCCSESS;
}
Run Code Online (Sandbox Code Playgroud)
我运行服务器,并使用CTRL + C关闭服务器.filedescriptor fd会发生什么?我想,它保持开放.如果是,我该怎么办?谢谢
我是linux编程的新手.我写了一个非常简单的程序:
#include stdio.h
#include fcntl.h
#include sys/ioctl.h
#include mtd/mtd-user.h
#include errno.h
int main( void )
{
int fd;
fd = open("test.target", O_RDWR);
printf("var fd = %d\n", fd);
close(fd);
perror("perror output:");
return 0;
}
Run Code Online (Sandbox Code Playgroud)
test.target只使用touch命令创建.该程序的输出是:
var fd = 3
perror output:: Success
Run Code Online (Sandbox Code Playgroud)
我试图打开其他文件,文件描述符总是3.我记得它的值应该是一个更大的数字.如果这个程序有一些错误?
我正在尝试执行以下操作:
execl("/bin/grep","grep","print",fd,NULL);
Run Code Online (Sandbox Code Playgroud)
其中fd是文件描述符.所以基本上这应该是fd指向的文件中的"print".虽然我没有编译错误/警告但它似乎不起作用.当我给出一个文件名"Something.txt"而不是fd
有人可以告诉我为什么这不起作用?(我知道execl只需要,const char arg*但正如我所说的没有编译错误/警告).
当我硬编码chemin在open(chemin, O_RDONLY)一个文件名,程序工作,但是当我离开,如果给open(chemin, O_RDONLY)我弄No such file or directory.
为什么不chemin使用type_fichier?
当我使用printf("%s", chemin)在type_fichier我得到'
int type_fichier(char * chemin) {
int fp;
if ((fp = open(chemin, O_RDONLY)) == -1) { perror(""); exit(0); }
struct stat fileStat;
if(fstat(fp, &fileStat) < 0)
return 1;
switch(fileStat.st_mode & S_IFMT) {
case S_IFBLK: printf("block device\n"); break;
case S_IFCHR: printf("character device\n"); break;
case S_IFDIR: printf("directory\n"); break;
case S_IFIFO: printf("FIFO/pipe\n"); break;
case S_IFLNK: printf("symlink\n"); break;
case S_IFREG: …Run Code Online (Sandbox Code Playgroud) 我正在看这个课程:https://developer.android.com/reference/android/media/ImageReader.html
我想要的是从ImageReader类中获取一个InputStream,并获取正在渲染到当前表面的图像数据.Current Surface表示当前显示的android屏幕.我在AOSP代码中查看了一个示例,但实际上很难理解.如果有人为我提供了一个很好的ImageReader类示例,那将非常有用.
我正在为游戏制作多线程tcp服务器.
我遇到套接字问题,当服务器停止从客户端收到信息时,我关闭了我接受()(如下所示)的套接字并退出线程并通知主线程该槽不再忙.
clientData.client[next] ) = accept(server,(struct sockaddr *)&client_address,&t));
Run Code Online (Sandbox Code Playgroud)
(错误检查在这里省略但我确实有)
然而,当我再次尝试进入该插槽时,它给了我一个糟糕的文件描述符,我做了一些挖掘,发现close()完全破坏了一个套接字并使其无法用于其余的运行(如果我是的话请纠正我错误).
现在让我感到困惑的是:
a)我仍然可以使用套接字接受,并且我找回文件描述符,问题是当我尝试在套接字上使用recv()时这样.
n = (recv(c->client[threadLocal], str, 100, 0);
Run Code Online (Sandbox Code Playgroud)
(错误检查在这里省略但我确实有)
b)当我到达我的套接字数组中的最后一个插槽时,我可以重复使用套接字,这很奇怪,如果第一次运行时遇到问题但不是最后一次我得到了我错过的感觉.
c)如何使套接字可重用?或者什么是制作可以在程序运行的其余部分重用的套接字的好方法.
所有帮助都非常有用,因为老实说,我对这里发生的事情非常困惑.
编辑:好的,这是我试图做的一个小例子.我在一个结构中有一个套接字数组,代表服务器上的插槽.我意识到可能更容易做一个代表包含套接字的玩家的结构列表,所以当有人加入时你可以创建一个新的结构,但我现在不想,因为这需要大量的工作,但是如果没有选择,我会这样做.
struct clientData{
int clientSocket[maxplayers];
//and some other stuff
};
Run Code Online (Sandbox Code Playgroud)
当玩家加入时,他们会获取列表中的第一个可用套接字并接受(),当客户端断开连接时,我希望套接字可供另一个客户端声明.基本上我希望旧客户端放弃close()或类似的东西以及稍后连接的新客户端,以便能够在阵列中重用此套接字/位置.
我正在寻找一种重置套接字的方法,以便在需要时再次使用它.我希望这让事情变得更容易理解,再次感谢.
正如本回答中所解释的那样,在编写器进程关闭所有相关文件描述符EOF之后,我期待读者进程能够正确捕获.
但这并没有发生,这个程序最终陷入无休止的循环.父母等待孩子完成,孩子等待发出EOF封闭管道的信号.
EOF?#include <stdio.h>
#include <unistd.h>
#include <stdlib.h>
#include <wait.h>
#define STRING_TO_SEND "Hello, world!\n"
int main() {
int fd[2], i = 0;
__pid_t pid;
char _char;
ssize_t nbytes;
pipe(fd);
pid = fork();
if (pid == -1) {
// Error
perror("Error forking!");
return EXIT_FAILURE;
} else if (pid == 0) {
// Child
close(fd[1]);
while ((nbytes = read(fd[0], &_char, 1)) != EOF) {
if (nbytes == 0) …Run Code Online (Sandbox Code Playgroud) 这是我在 Stackoverflow 上迈出的第一步!
所以,我试图使用setbuf()重定向stdout到char buffer[BUFSIZ]. 当我使用时它工作得很好printf(),但当我使用系统调用时它根本不起作用write()。
这是代码示例:
#include <stdio.h>
#include <unistd.h>
int main(void)
{
char buffer[BUFSIZ];
freopen("/dev/null", "a", stdout);
setbuf(stdout, buffer);
printf("This works\n");
write(stdout->_file, "This doesn't.\n", 14);
fflush(stdout);
freopen("/dev/tty", "a", stdout);
printf("Buffer content :\n%s", buffer);
return 0;
}
Run Code Online (Sandbox Code Playgroud)
输出是
缓冲区内容:
这有效
你知道为什么吗?因为现在我不知道这是如何工作的,我将通过管道将标准输出传输到标准输入,然后读取结果 - 我认为这不是最干净的方法。
谢谢你,祝你有美好的一天 !
我在导航和搜索 stdio.h 的文件描述符在机器中的存储位置时遇到了 -E 的这个选项?但我不确定这个命令 gcc -E 到底是做什么的?可以用来查看/usr/include/目录下stdio.h文件的文件描述符吗?