当前位置: 首页 > 面试题库 >

是否存在设置超时的wait()系统调用版本?

满雨石
2023-03-14
问题内容

wait()除了使用繁忙等待或繁忙睡眠循环外,还有什么方法可以使用超时的系统调用?

我有一个fork本身的父进程和exec一个子可执行文件。然后,它等待孩子完成操作,以任何适当的方式获取其输出,然后执行进一步的处理。如果该过程在一定时间内未完成,则假定其执行超时,并执行其他操作。不幸的是,鉴于问题的性质,此超时检测是必需的。


问题答案:

没有等待超时的等待呼叫。

您可以做的是安装一个为SIGCHLD设置标志的信号处理程序,并使用select()实现超时。select()将被信号中断。

static volatile int punt;
static void sig_handler(int sig)
{
    punt = 1;
}

...

struct timeval timeout = {10,0};
int rc;

signal(SIGCHLD, sig_handler);

fork/exec stuff
//select will get interrupted by a signal

rc = select(0, NULL,NULL,NULL, &timeout ); 
if (rc == 0) {
// timed out
} else if (punt) {
    //child terminated
}

如果您还有其他信号需要处理,则需要更多的逻辑



 类似资料:
  • 问题内容: 我有一个命令行PHP脚本,该脚本使用带有foreach的数组的每个成员运行wget请求。这个wget请求有时可能会花费很长时间,因此,例如,如果它超过15秒,我希望能够设置超时以终止脚本。我禁用了PHP安全模式,并在脚本的早期尝试了set_time_limit(15),但是它会无限期地继续。 更新: 感谢Dor指出这是因为set_time_limit()不尊重system()调用。 因

  • #include <stdio.h> int main(void) { char p1[] = "Sam"; char *p2 = "Bob"; printf("p1 is %s, p2 is %s\n", p1, p2); return 0; } 技巧 使用gdb调试程序时,可以使用catch syscall [name | number]为关注的系统调用设

  • 获取系统版本信息 参数说明 字段 类型 必须? 说明 deviceId String 是 设备Id completion 是 结果回调 接口定义 Swift: RokidMobileSDK.device.getVersion(deviceId: String, completion: @escaping (_ error: Error?, _ versionInfo: RKDeviceVersio

  • 获取系统版本信息 接口说明 获取当前设备的系统版本信息 返回的消息将以Event的形式向上抛。 返回值 只表示 获取系统版本信息是否已经发送成功。 参数说明 字段 类型 必须? 说明 deviceId String 是 设备ID 示例代码: Kotlin RokidMobileSDK.device.getVersionInfo(deviceId, object : IChannelPublishC

  • 您可以在下面的问题中看到:(liquibase-lock-reasons)当Liquibase操作中断时客户端Liquibase锁定,使Liquibase处于锁定状态。 我想知道是否有一种方法可以配置Liquibase,使其从列中的日期和时间自动检测这种情况。我想如果你已经拿着锁一个小时了--你应该把它叫做过期锁。

  • 一、简介 PHPSSO可以设置禁止注册的用户名或EMAIL等。还可以整合ucenter,实现v9与uc的用户整合,实现与uc应用的同步注册、登录。还可以设置与php2008 sp4密码兼容等。 二、功能演示 1,注册配置 设置禁止注册用户名,E-MAIL等。如下图所示: 2,UCenter配置 配置好基本信息就能实现v9与uc的用户整合,实现与uc应用的同步注册、登录。如下图所示: 1,PHP20