gpt4 book ai didi

c - 在 C 中,没有换行符的 printf() 即使有信号也不会生成输出?

转载 作者:塔克拉玛干 更新时间:2023-11-02 23:27:00 31 4
gpt4 key购买 nike

我现在用的是 Mac 的 gcc。下面的程序运行良好。我的意思是当我按下 control+c 时,终端显示“现在有一个 SIGINT 信号\n”:

#include <signal.h>
#include <stdio.h>
#include <unistd.h>
void handler(int s)
{
if (s == SIGINT) printf(" now got a SIGINT signal\n");
}
int main()
{
signal(SIGINT, handler);
loop:
/* spin here, waiting for ctrl-c */
goto loop;
}

但是,当我添加一行时,发生了一些奇怪的事情:

#include <signal.h>
#include <stdio.h>
#include <unistd.h>
void handler(int s)
{
if (s == SIGINT) printf(" now got a SIGINT signal\n");
}
int main()
{
printf("process id is %d ",getpid());
signal(SIGINT, handler);
loop:
/* spin here, waiting for ctrl-c */
goto loop;
}

终端不显示“process id is...”,但在我按下 ^c 后,终端输出 ^Cprocess id is 13888 now got a SIGINT signal。这真的让我很困惑。事实上,输出真的不能用;该功能是一个简单的代码如下:

#include <signal.h>
#include <unistd.h>
#include <stdio.h>
void sigroutine(int dunno) {
switch (dunno) {
case 1:
printf("Get a signal -- SIGHUP ");
break;
case 2:
printf("Get a signal -- SIGINT ");
break;
case 3:
printf("Get a signal -- SIGQUIT ");
break;
}
return;
}
int main() {
printf("process id is %d ",getpid());
signal(SIGHUP, sigroutine);
signal(SIGINT, sigroutine);
signal(SIGQUIT, sigroutine);
for (;;) ;
}

它在我的终端上的输出似乎什么都没有。无论我输入什么,它都不会回应。我开始一个一个删除语句,把switch换成if,for换成goto,删除getpid()。最后,我不明白为什么它可以响应 control+c。然而 getpid() 的行为对我来说真的很奇怪。你能给我解释一下吗?

我也试过只输出 getpid() 而没有 signal()。它运行良好。

顺便说一句:既然 Ctrl+c 没用,我怎么能在不打开另一个终端的情况下重新运行程序。

最佳答案

第一个 printf 的输出被缓冲。添加 \n,或使用 fflush() 强制刷新缓冲区。

有关更多说明,请参见此处:Why does printf not flush after the call unless a newline is in the format string?

关于c - 在 C 中,没有换行符的 printf() 即使有信号也不会生成输出?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39322972/

31 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com