c系统调用在if语句之前运行

时间:2013-02-09 02:10:30

标签: c

所以这是我的问题,鉴于此代码,只是在输入您的名字之前添加的任何内容被忽略,并自动运行第一条指令(甚至没有先检查x是否为5,输入您的名字,然后它之前的指令是运行的。所以如果程序的第一行是printf,那将被忽略并立即询问输入然后打印printf语句,即使它是第一行。请帮助

int main(int argc, char** argv)
{
    char val[70];
    int x=3;
    if(x>5)
    {
        if(write(1, "Please input your name", 22)!=22)
        {
            return -1;
        }

        if(read(0, val, 36) < 0)
        {}

        if(write(1, val, 36)!=36)
        {}
    }
}

2 个答案:

答案 0 :(得分:1)

printf适用于stdout这是一个FILE *。 read()和write()调用直接在文件描述符上工作。

FILE *通常是缓冲的,这意味着你打印的东西会驻留在程序的缓冲区中,直到它被刷新为止。 write()将数据直接发送到操作系统,而不会在应用程序中进行任何缓冲。

然后刷新FILE *缓冲区以显示输出:

int main(int argc, char** argv)
{
  char val[70];
  int x=3;
  printf("Hello");
  fflush(stdout);

如果stdout是你的终端,那么当你写一个换行符时,通常会自动刷新,例如printf("Hello\n");

答案 1 :(得分:1)

你所说的不是会发生什么。您的主函数将立即返回0.以下是调试示例:

(gdb) break main
Breakpoint 1 at 0x40074b: file ./test.cpp, line 6.
(gdb) run
Starting program: /tmp/test 

Breakpoint 1, main (argc=1, argv=0x7fffffffe528) at ./test.cpp:6
6       int x=3;
Missing separate debuginfos, use: debuginfo-install glibc-2.16-28.fc18.x86_64 libgcc-4.7.2-8.fc18.x86_64 libstdc++-4.7.2-8.fc18.x86_64
(gdb) next
7       if(x>5)
(gdb) 
19  }
(gdb) 
0x00007ffff7744a05 in __libc_start_main () from /lib64/libc.so.6
(gdb) 
Single stepping until exit from function __libc_start_main,
which has no line number information.
[Inferior 1 (process 4962) exited normally]
(gdb) 

事实上,在启用优化的情况下,对其主体的整个if检查将作为死代码消除,从而产生一个很好的主函数,如下所示:

int main()
{
    return 0;
}

通过查看二进制代码(objdump -CD -M intel)确认:

00000000004004c0 <main>:
  4004c0:       31 c0                   xor    eax,eax
  4004c2:       c3                      ret    
  4004c3:       90                      nop

也许现在是学习如何调试代码的好时机。首先阅读一些GDB documentation

祝你好运!