标签: file-descriptor

如何使用 sed 就地编辑文件描述符

我成功地使用 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)

在此先感谢您的帮助 !杜纳托塔托斯

bash sed file-descriptor sh

1
推荐指数
1
解决办法
1347
查看次数

如何恢复标准输出的文件描述符?

我需要帮助来理解文件描述符

所以这是我的代码:

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)

在上面的程序中,我尝试将 的输出重定向printftxt文件而不是标准输出,即终端。但是如何恢复标准输出文件描述符,以便printf在第二种情况下再次正常工作,即第二个printtf应该只向终端提供输出..

c linux printf file-descriptor system-calls

0
推荐指数
1
解决办法
2032
查看次数

在C中打开文件描述符

我有客户端 - 服务器应用程序.服务器在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会发生什么?我想,它保持开放.如果是,我该怎么办?谢谢

c file-descriptor

0
推荐指数
1
解决办法
763
查看次数

linux编程:文件描述符的值总是3

我是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.我记得它的值应该是一个更大的数字.如果这个程序有一些错误?

unix linux file-descriptor

0
推荐指数
1
解决办法
3549
查看次数

在execl中使用grep和文件描述符

我正在尝试执行以下操作:

 execl("/bin/grep","grep","print",fd,NULL);
Run Code Online (Sandbox Code Playgroud)

其中fd是文件描述符.所以基本上这应该是fd指向的文件中的"print".虽然我没有编译错误/警告但它似乎不起作用.当我给出一个文件名"Something.txt"而不是fd

有人可以告诉我为什么这不起作用?(我知道execl只需要,const char arg*但正如我所说的没有编译错误/警告).

c grep file-descriptor exec unistd.h

0
推荐指数
1
解决办法
3397
查看次数

C:没有这样的文件或目录

当我硬编码cheminopen(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)

c file mode file-descriptor

0
推荐指数
1
解决办法
2390
查看次数

如何从ImageReader android获取InputStream

我正在看这个课程:https://developer.android.com/reference/android/media/ImageReader.html

我想要的是从ImageReader类中获取一个InputStream,并获取正在渲染到当前表面的图像数据.Current Surface表示当前显示的android屏幕.我在AOSP代码中查看了一个示例,但实际上很难理解.如果有人为我提供了一个很好的ImageReader类示例,那将非常有用.

java android file-descriptor fileinputstream surfaceview

0
推荐指数
1
解决办法
1766
查看次数

C&linux:重用封闭的套接字/替代品

我正在为游戏制作多线程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()或类似的东西以及稍后连接的新客户端,以便能够在阵列中重用此套接字/位置.

我正在寻找一种重置套接字的方法,以便在需要时再次使用它.我希望这让事情变得更容易理解,再次感谢.

c sockets linux file-descriptor

0
推荐指数
1
解决办法
1550
查看次数

C - 如何在只读取单个字符时检测管道中的EOF?

正如回答中所解释的那样,在编写进程关闭所有相关文件描述符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)

c pipe file-descriptor eof

0
推荐指数
1
解决办法
1598
查看次数

setbuf() - printf() 和 write()

这是我在 Stackoverflow 上迈出的第一步!

所以,我试图使用setbuf()重定向stdoutchar 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)

输出是

缓冲区内容:
这有效

你知道为什么吗?因为现在我不知道这是如何工作的,我将通过管道将标准输出传输到标准输入,然后读取结果 - 我认为这不是最干净的方法。

谢谢你,祝你有美好的一天 !

c buffer file-descriptor stream

0
推荐指数
1
解决办法
636
查看次数

gcc -E 是什么意思?

我在导航和搜索 stdio.h 的文件描述符在机器中的存储位置时遇到了 -E 的这个选项?但我不确定这个命令 gcc -E 到底是做什么的?可以用来查看/usr/include/目录下stdio.h文件的文件描述符吗?

c gcc file-descriptor

-1
推荐指数
2
解决办法
7063
查看次数

标签 统计

file-descriptor ×11

c ×8

linux ×3

android ×1

bash ×1

buffer ×1

eof ×1

exec ×1

file ×1

fileinputstream ×1

gcc ×1

grep ×1

java ×1

mode ×1

pipe ×1

printf ×1

sed ×1

sh ×1

sockets ×1

stream ×1

surfaceview ×1

system-calls ×1

unistd.h ×1

unix ×1