标签: file-descriptor

STDIN_FILENO 和 STDOUT_FILENO 在 c 中是只读的吗?

fd = open("/dev/null", O_RDWR);
if (fd == -1) {
    ngx_log_error(NGX_LOG_EMERG, log, ngx_errno,
                  "open(\"/dev/null\") failed");
    return NGX_ERROR;
}

if (dup2(fd, STDIN_FILENO) == -1) {
    ngx_log_error(NGX_LOG_EMERG, log, ngx_errno, "dup2(STDIN) failed");
    return NGX_ERROR;
}

if (dup2(fd, STDOUT_FILENO) == -1) {
    ngx_log_error(NGX_LOG_EMERG, log, ngx_errno, "dup2(STDOUT) failed");
    return NGX_ERROR;
}


if (fd > STDERR_FILENO) {
    if (close(fd) == -1) {
        ngx_log_error(NGX_LOG_EMERG, log, ngx_errno, "close() failed");
        return NGX_ERROR;
    }
}
Run Code Online (Sandbox Code Playgroud)

man告诉我dup2() makes newfd be the copy of oldfd, closing newfd first if necessary.: …

c unix file-descriptor dup2

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

C freopen 描述符 - 手动关闭/保持打开状态

我之前一直在使用 freopen (来自 stdio.h)函数,但没有问自己这个问题。但现在我不确定。

例如我重新打开了标准输出:

    #define  OUTPUT_FILE "out.txt"
    if ( freopen(OUTPUT_FILE,"w+",stdout) == NULL)
      printf("logout can't be opened\n");
Run Code Online (Sandbox Code Playgroud)

通常每个进程都有并自动处理 stdout、stderr、stdin,我们不需要关心它们的关闭。
但在这里怎么样?我已重新打开标准输出。
我应该调用 fclose 来关闭重新打开的标准输出吗?

PS 我更高兴看到执行此处理的部分代码,而不是听到我可以确信这里一切都很好。

预先感谢您的任何提示。

c file-descriptor stdio

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

fileno将FILE转换为描述符C.

有没有办法将类型int(文件描述符)的变量强制转换为C中的类型FILE?我有一个开放的管道fd,我想使用期望FILE的函数.

c file-descriptor

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

非阻塞 tun/tap 文件描述符上的 read() 出现 EAGAIN 错误

我想从非阻塞 tun/tap 文件描述符中读取 IP 数据包,tunfd 我将其设置tunfd为非阻塞并在 libevent 中为其注册 READ_EV 事件。

当事件被触发时,我首先读取前20个字节以获取IP头,然后读取其余部分。

nr_bytes = read(tunfd, buf, 20);
...
ip_len = .... // here I get the IP length
....
nr_bytes = read(tunfd, buf+20, ip_len-20);
Run Code Online (Sandbox Code Playgroud)

但是对于read(tunfd, buf+20, ip_len-20) 我收到 EAGAIN 错误,实际上应该有一个完整的数据包,所以应该有一些字节,为什么我会收到这样的错误?

tunfd 与非阻塞模式或 libevent 不兼容?

谢谢!

sockets file-descriptor openvpn tun

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

如果 fd 超出本地范围,Python 会关闭它吗?

我发现 Python 会自动关闭我的文件描述符。运行以下代码并使用lsof查找打开的文件。当 sleep in function 时openAndSleep,我发现文件“fff”被进程保存。但是当它用完该功能时,文件“fff”不再保留。

import time

def openAndSleep():
    f = open("fff", 'w')
    print "opened, sleep 10 sec"
    time.sleep(10)
    print "sleep finish"

openAndSleep()
print "in main...."
time.sleep(10000)
Run Code Online (Sandbox Code Playgroud)

我检查类文件,它没有__del__方法。看起来很奇怪,有人知道吗?

python file file-descriptor

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

fork和exec之后在父级和子级之间共享文件描述符

我在Linux,A和B上有两个进程.我想从进程A与进程B共享文件描述符,现在我只是将它序列化为a char*并将其传递给execl参数,但这不起作用.

Ac看起来像这样:

union descriptor{
    char c[sizeof(int)];
    int i;
} fd;
pid_t pid;

fd.i = socket(AF_INET, SOCK_STREAM, IPPROTO_TCP);
// Perform other socket functions

pid = fork();
if(pid == 0){
    // Read data from socket
    if(execl("./B", fd.c, NULL) < 0){
        exit(EXIT_FAILURE);
    }else(
        exit(EXIT_SUCCESS);
    }
}else if(pid < 0){
    exit(EXIT_FAILURE);
}else{
    waitpid(pid, NULL, 0);
}
Run Code Online (Sandbox Code Playgroud)

Bc看起来像这样:

union descriptor{
    char c[sizeof(int)];
    int i;
} fd;

memcpy(&fd.c[0], argv[0], sizeof(int));

write(fd.i, "TEST", 4);
close(fd.i);
Run Code Online (Sandbox Code Playgroud)

但这不起作用,我不明白为什么不.我怎样才能做到这一点?如果它的工作原理,它是经过共享父母和孩子之间的文件描述符的最佳解决方案fork和一个exec

更新

问题与我提出的问题无关,它是由@OliCharlesworth指出的传递整数的错误方式引起的.请关闭这个问题.

c linux fork file-descriptor exec

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

限制Container中打开文件的数量

我们正在尝试限制整个容器的打开文件总数.使用ulimit限制主机中的开放fds.从我们所知的docker容器作为主机操作系统上的进程运行,因此我们应该能够使用ulimit限制每个docker容器的打开文件总数.

但是我们能够跨越容器中打开文件的总数[主机上的ulimit值].

docker是否有明确定义的机制来限制每个容器打开文件的数量?

containers file-descriptor docker

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

什么是文件描述符?

在尝试学习套接字编程时,我看到了以下代码:

int sock;
sock = socket(PF_INET, SOCK_STREAM, IPPROTO_TCP);
Run Code Online (Sandbox Code Playgroud)

我浏览了手册页,发现套接字返回了一个文件描述符。我曾尝试在这里搜索互联网和其他类似问题,但我无法理解文件描述符到底是什么。我必须在两天内完成我的套接字编程课程。所以如果有人能用简单的语言解释文件描述符,那就太好了。

c sockets file-descriptor

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

Bash 函数是否可以将值输出到文件描述符,然后仅将其分配给变量?

我想模拟 Bash 函数的返回值,我想知道是否可以使用临时文件描述符来传递该值。

换句话说:

function myfunction {
  # print `stdout_value` to stdout
  # print `stderr_value` to stderr
  # print `return_value` to FD3 (or other)
}

# the values printed to stderr/stdout should be printed, but only
# `return_value` should be assigned to `myvalue`
myvalue=$(myfunction <FDs manipulation>)
Run Code Online (Sandbox Code Playgroud)

bash shell stdin stdout file-descriptor

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

在鱼壳中管道 eval/source 的输出

我想将 的输出通过管道eval传输到文件。如果命令执行成功,这将按预期工作:

eval ls > log.txt 2>&1
cat log.txt # Documents Desktop
Run Code Online (Sandbox Code Playgroud)

如果命令不成功,它也有效

eval rm Desktop > log.txt 2>&1
cat log.txt # rm: cannot remove 'Desktop': Is a directory
Run Code Online (Sandbox Code Playgroud)

但是,如果命令不存在,我无法重定向 stderr

eval abcde > log.txt 2>&1 # fish: Unknown command abcde
cat log.txt # (empty)
Run Code Online (Sandbox Code Playgroud)

如何将第三种情况的输出也重定向到日志文件?


一些与工作source也将非常赞赏:

echo abcde | source > log.txt 2>&1
Run Code Online (Sandbox Code Playgroud)

eval file-descriptor io-redirection fish

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

标签 统计

file-descriptor ×10

c ×5

sockets ×2

bash ×1

containers ×1

docker ×1

dup2 ×1

eval ×1

exec ×1

file ×1

fish ×1

fork ×1

io-redirection ×1

linux ×1

openvpn ×1

python ×1

shell ×1

stdin ×1

stdio ×1

stdout ×1

tun ×1

unix ×1