如何使用 C 中的 UNIX 信号将给定的字符串发送给程序的参数给另一个程序?

How can you send a string given has argument to a program to another program using UNIX signals in C?

这是我的待办事项列表:


我只能使用以下功能:


我已经完成了简单的部分:获取服务器 PID。现在我完全迷失了,因为找不到与此练习相关的任何内容。

我做了以下事情:

  1. 在客户端,我完成了这个函数来一点一点地发送一个字符:(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 秒,它会显示一条错误消息。


  1. 在服务器端,我创建了这个结构并声明它有一个全局变量以便访问数据,因为我不能将它作为参数传递:

    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,如果您有任何提示,请随时发送,我们总是有改进的余地)