gpt4 book ai didi

c - 从信号处理程序返回后再次读取 block

转载 作者:行者123 更新时间:2023-12-02 00:51:20 24 4
gpt4 key购买 nike

<分区>

我编写了一个非常小的测试程序来检查 read() 被已处理信号中断时 errno 的值。

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

void handler(int sig){
printf("signal: %d\n", sig);
}

int main(){
signal(SIGINT, handler);
char arr[10];
read(0, arr, 10);
perror("emsg");
return 0;
}

根据我所知道的一切和read(2) 的手册页,

EINTR  The call was interrupted by a signal before any data  was  read;
see signal(7).

read 应返回 -1 并将 errno 设置为 EINTR。但是,程序的输出表明它在从信号处理程序返回后再次阻塞 read

这对我来说完全没有意义,我无法弄清楚出了什么问题。

这是我得到的输出:

$ ./a.out
^Csignal: 2
^Csignal: 2
^Csignal: 2
^Csignal: 2
hello
emsg: Success

我的问题不同于this one .后者在任何地方都没有谈论系统调用中断时会发生什么。该讨论的关键是应该使用哪个。

另外this answer在同一线程上说 signal() 在下面调用 sigaction(),那么为什么两者在系统调用情况下的行为不同?

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