当我的程序收到 SIGUSR1 信号以从暂停()继续程序时,它不断崩溃

问题描述 投票:0回答:1

这是我正在开发的源代码。我正在尝试使用信号进行字符串传输。我不想增加等待时间,所以我使用了pause()函数。当客户端发送信号时,它会暂停并等待服务器完成处理。然而,当反馈到来并且程序崩溃时,客户端不会继续。程序崩溃,退出代码为 138。我是否在暂停()方面犯了错误,或者这是一个不同的问题?


#define _DEFAULT_SOURCE
#define _XOPEN_SOURCE 700
#define WAIT_TIME 100
#include "libft.h"
#include "ft_printf.h"
#include <unistd.h>
#include <signal.h>

void    send_signal(int pid, char *str)
{
    int i;

    while (*str)
    {
        i = (sizeof(char) * 8) - 1;
        while (i >= 0)
        {
            if (*str & (1 << i))
                kill(pid, SIGUSR1);
            else
                kill(pid, SIGUSR2);
            pause();
            //ft_printf("worked");
            i--;
        }
        str++;
    }
}

int main(int argc, char **argv)
{
    int     i;
    int     pid;

    i = 0;
    if (argc != 3)
    {
        ft_printf("Error: Wrong number of arguments.");
        exit(EXIT_FAILURE);
    }
    while (argv[1][i])
    {
        if (!ft_isdigit(argv[1][i++]))
        {
            ft_printf("Error: Invalid process ID.");
            exit(EXIT_FAILURE);
        }
    }
    pid = ft_atoi(argv[1]);
    ft_printf("%s, %d\n", argv[2], getpid());
    send_signal(pid, argv[2]);
    return (0);
}
#define _DEFAULT_SOURCE
#define _XOPEN_SOURCE 700
#define WAIT_TIME 100
#include "libft.h"
#include "ft_printf.h"
#include <unistd.h>
#include <signal.h>

void    send_signal(int pid, char *str)
{
    int i;

    while (*str)
    {
        i = (sizeof(char) * 8) - 1;
        while (i >= 0)
        {
            if (*str & (1 << i))
                kill(pid, SIGUSR1);
            else
                kill(pid, SIGUSR2);
            pause();
            //ft_printf("worked");
            i--;
        }
        str++;
    }
}

int main(int argc, char **argv)
{
    int     i;
    int     pid;

    i = 0;
    if (argc != 3)
    {
        ft_printf("Error: Wrong number of arguments.");
        exit(EXIT_FAILURE);
    }
    while (argv[1][i])
    {
        if (!ft_isdigit(argv[1][i++]))
        {
            ft_printf("Error: Invalid process ID.");
            exit(EXIT_FAILURE);
        }
    }
    pid = ft_atoi(argv[1]);
    ft_printf("%s, %d\n", argv[2], getpid());
    send_signal(pid, argv[2]);
    return (0);
}
c signals
1个回答
1
投票

pause
函数不会自动为您处理信号。如果您在
pause
函数运行时收到尚未处理的信号,您的程序仍将终止。

您需要至少为您期望接收的信号显式添加信号处理程序。在您的特定情况下,处理程序不需要执行任何操作。然后,当信号处理程序返回时,这将允许

pause
函数返回。

© www.soinside.com 2019 - 2024. All rights reserved.