c / 中断系统调用 / fork 与线程

2023-12-01

我发现了线程实现的一个问题,这对我来说很奇怪。也许你们中的一些人可以向我解释一下,那就太好了。

我正在开发类似代理的程序,它是一个程序(在不同的机器上运行),通过 eth0 接收数据包并通过 ath0 (无线)将其发送到另一台正在执行完全相同操作的机器。实际上我根本不确定是什么导致了我的问题,那是因为我对一切都很陌生,linux和c编程。

我启动两个线程,

  • 一个正在 eth0 上侦听(套接字)传入数据包,并通过 ath0(也是套接字)将其发送出去
  • 另一个线程正在监听 ath0 并通过 eth0 发送。

如果我使用线程,我会收到这样的错误:

sh-2.05b# ./socketex 
Failed to send network header packet.
: Interrupted system call

如果我使用 fork(),程序将按预期工作。 有人可以向我解释这种行为吗?

只是为了展示发送者的实现,这里有它的代码片段:

while(keep_going) {
    memset(&buffer[0], '\0', sizeof(buffer));

    recvlen = recvfrom(sockfd_in, buffer, BUFLEN, 0, (struct sockaddr *) &incoming, &ilen);
    if(recvlen < 0) {
        perror("something went wrong / incoming\n");
        exit(-1);
    }

    strcpy(msg, buffer);
    buflen = strlen(msg);

    sentlen = ath_sendto(sfd, &btpinfo, &addrnwh, &nwh,  buflen, msg, &selpv2, &depv);

    if(sentlen == E_ERR) {
        perror("Failed to send network header packet.\n");
        exit(-1);
    }
}

UPDATE:我的主文件,启动线程或进程(fork)

int main(void) {

port_config pConfig;

memset(&pConfig, 0, sizeof(pConfig));
pConfig.inPort = 2002;
pConfig.outPort = 2003;

pid_t retval = fork();

if(retval == 0) {
    // child process
    pc2wsuThread((void *) &pConfig);
} else if (retval < 0) {
    perror("fork not successful\n");
} else {
    // parent process
    wsu2pcThread((void *) &pConfig);
}

/*
wint8 rc1, rc2 = 0;

pthread_t pc2wsu;
pthread_t wsu2pc;

rc1 = pthread_create(&pc2wsu, NULL, pc2wsuThread, (void *) &pConfig);
rc2 = pthread_create(&wsu2pc, NULL, wsu2pcThread, (void *) &pConfig);

if(rc1) {
    printf("error: pthread_create() is %d\n", rc1);
    return(-1);
}

if(rc2) {
    printf("error: pthread_create() is %d\n", rc2);
    return(-1);
}

pthread_join(pc2wsu, NULL);
pthread_join(wsu2pc, NULL);
*/
return 0;
}

有帮助吗?

update2011年5月30日

-sh-2.05b# ./wsuproxy 192.168.1.100
mgmtsrvc
mgmtsrvc
Failed to send network header packet.
: Interrupted system call
13.254158,75.165482,DATAAAAAAmgmtsrvc
mgmtsrvc
mgmtsrvc

仍然得到中断的系统调用,如上所示。 我屏蔽了所有信号,如下所示:

sigset_t signal_mask;
sigfillset(&signal_mask);
sigprocmask(SIG_BLOCK, &signal_mask, NULL);

这两个线程在相同的接口上工作,但在不同的端口上。问题似乎仍然出现在同一个地方(请在第一个代码片段中找到它)。我无法更进一步,并且对如何解决该问题没有足够的了解。也许你们中的一些人可以再次帮助我。

提前致谢。


EINTR本身并不表示错误。这意味着您的进程在处于状态时收到了信号sendto系统调用,并且该系统调用尚未发送任何数据(这很重要)。

在这种情况下,您可以重试发送,但最好找出导致中断的信号。如果这是可重现的,请尝试使用strace.

如果您是发出信号的人,那么您知道该怎么做:-)

请注意,在 Linux 上,您可以收到EINTR on sendto(以及一些其他功能)即使您自己没有安装处理程序。如果出现以下情况,就会发生这种情况:

  • 进程被停止(例如通过 SIGSTOP)并重新启动(通过 SIGCONT)
  • 您已在套接字上设置发送超时(通过 SO_SNDTIMEO)
  • See the signal(7)手册页(位于最底部)了解更多详细信息。

    因此,如果您“暂停”您的服务(或其他),那么EINTR是预期的,您应该重新启动呼叫。

    本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

    c / 中断系统调用 / fork 与线程 的相关文章

    • java中应用程序的CPU核心数和线程数之间有什么关系?

      我是java新手多线程编程 我想到的问题是 根据我的数量 我可以运行多少个线程CPU核心数 如果我运行的线程超过CPU核心数机器运行应用程序会产生开销吗 例如 当我们有一台服务器计算机 其中有一个运行 2 个线程 主线程 开发人员线程 的服
    • 使用和重载基类的模板成员函数?

      下面 构造Y超载X的成员函数f 两个重载都是模板函数 但采用不同的参数 typename and int 明确指定 struct X template
    • 错误:调用 Configuration.BuildSessionFactory() 时“无法同时获取多个包”;

      升级到 NHibernate 2 1 后 我们收到此错误 QueryException Cannot simultaneously fetch multiple bags NHibernate Loader BasicLoader Post
    • main() 是用户定义函数吗? [复制]

      这个问题在这里已经有答案了 程序员does定义内部发生的事情main 毕竟 那么 它应该被视为用户定义的函数吗 C 标准没有用户定义函数的概念 相反 它有一个概念库函数 main 不是库函数 但是 该标准还对其签名提出了一些要求 并且不得重
    • 处理可选依赖项 (C#)

      我们有一个可以选择与 TFS 集成的应用程序 但是由于集成是可选的 所以我显然不希望所有机器都需要 TFS 程序集作为要求 我应该怎么办 我是否可以在主程序集中引用 TFS 库 并确保在使用 TFS 集成时仅引用 TFS 相关对象 或者 更
    • Unix 编程。不确定如何使用 passwd 结构

      我做了一些研究 但仍在努力解决passwd结构 http www opengroup org onlinepubs 000095399 basedefs pwd h html http www opengroup org onlinepub
    • 如何为 IAsyncOperation 指定回调方法

      是否可以指定一个方法完成后调用async手术 平台 C Windows Phone 8 我需要实现非阻塞方法来异步发送UDP数据包 他们有我的方法 onWriteComplete int errorCode 操作完成时回调 这是我尝试过的
    • 为什么 VS 2008 在 Intellisense 中不显示 String 类的扩展方法

      由于 String 实现了IEnumerable
    • 编译器错误? g++ 允许可变大小的静态数组,除非函数是模板化的

      下面的代码演示了我无法解释的 gcc 4 6 2 的行为 第一个函数声明一个 vec t 类型的静态数组 其中 vec t 是 unsigned char 的 typedef 别名 第二个函数是相同的 只是 vect t 的类型是模板参数
    • Linux 相当于 GetCommandLine 和 CommandLineToArgv?

      我想知道是否有一些 API 可以在 Linux 上获取当前进程的命令行参数 我想我是非常不清楚的 该问题的真正目的是通过命令行参数传递 unicode 文件名 从文件中读取 proc self cmdline 例如 wallyk zf od
    • 来自“void *”的dynamic_cast

      根据this https stackoverflow com questions 3155277 cannot dynamic cast void to templated class void 没有 RTTI 信息 因此从void 不合法
    • 在 Silverlight 中调用 WCF 服务时使用 Observable.FromEvent

      我正在尝试使用 NET Reactive Framework 来简化对我正在编写的 Silverlight 3 应用程序使用的 WCF 服务的一些异步调用 问题是我很难找到一种有效的方式来构建我的代码 毫无疑问 部分问题是了解 Reacti
    • 网页上的富文本编辑器

      我正在尝试在我的网页中添加一个富文本编辑器 用户可以在其中撰写评论并格式化他们所写的内容 类似于我们在此网站上撰写帖子的编辑器 谁能指出我关于此的正确方向 任何可以帮助我构建这样一个组件的教程 我还想要一个免费的产品 忘记之前提到 类似的东
    • Doxygen 支持 C++11 模板别名(“using”语法)吗?

      我正在使用 doxygen 1 7 1 为一些 C 11 代码生成文档 它似乎忽略了我的模板别名 为了清楚起见 下面是模板别名的示例 template
    • MVC - 从视图调用控制器

      我是 MVC 新手 我正在使用 MVC 开发一个 Web 应用程序 该应用程序仅包含一个页面 所以在这个视图中我必须填充多个数据 假设应用程序是 新闻提要 应用程序 我需要填充最近的新闻 您喜欢的新闻 您朋友推荐的新闻等 那么我应该从视图到
    • 如何在C++中动态调用函数

      除了 boost Bind Function 之外 我如何在 C 中动态调用函数 PHP has obj new MyObject function doSomething obj gt function Objective C 有 MyO
    • 在 Outlook 中检索当前电子邮件正文

      在我的 Outlook 插件中 我想在功能区上添加一个按钮 因此当用户单击此按钮时 我想检索当前选定的电子邮件的正文 我有此代码 但它只检索收件箱中的第一封电子邮件 因为索引为 1 Microsoft Office Interop Outl
    • 用于 DSP 的快速 2D 卷积

      我想实现一些图像处理算法 这些算法旨在运行在小猎犬板 http en wikipedia org wiki Beagle Board 这些算法广泛使用卷积 我正在尝试为 2D 卷积找到一个好的 C 实现 可能使用快速傅里叶变换 我还希望该算
    • C++ 中的 golang 风格“延迟”[重复]

      这个问题在这里已经有答案了 我正在阅读有关 go 语言的defer http blog golang org defer panic and recover陈述 它允许您指定函数结束时要执行的操作 例如 如果您有一个文件指针或资源 则只需指
    • 使用 CRTP 模式时继承中的不明确方法

      我正在定义一个DoubleWrapper类继承自两个 CRTP 基类 Ratioable and Divable 两者都定义operator 具有不同的签名 T operator double const scalar const retu

    随机推荐

    • 在 C 语言中获取用户输入的最佳方式是什么?

      很多人都说scanf不应该用在 更严肃的程序 中 与getline 我开始迷失 如果我遇到的每个输入功能都说我不应该使用其中任何一个 那么我应该使用什么 是否有一种更 标准 的方式来获取我不知道的输入 一般来说 fgets 被认为是一个不错
    • ARCore:模型显示在脸部上方

      我正在尝试遵循以下指南 了解如何为以下内容创建自定义 3D 模型 增强面孔但由于某种原因 我的模型确实超出了我的想象 我的模型也在 0 x y 和 z 轴上 对于我正在使用的代码这个示例项目由谷歌提供 中心点 检查 a 的位置在哪里pivo
    • 两个如何用python水平合并多个.csv文件?

      我有几个 csv 文件 10 需要将它们水平合并到一个文件中 每个文件具有相同的行数 300 和 4 个标题行 这些标题行不一定相同 但不应合并 仅从第一个 csv 文件获取标题行 行中的标记以逗号分隔 中间没有空格 作为一个Python菜
    • Struts2 约定插件在 Tomcat 8.x 上损坏 - org.apache.struts2.convention.PackageBasedActionConfigBuilder.error 无法扫描命名包

      我正在使用 Struts 2 3 16 以及相同版本的约定插件 该应用程序在 Tomcat 7 0 35 上运行良好 但在 Tomcat 8 0 3 0 上失败并出现以下异常 11 May 2014 06 26 01 421 WARNING
    • 使用包含过滤器在环回中连接两个模型

      我有两个模型 Purchase 和 Products productId 对于这两个模型来说是通用的 我需要从产品模型中找到purchaseId 的productDetails 因此 我在购买模型中创建了一个自定义端点 称为 getProd
    • R 中的多级饼图

      我想制作一个非常简单的多层饼图 如下所示 正如你所看到的 我已经了解 sunburstR 但 因为我正在寻找一个更简单的解决方案 这并不完全应该是这样 此外 我更希望能够轻松地将其导出为矢量图形 第二种解决方案 使用 ggplot2 在极坐
    • HashSet 的最大大小

      所以基本上我生成随机 10000 个 IP 地址 我想存储在 HashSet 中找到的所有 IP 地址 但根据我的计算 找到了大约 6000 个 IP 地址 但在 HashSet 中只存储了 700 个 IP 地址 HashSet在存储St
    • 获取DataTable中值的索引

      我需要获取数据表中值的索引 我正在努力变得那样 SqlDataAdapter da new SqlDataAdapter SELECT MessageID SenderID MessageContent FROM Messages WHER
    • JavaScript 数组拼接

      StackOverflow 社区您好 目前我完全被我的代码困住了 尝试了不同的方法来从数组中删除选择的值 我知道我必须使用 splice 来实现它 但由于某种原因它没有做我想要它做的事情 由于我的英文不太好 这个网页很难解释 所以我做了一些
    • Python 中解包参数列表/字典案例中的关键字参数

      对于 python 我可以使用如下解包参数 def hello x y z print x x print y y print z z hello 1 1 2 3 a 1 b 2 c 3 hello 1 1 2 3 a 1 b 2 c 3
    • “rep”函数中的“each”参数有多个值吗?

      如何为R中 rep 函数中的 each 参数分配多个值 一个简单的示例 其中向量中的每个值连续重复 3 次 a lt seq 2 6 2 rep a each 3 但是 如果我在 each 参数中添加多个值以更改每个值的重复次数 则它无法正
    • 删除包含特定单词的列

      我有一个包含 313 列 约 52000 行信息的数据集 我需要删除包含 权限 一词的每一列 我尝试过 grep 和 dplyr 但我似乎无法让它工作 我已经读过该文件 testSet lt read csv Users data csv
    • 手机休眠时的 BroadcastReceiver 行为

      我不太确定 a 的行为是什么BroadcastReceiver 在清单中注册并通过以下方式启用PackageManager 是手机休眠时 出现这个问题是因为我需要一个注册广播的接收器WifiManager
    • 为什么此 C# 代码会抛出错误:使用未分配的局部变量“n”

      在 MSDN 上 此代码发布于https learn microsoft com en us dotnet csharp language reference keywords try catch我无法理解为什么它会抛出错误 使用未分配的局
    • IEEE-754:有理数集的基数

      有理数集的基数是多少 这些有理数具有与单精度 IEEE 754 兼容的浮点格式的精确表示 有 2139095039 个有限正浮点数 有尽可能多的有限负浮点数 您想要将 0 0 和 0 0 作为两项还是一项包含在内 根据答案 总数为 2 21
    • 比较 2 个数组的元素并返回计数 JavaScript

      我有 2 个数组 需要相互比较并返回相同的计数 示例 将 array1 abcd 与 array2 adce 进行比较 返回值为 2 1 因为 a 和 c 都处于相同位置 而 d 处于错误位置 function var index 0 fo
    • jQuery 形式的 .change 函数存在问题

      我正在编写一个脚本 该脚本根据选择菜单中的用户输入更改跨度文本值 我当前的脚本有问题 如何解决此问题 以便当我单击 结束日期 然后再次单击 开始日期 时 它会在范围中显示 开始日期 Demo http jsfiddle net 197ncb
    • 将“IntStream”打印为“String”的最简单方法

      使用 Java 8 我可以轻松地处理String 或任何CharSequence as an IntStream使用任一chars or the codePoints method IntStream chars Hello world c
    • 另一个变量版本最高的总和(整个数据中没有最大版本)

      我正在努力让这项措施发挥作用 我想要一个度量 仅对每栋房屋的最大版本的值进行求和 因此 请遵循此示例表 House Id Version Id Value 1 1 1000
    • c / 中断系统调用 / fork 与线程

      我发现了线程实现的一个问题 这对我来说很奇怪 也许你们中的一些人可以向我解释一下 那就太好了 我正在开发类似代理的程序 它是一个程序 在不同的机器上运行 通过 eth0 接收数据包并通过 ath0 无线 将其发送到另一台正在执行完全相同操作