gpt4 book ai didi

c - 处理 sigusr1 和 sigusr2,仅适用于 sigusr2

转载 作者:太空宇宙 更新时间:2023-11-04 04:42:06 24 4
gpt4 key购买 nike

这(几乎)是一道家庭作业题。我有一个发送者和一个接收者程序。发送方将接收方的 pid 和 int t 作为命令行参数。它有一个由 As 和 Bs 组成的字符串(例如“AABBBA”),并通过信号将这个字符串发送给接收者。对于字符串中的每个 A 发送一个 SIGUSR1,对于每个 B 发送一个 SIGUSR2。并在每个字母之间等待 t 毫秒。

接收方,应该为每个到达的 SIGUSR1 打印一个 A,为每个到达的 SIGUSR2 打印一个 B。我不明白为什么,但我的接收器只打印 Bs。这是第一个问题。

在上面的代码中,我使用了两个信号处理程序,每个处理程序一个。但我也想知道是否可以使用单个处理程序来处理它们。我读过类似的东西,这不好。但我不确定我是不是真的。我都试过了,但无论如何它只打印 Bs。可以使用这样的处理程序吗?:

 void handler(int signum)
{
if (signum == SIGUSR1) // arrived .
{
write(1,"A\n", 2);
}
else if(signum == SIGUSR2) //arrived _:
{
write(1,"B\n", 2);
}
}

//in the main function...

sa.sa_handler = handler_sg1;
ec_neg1(sigaction(SIGUSR1, &sa, NULL), "sigaction");
ec_neg1(sigaction(SIGUSR2, &sa, NULL), "sigaction");

发件人.c :

 #include <stdio.h>
#include <stdlib.h>
#include <errno.h>
#include <time.h>
#include <signal.h>

#define ec_neg1(s,m) if((s) == -1) {perror(m); exit(errno);}


int main(int argc, char *argv[])
{
pid_t pid;
int sleepVal;

struct timespec ts;

if(argc == 3)
{
pid = atoi(argv[1]);
sleepVal= atoi(argv[2]);

ts.tv_sec = 0;
ts.tv_nsec = sleepVal * 1000000L;

printf("sender started...\n");

char msg[100] = "AABBBABA";
int i;

for (i = 0; msg[i] != '\0'; ++i)
{
if(msg[i] == 'A')
kill(pid, SIGUSR1);
else if( msg[i] == 'B')
kill(pid, SIGUSR2);

//Wait for sleepVal milliseconds after every signal
ec_neg1(nanosleep(&ts, NULL),"nanosleep failed")
}

printf("done.\n");

}

return 0;
}

接收器.c :

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

#define ec_neg1(s,m) if((s) == -1) {perror(m); exit(errno);}



static void handler_sg1(int signum)
{
write(1,"A\n", 2);
}

static void handler_sg2(int signum)
{
write(1,"B\n", 2);
}

int main(int argc, char *argv[])
{

struct sigaction sa;

memset(&sa, 0, sizeof(sa));
sa.sa_handler = handler_sg1;
ec_neg1(sigaction(SIGUSR1, &sa, NULL), "sigaction");
sa.sa_handler = handler_sg2;
ec_neg1(sigaction(SIGUSR2, &sa, NULL), "sigaction");

printf("receiver started...\n");

while(1)
;


return 0;
}

最佳答案

好的。如果您只是将 sleepVal 分配给 tv_sec 并将 tv_nsec 分配给 0 工作?

关于c - 处理 sigusr1 和 sigusr2,仅适用于 sigusr2,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25353348/

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