这是我正在编写的源代码.我正在try 使用信号进行字符串传输.我不想增加等待时间,所以我使用了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);
}

推荐答案

pause功能不会自动为您处理信号.如果您在运行pause函数时收到未处理的信号,您的程序仍将终止(或者更准确地说,该信号将具有其默认效果).

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

C++相关问答推荐

问关于C中的指针和数组

如何避免重新分配指针数组时,我们从一开始就不知道确切的大小

Mise()在虚拟内存中做什么?

C语言编译阶段与翻译阶段的关系

如何在ASM中访问C struct 成员

GCC不顾-fno-Builtin-SINCOS旗帜向SINCOS发出呼唤

如何在STM8项目中导入STM8S/A标准外设库(ST VisualDeveloper)?

如何在C++中安全地进行浮点运算

将数组插入数组

如何在双向表中实现线程安全,每个条目仅使用4位,同时避免任何全局锁?

不使用任何预定义的C函数进行逐位运算

使用正则表达式获取字符串中标记的开始和结束

将非连续物理内存映射到用户空间

C语言中的指针和多维数组

使用 c 中的 write() 函数将非 ASCII 字符写入标准输出

GDB 跳过动态加载器代码

添加/删除链表中的第一个元素

获取 struct 中匿名 struct 的大小

如何确定 C 程序中的可用堆内存

定义 int a = 0, b = a++, c = a++;在 C 中定义了行为吗?