#include <stdio.h>
#include <unistd.h>
#include <signal.h>
#include <fcntl.h>
#include <sys/types.h>
#include <sys/socket.h>
#include <errno.h>
#include <assert.h>
#define interval 5
static int pfd[2];
void sig_handler(int signum)
{
printf("capture alarm signum %d\n",signum);
int msg = signum;
int n = send(pfd[1], &msg, 1, 0);
if (n < 0)
perror("send error");
alarm(interval);
}
int main()
{
alarm(interval);
int buf[BUFSIZ], net;
struct sigaction act;
act.sa_handler = sig_handler;
act.sa_flags = 0;
sigfillset(&act.sa_mask);
sigaction(SIGALRM, &act, NULL);
net = socketpair(PF_UNIX, SOCK_STREAM, 0, pfd);
assert(net != -1);
int FLAG = fcntl(pfd[1], F_GETFL, NULL);
fcntl(pfd[1], F_SETFL, FLAG | O_NONBLOCK);
while(1){
int n = recv(pfd[0], buf, sizeof(buf), 0);
//perror("accept");
//printf("recv %d\n", n);
write(STDOUT_FILENO, buf, n);
}
return 0;
}
代码思路:设置管道和定时信号,5s定时跳到信号处理函数,向管道写数据,然后主函数从管道读数据,如此往复。
问题:写数据不会报错,读数据recv阻塞状态被打断无法读取,即使没读到下一次循环不就读到了吗,刚入门新手求处理方法。
将读数据写到线程里。就不会打断主线程业务了。
您好,我是有问必答小助手,您的问题已经有小伙伴解答了,您看下是否解决,可以追评进行沟通哦~
如果有您比较满意的答案 / 帮您提供解决思路的答案,可以点击【采纳】按钮,给回答的小伙伴一些鼓励哦~~
ps:问答VIP仅需29元,即可享受5次/月 有问必答服务,了解详情>>>https://vip.csdn.net/askvip?utm_source=1146287632