posix 相关问题

POSIX(可移植操作系统接口)是一组标准,用于定义编程API,命令解释器以及类Unix操作系统的通用实用程序。

将标准输出重定向到文件

我正在尝试在 C 中执行与 bash 命令 ls>foo.txt 等效的操作。 下面的代码将输出重定向到一个变量。 #包括 #包括 #包括 我正在尝试在 C 中执行相当于 bash 命令的ls>foo.txt 下面的代码将输出重定向到一个变量。 #include <stdio.h> #include <stdlib.h> #include <sys/types.h> #include <unistd.h> #include <sys/wait.h> int main(){ int pfds[2]; char buf[30]; pipe(pfds); if (!fork()) { close(pfds[0]); //close(1);//Close stdout //dup(pfds[1]); //execlp("ls", "ls", NULL); write(pfds[1], "test", 5); //Writing in the pipe exit(0); } else { close(pfds[1]); read(pfds[0], buf, 5); //Read from pipe wait(NULL); } return 0; } 注释行指的是我认为重定向所需的那些操作。 我应该更改什么以将 ls 的输出重定向到 foo.txt? 在处理将输出重定向到文件时,您可以使用 freopen()。 假设您正在尝试将您的stdout重定向到文件'output.txt'然后你可以写- freopen("output.txt", "a+", stdout); 此处为附加模式的“a+”。如果文件存在,则文件以追加模式打开。否则会创建一个新文件。 用stdout重新打开freopen()后,所有输出语句(printf,putchar)都被重定向到'output.txt'。所以在那之后任何printf()语句都会将它的输出重定向到'output.txt'文件。 如果你想再次恢复printf()的默认行为(即在终端/命令提示符中打印),那么你必须使用以下代码再次重新分配stdout- freopen("/dev/tty", "w", stdout); /*for gcc, ubuntu*/ 或者 - freopen("CON", "w", stdout); /*Mingw C++; Windows*/ 然而,类似的技术适用于“stdin”。 您的代码本质上所做的是打开一个管道,然后分叉进程并在子进程中(在注释代码中)关闭标准输出,将管道复制到标准输出并执行和 ls 命令,然后(在非注释代码中)向管道写入 4 个字节。在父进程中,您从管道中读取数据并等待子进程完成。 现在你想将 stdout 重定向到一个文件。您可以通过使用 open() 系统调用打开文件然后将该文件描述符复制到标准输出来实现。类似的东西(我没有测试过这个所以要小心代码中的错误): int filefd = open("foo.txt", O_WRONLY|O_CREAT, 0666); if (!fork()) { close(1);//Close stdout dup(filefd); execlp("ls", "ls", NULL); } else { close(filefd); wait(NULL); } return 0; 但是,您也可以按照其他答案的建议使用 freopen。 但是,我对您的代码和我修改后的代码有几个担忧: pipe() 和 open() 系统调用可能会失败。您应该始终检查系统调用失败。 fork() 系统调用可能会失败。同上。 dup2()可以用来代替dup();否则,如果标准输入未打开,代码将失败,因为它复制到第一个可用的文件描述符。 execlp() 系统调用可能会失败。同上。 我认为 wait() 可以被信号(EINTR)中断。建议将它包装在一个包装器周围,如果它被信号(errno == EINTR)中止,则重试系统调用。 “在 ubuntu 中使用终端测试”. 例如你的代码是“mike.c” 你首先编译它 gcc mike.c 如果没有错误, 你然后做 ./a.out > file 您将在与 mike.c 相同的目录(文件夹)中找到包含代码的文件 注意文件可以是 (file.txt, file.md ...) 希望这有帮助。

回答 3 投票 0

如果 popen() 创建的子进程被杀死,父进程将退出,即使安装了 signal_handler()

我的程序整体设计是: 我安装了一个信号处理程序,如果发送了一些信号,它会设置一个标志; 我开始一个事件循环 如果标志打开,事件循环将退出,并进行一些最终确定......

回答 1 投票 0

如何在 CMake 中检查我的系统是否符合 POSIX 标准?

我只想在 POSIX 系统上尝试构建源文件(为了这个问题,让我们忽略交叉构建)。我知道如何检查我使用的是 UNIX 系统;我知道如何检查...

回答 1 投票 0

命名匿名文件指针

给定一个指向打开文件的文件指针 fp,是否有一种可移植的方法来给它命名?在这种情况下不能使用函数重命名,因为我没有引用 f 的当前名称...

回答 1 投票 0

vm_insert_page()和remap_pfn_range()有什么区别?

我想使用ioremap_wc()将设备内存(NIC)映射到内核空间内存区域。然后我想将内存区域从内核空间重新映射到用户空间,为此我可以使用 2 个函数:

回答 3 投票 0

heredocument 中带有空参数的 Shell 行为差异

Ash、Dash 或 Bash,Zsh 以不同方式处理此处文档中的无效空参数 ${var:?} 扩展错误。 这是使用真正 POSIX 语法的 experiment.sh 代码: #!/usr/bin/env sh 空...

回答 1 投票 0

为什么 bash broken pipe 错误通常是无声的?

例如,我有 猫文件 |头-n 2 其中文件很大。这是一个损坏的管道错误,因为读者提前终止,而作者仍然有东西要写。 但是,

回答 1 投票 0

有什么方法可以使用 C99 获得 fdopen 功能?

显然 fdopen 需要使用编译标准的 POSIX/gnu99。我希望留在 C99。 我遇到这个问题是因为我使用 open() 创建文件描述符然后(因为我 ...

回答 2 投票 0

Bash 检查文件是否在日期范围内被修改

我有一个脚本来检查证书(.cer 文件)是否在 14 天内过期,如果是,它将存档旧的证书请求,生成一个新的,并将其发送到中间件团队....

回答 1 投票 0

Docker image build error: shell script file is copied in the workdir but it says the file is not found

我正在尝试使用 alpine 对遗留 Java 项目进行码头化。 我的机器在 Windows 10 上运行,我正在使用适用于 Windows 的 Docker Desktop。 这是我的 Dockerfile: 来自 openjdk:8u171-jdk-alpine 运行...

回答 0 投票 0

C++ 在 Linux 中运行 traceroute。 popen 不返回整个输出

我想在 Linux 上从 C++ 执行 tcptraceroute 命令。 我找到了一个问题/答案(见下文)。但是,它只返回前几行: 所选设备 epo3,地址 192.168...

回答 0 投票 0

我应该在 poll() 循环中调用 close() 吗

下面的程序准备使用 fork()/exec()/poll() 组合从子进程中捕获 stdout 和 stderr。它大部分工作正常,但在这里失败了: 如果(关闭(pfds[j].fd)==-1)

回答 1 投票 0

为什么标准输入的 read() 在换行时停止?

如果如下代码 ssize_t len = read(0, buf, BUF_SIZE); 错误(“读取()”); printf ("%i '%s' ", (int) 长度, 缓冲区); 执行从终端读取,read() 在

回答 1 投票 0

清除 termios 结构中的 ISIG 标志禁用什么信号?

The Open Group 的 termios.h 手册页未指定任何内容: ISIG 启用信号。 OpenBSD 的 termios.h 手册页说明: ISIG /* 启用信号 INTR、QUIT、[D]SUSP */ 而 Linux 的人...

回答 1 投票 0

将界面设置为混杂模式后网络已关闭

通过以下方式将接口设置为混杂模式后网络总是关闭: memset(&ifr, 0, sizeof(ifr)); strcpy(ifr.ifr_name, if_name); ifr.ifr_flags |= IFF_PROMISC; ioctl(sock, SIOCSIFFLAGS, &a...

回答 1 投票 0

Lua 多线程编程无法注册信号处理器

我目前正在使用 torch 来训练多线程深度学习网络,我需要注册一个信号处理程序,以便在我按下 ctrl+c 时可以保存网络的权重。但是问题来了,我发现了

回答 1 投票 0

POSIX的libgen.h为什么这么叫?

POSIX 包含一个名为 libgen.h 的头文件(本身不是很明确),描述为 模式匹配函数的定义 并包含以下函数定义: char *basename(cha...

回答 1 投票 0

由于写入延迟,是否可以从管道读取部分数据?

我有这样一种情况,一个进程每 100 毫秒将 512 字节的数据写入管道,而另一个进程不断地从同一个管道读取数据。读取完整需要三个读取操作...

回答 0 投票 0

在 Linux 中从共享相同文件描述符的多个线程写入同一个管道是线程安全的吗?

我有一个有两个线程的 Linux 进程,它们共享同一个文件描述符,每 100 毫秒将 400 字节的数据写入同一个管道。我想知道 POSIX 是否保证这是线程安全的或...

回答 2 投票 0

如何在ggplot2中绘制Posix的小时数据?

我有一个数据框:bvar time 0.000000000 2003-03-14 19:00:00 0.200000000 2003-03-14 20:00:00 0.044000000 2003-03-14 21:00:00 这里,时间是POSIXct:str(tsdat$time) POSIXct[1:193],格式。"2003-...

回答 1 投票 0

© www.soinside.com 2019 - 2024. All rights reserved.