相关疑难解决方法(0)

为什么stdout在重定向到文件时需要显式刷新?

行为printf()似乎取决于的位置stdout.

  1. 如果stdout发送到控制台,则printf()行缓冲并在打印换行符后刷新.
  2. 如果stdout被重定向到文件,则除非fflush()被调用,否则不刷新缓冲区.
  3. 此外,如果printf()stdout重定向到文件之前使用,则后续写入(对文件)是行缓冲的并在换行后刷新.

何时进行stdout行缓冲,什么时候fflush()需要调用?

最简单的例子:

void RedirectStdout2File(const char* log_path) {
    int fd = open(log_path, O_RDWR|O_APPEND|O_CREAT,S_IRWXU|S_IRWXG|S_IRWXO);
    dup2(fd,STDOUT_FILENO);
    if (fd != STDOUT_FILENO) close(fd);
}

int main_1(int argc, char* argv[]) {
    /* Case 1: stdout is line-buffered when run from console */
    printf("No redirect; printed immediately\n");
    sleep(10);
}

int main_2a(int argc, char* argv[]) {
    /* Case 2a: stdout is not line-buffered when …
Run Code Online (Sandbox Code Playgroud)

c linux stdout

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

Printf在装配时没有换行符

我最近阅读了有关在汇编中使用printf和scanf的这篇文章:

intfmt的含义:db"%d",10在程序集中

特别是它说"在printf中,换行符打印换行符然后(如果输出处于行缓冲模式,它可能是),刷新内部输出缓冲区,以便您可以实际看到结果.所以当你删除10 ,没有同花顺,你看不到输出."

但是,如果我在汇编文件中输出后不想要换行,我不知道该怎么办.这是一个简单的测试文件,我写的是尝试打印而没有换行:

extern printf


LINUX        equ     80H      ; interupt number for entering Linux kernel
EXIT         equ     60       ; Linux system call 1 i.e. exit ()




section .data
    int_output_format: db "%ld", 0


segment .text
    global  main


main:
    mov r8, 10
    push rdi
    push rsi
    push r10
    push r9
    mov rsi, r8
    mov rdi, int_output_format
    xor rax, rax
    call printf
    pop r9
    pop r10
    pop rsi
    pop rdi
    call os_return      ; return to operating system


os_return:
    mov  rax, EXIT …
Run Code Online (Sandbox Code Playgroud)

c assembly printf newline nasm

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

ASM printf奇怪的行为

这段代码在屏幕上打印Hello

.data
    hello: .string "Hello\n"
    format: .string "%s" 
.text
    .global _start 
    _start:

    push $hello
    push $format
    call printf

    movl $1, %eax   #exit
    movl $0, %ebx
    int $0x80
Run Code Online (Sandbox Code Playgroud)

但是如果我从hello字符串中删除'\n',就像这样:

.data
    hello: .string "Hello"
    format: .string "%s" 
.text
    .global _start 
    _start:

    push $hello
    push $format
    call printf

    movl $1, %eax   #exit
    movl $0, %ebx
    int $0x80
Run Code Online (Sandbox Code Playgroud)

程序不起作用.有什么建议?

x86 assembly asmx nasm

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

为什么这个简单的代码使用`exit`而不能使用`_exit`?

请看一下这个示例代码,它使用一个非常完善的编程模式来重定向stdout到管道.

#include <stdio.h>
#include <unistd.h>

int main(int argc, char **argv)
{
    int fd[2];
    pipe(fd);

    pid_t pid = fork();
    if (pid == 0) {
        close(fd[0]);
        dup2(fd[1], 1);
        printf("A string");
        _exit(0);
    }

    close(fd[1]);
    char text[1000];
    size_t size;
    int p = 0;
    while ((size = read(fd[0], text+p, 1)) == 1) {
        p++;
    }
    close(fd[0]);
    text[p] = '\0';
    printf("%s", text);

    return 0;
}
Run Code Online (Sandbox Code Playgroud)

代码实际上不起作用.正如@kaylum在评论中正确建议的那样,调用exit而不是_exit在子进程中使代码正常工作.

c exit

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

在 x64 Linux 上,syscall、int 0x80 和 ret 之间有什么区别来退出程序?

经过多年的 C++ 和 Python,我昨天决定学习汇编(NASM 语法),我已经对退出程序的方式感到困惑。它主要是关于 ret 因为它是 SASM IDE 上的建议指令。

我显然是在为主要说话。我不关心 x86 向后兼容性。只有 x64 Linux 的最佳方式。我很好奇。

linux assembly x86-64 system-calls exit

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

将linux中汇编代码的运行结果重定向到文本文件

我正在尝试编写一个Python脚本来测试我在汇编中针对预期输出编写的各种代码的输出.但是我很难将输出重定向到文件中.我写了以下内容:

extern printf
LINUX   equ     80H     ; interupt number for entering Linux kernel
EXIT    equ     1       ; Linux system call 1 i.e. exit ()
section .data
    intfmt: db "%ld", 10, 0

segment .text
    global  main


main:
    push rax
    push rsi
    push rdi
    mov rsi, 10
    mov rdi, intfmt
    xor rax, rax
    call printf
    pop rdi
    pop rsi
    pop rax 
    call os_return      ; return to operating system


os_return:
    mov  rax, EXIT      ; Linux system call 1 i.e. exit ()
    mov  rbx, …
Run Code Online (Sandbox Code Playgroud)

linux assembly printf gcc io-redirection

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

printf float in nasm assembly 64-bit

我想用printf打印浮点值

global main
extern printf

section .data
   string: db `%f\n`, 0

section .bss
   rs: resq 1

[...]

   movq xmm0, [rs]
   mov rdi, string
   mov rax, 0
   call printf
Run Code Online (Sandbox Code Playgroud)

rs包含浮点值1.6

(gdb) x/fg &rs
0x600ad8 <rs>:  1.6000000000000001
Run Code Online (Sandbox Code Playgroud)

但程序打印

[username@localhost folder]$ ./programname
0.000000
Run Code Online (Sandbox Code Playgroud)

谁能让程序打印1.6?我究竟做错了什么?

assembly printf x86-64 nasm calling-convention

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