这(几乎)是一个家庭作业问题。我有发送者和接收者程序。发送者将接收器和int的pid作为命令行参数。它有一个由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");
sender.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;
}
receiver.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;
}
答案 0 :(得分:0)
确定。如果你只是将sleepVal分配给tv_sec并将tv_nsec分配给0工作?