gpt4 book ai didi

c - 玩转信号

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

我目前正在做一个学习信号的项目,基本上我有一个客户端和一个服务器,服务器给出一个pid,我必须用一个字符串作为参数输入客户端,启动后,客户端将此字符串发送到服务器,服务器显示它。

到目前为止我所做的是将字符串转换为二进制,如果整数是 0 我发送 SIGUSR1 否则(如果它是 1)我发送 SIGUSR2,这样我想将二进制转换为我们拥有的字符串以前,但我想知道我该怎么做。

这是服务器的主要部分,如您所见,它显示了它的 pid(因此我们稍后可以用它启动客户端)并等待信号。一旦它捕获到一个它调用 my_sig(您将在本线程的后面找到)。

int     main()
{
int pid;

pid = getpid();
printf("Server pid is: %d\n", pid);
if (signal(SIGUSR1, my_sig) == SIG_ERR)
{
printf("Error.\n");
exit(1);
}
if (signal(SIGUSR2, my_sig) == SIG_ERR)
{
printf("Error.\n");
exit(1);
}
while (1);
}

这是非常简单的 my_sig,您可以看到它是否接收到 SIGUSR1 作为信号,它显示 0,否则显示 1。

void            my_sig(int param)
{
char *src;
char *dest;

if (param == SIGUSR1)
{
my_printf("0");
}
if (param == SIGUSR2)
{
my_printf("1");
}
}

所以归根结底,它所做的是逐个字符地以二进制字符显示客户端中给出的单词。

我如何使用它来显示我在客户端中输入的字符串?

谢谢大家,如果您需要任何精确度,请告诉我。

编辑:尽管我很想知道其他信号,但遗憾的是,对于这个项目我仅限于这些信号。

最佳答案

信号在很大程度上不适合这项任务,因为根据时间的不同,可能会丢失信息。

标准信号会丢失位和顺序。这些信号被单独命名(例如,SIGUSR1、SIGUSR2),并且不排队。也就是说,任何给定的标准信号在任何时候都只能有一个实例挂起。此外,他们的交付顺序不能保证,但实际上通常是从低到高。因此,如果我发送了您的进程 USR2、USR2、USR1、USR1、USR2、USR2 并且时机恰到好处,您的进程可能会收到一个 USR1,然后是一个 USR2。

实时信号会丢失您的顺序。这些信号在 SIGRTMIN 到 SIGRTMAX 范围内编号,它们排队,并且它们有定义的传递顺序。不幸的是,该订单是 lowest to highest因此提出了与上述类似的问题。 (您将收到 MIN+0、MIN+0、MIN+1、MIN+1、MIN+1、MIN+1。)

(如果您使用 sigaction 而不是 signal,并且如果您在信号处理程序注册中指定了 SA_SIGINFO,并且如果信令应用程序使用 sigqueue 发送一个 int 以及一个选定的实数-time signal via sival_int,然后您可以通过信号按顺序传输 1 和 0。然而,这是一个相当痛苦的用例。)

关于c - 玩转信号,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29084318/

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