我目前正在研究一个关于信号的项目,基本上我有一个客户端和一个服务器,服务器发出一个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");
}
}
因此,在一天结束时,它所做的是通过char显示客户端中二进制char中给出的单词。
我怎么能用它来显示我在客户端输入的字符串?
谢谢你们,如果你需要任何精确,请告诉我。
编辑:尽管我很想知道其他信号,遗憾的是,我对这个项目仅限于这些。答案 0 :(得分:0)
使用信号传输二进制数据既缓慢又低效。 如果您仍然坚持这样做,则必须将这些位打包成字节 而不是打印“1”或“0”
这是你可能采取的一种方式。
#define MAX_BYTES 64
static int current_bit=0,current_byte=0;
static char byte=0,output_bytes[MAX_BYTES];
void my_sig(int param){
char *src;
char *dest;
if (param == SIGUSR1)
{
byte &= ~(128 >> current_bit);
}
if (param == SIGUSR2)
{
byte |= (128 >> current_bit);
}
current_bit++;
if(current_bit > 7){
current_bit = 0;
output_byte[current_byte] = byte;
byte = 0;
if(current_byte < (MAX_BYTES-1)){
current_byte++;
}
}
}
这是糟糕的代码。但无论如何,发送信号数据的想法并不好。
输出将在output_byte数组中。
答案 1 :(得分:0)
信号在很大程度上不适合此任务,因为根据时间安排可能会丢失信息。
标准信号将丢失位和排序。这些信号被单独命名(例如,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和一个选定的通过sival_int
实时信号,然后你可以通过信号顺序传输1和0。然而,这是一个折磨的用例。)