如何使用 C 中的 UNIX 信号将给定的字符串发送给程序的参数给另一个程序?
How can you send a string given has argument to a program to another program using UNIX signals in C?
这是我的待办事项列表:
- 您必须以 客户端 和 服务器.
的形式创建一个通信程序
- 服务器必须先启动,启动后必须显示其PID。
- 客户端将作为参数:服务器 PID 和应发送的 string。
- 客户端必须将作为参数传递给服务器的字符串进行通信。收到字符串后,服务器必须显示它。
- 程序之间的通信应该仅使用UNIX信号完成。
- 您的服务器应该能够连续接收来自多个客户端的字符串,而无需重新启动。
- 您只能使用两个信号 SIGUSR1 和 SIGUSR2.
我只能使用以下功能:
- 信号 • sigemptyset • sigaddset • sigaction • kill • getpid
- write • malloc • free • pause • sleep • usleep • exit
我已经完成了简单的部分:获取服务器 PID。现在我完全迷失了,因为找不到与此练习相关的任何内容。
我做了以下事情:
在客户端,我完成了这个函数来一点一点地发送一个字符:(SIGUSR1 是 1,SIGUSR2 是 0)
int send_char_to_server(unsigned char c, int server_pid)
{
unsigned char bit;
bit = 0b10000000;
while (bit)
{
if (bit & c)
{
if (kill(server_pid, SIGUSR1) == -1)
return (0);
}
else
{
if (kill(server_pid, SIGUSR2) == -1)
return (0);
}
bit >>= 1;
usleep(100);
}
return (1);
}
我还实现了一个反馈处理程序,它只接收 SIGUSR1 并正确退出,如果获得反馈的时间超过 5 秒,它会显示一条错误消息。
在服务器端,我创建了这个结构并声明它有一个全局变量以便访问数据,因为我不能将它作为参数传递:
typedef struct s_data
{
char buffer[MAX_CHARS];
unsigned char c;
int index;
int client_pid;
} t_data;
而且我还完成了 2 个函数来处理两个信号(SIGUSR1 和 SIGUSR2):
void bit_on_handler(int sig, siginfo_t *info, void *ucontext)
{
unsigned char bit;
(void)ucontext;
(void)sig;
bit = 0b10000000;
g_data.c |= bit >> g_data.index;
g_data.index++;
if (!g_data.client_pid)
g_data.client_pid = info->si_pid;
}
void bit_off_handler(int sig, siginfo_t *info, void *ucontext)
{
(void)ucontext;
(void)sig;
g_data.index++;
if (!g_data.client_pid)
g_data.client_pid = info->si_pid;
}
因为我的服务器不应该在收到消息后退出我已经完成了 loop_handler 函数,将接收到的字符(8 个信号序列)添加到我的缓冲区并将所需的值重置回 0 .
void loop_handler(void)
{
int i;
i = 0;
while (1)
{
pause();
if (g_data.index == 8)
{
while (g_data.buffer[i] && i < MAX_CHARS)
i++;
if (i == MAX_CHARS)
error_handler(STR_TOO_LONG);
if (g_data.c == 0)
null_handler(i);
g_data.buffer[i] = g_data.c;
g_data.c = 0;
g_data.index = 0;
i = 0;
}
}
}
My null_handler() 只是显示字符串,将 SIGUSR1 信号发送到客户端,将 client_pid 设置回 0 并且 缓冲区被清空。
(这是我的第一个post,如果您有任何提示,请随时发送,我们总是有改进的余地)
这是我的待办事项列表:
- 您必须以 客户端 和 服务器. 的形式创建一个通信程序
- 服务器必须先启动,启动后必须显示其PID。
- 客户端将作为参数:服务器 PID 和应发送的 string。
- 客户端必须将作为参数传递给服务器的字符串进行通信。收到字符串后,服务器必须显示它。
- 程序之间的通信应该仅使用UNIX信号完成。
- 您的服务器应该能够连续接收来自多个客户端的字符串,而无需重新启动。
- 您只能使用两个信号 SIGUSR1 和 SIGUSR2.
我只能使用以下功能:
- 信号 • sigemptyset • sigaddset • sigaction • kill • getpid
- write • malloc • free • pause • sleep • usleep • exit
我已经完成了简单的部分:获取服务器 PID。现在我完全迷失了,因为找不到与此练习相关的任何内容。
我做了以下事情:
在客户端,我完成了这个函数来一点一点地发送一个字符:(SIGUSR1 是 1,SIGUSR2 是 0)
int send_char_to_server(unsigned char c, int server_pid) { unsigned char bit; bit = 0b10000000; while (bit) { if (bit & c) { if (kill(server_pid, SIGUSR1) == -1) return (0); } else { if (kill(server_pid, SIGUSR2) == -1) return (0); } bit >>= 1; usleep(100); } return (1); }
我还实现了一个反馈处理程序,它只接收 SIGUSR1 并正确退出,如果获得反馈的时间超过 5 秒,它会显示一条错误消息。
在服务器端,我创建了这个结构并声明它有一个全局变量以便访问数据,因为我不能将它作为参数传递:
typedef struct s_data { char buffer[MAX_CHARS]; unsigned char c; int index; int client_pid; } t_data;
而且我还完成了 2 个函数来处理两个信号(SIGUSR1 和 SIGUSR2):
void bit_on_handler(int sig, siginfo_t *info, void *ucontext) { unsigned char bit; (void)ucontext; (void)sig; bit = 0b10000000; g_data.c |= bit >> g_data.index; g_data.index++; if (!g_data.client_pid) g_data.client_pid = info->si_pid; } void bit_off_handler(int sig, siginfo_t *info, void *ucontext) { (void)ucontext; (void)sig; g_data.index++; if (!g_data.client_pid) g_data.client_pid = info->si_pid; }
因为我的服务器不应该在收到消息后退出我已经完成了 loop_handler 函数,将接收到的字符(8 个信号序列)添加到我的缓冲区并将所需的值重置回 0 .
void loop_handler(void) { int i; i = 0; while (1) { pause(); if (g_data.index == 8) { while (g_data.buffer[i] && i < MAX_CHARS) i++; if (i == MAX_CHARS) error_handler(STR_TOO_LONG); if (g_data.c == 0) null_handler(i); g_data.buffer[i] = g_data.c; g_data.c = 0; g_data.index = 0; i = 0; } } }
My null_handler() 只是显示字符串,将 SIGUSR1 信号发送到客户端,将 client_pid 设置回 0 并且 缓冲区被清空。
(这是我的第一个post,如果您有任何提示,请随时发送,我们总是有改进的余地)