perl fork() exec() ,子进程疯狂

2023-12-13

我在用Linux and .sh is in tcsh.

我做了一个非常基本的fork and exec,但我需要帮助来实施安全措施。

基本上我的 perl 脚本调用.sh子进程中的脚本。但当我这样做时Ctrl+c为了杀死父进程,子进程会忽略该信号。

1)如何捕捉SIGINT也适用于子进程吗?

2) 运行 .sh 脚本的子进程仍然是 xterm 屏幕上的 STDOUT。我怎样才能删除这个?我正在考虑在后台运行脚本

 exec("shell.sh args &");  

但还没有测试过,因为我需要先弄清楚如何防止孩子发疯。

3)父进程(perl脚本)不等待子进程(.sh脚本)。所以我读了很多关于孩子成为zombie???剧本完成后会发生这种情况吗?我该如何阻止它?

$pid = fork();
if($pid < 0){
    print "Failed to fork process... Exiting";
    exit(-1);
    }
elsif ($pid ==0) {
    #child process
    exec("shell.sh args");
    exit(1);
    }
else { #execute rest of parent}

但是当我执行 ctrl+c 来杀死父进程时,该信号会被子进程忽略。

该信号被发送到两个父级和子级。

$ perl -E'
   if (my $pid = fork()) {
      local $SIG{INT} = sub { say "Parent got SIGINT" };
      sleep;
      waitpid($pid, 0);
   } else {
      local $SIG{INT} = sub { say "Child got SIGINT" };
      sleep;
   }
'
^CParent got SIGINT
Child got SIGINT

如果该孩子忽略它,那是因为它开始了一个新会话或者因为它明确地忽略了它。

运行 .sh 脚本的子进程仍然是 xterm 屏幕上的 STDOUT。我怎样才能删除这个?

在调用之前,请在子进程中执行以下操作exec:

open(STDOUT, '>', '/dev/null');
open(STDERR, '>', '/dev/null');

其实我会用open3进行一些错误检查。

open(local *CHILD_STDIN,  '<', '/dev/null') or die $!;
open(local *CHILD_STDOUT, '>', '/dev/null') or die $!;
my $pid = open3(
   '<&CHILD_STDIN',
   '>&CHILD_STDOUT',
   '>&CHILD_STDOUT',
   'shell.sh', 'args',
);

父进程(perl 脚本)不会等待子进程(.sh 脚本)。所以我读了很多关于孩子变成僵尸的文章???

当父进程退出时,或者子进程在父进程退出后退出,子进程会自动被收割。

$ perl -e'
   for (1..3) {
      exec(perl => (-e => 1)) if !fork;
   }
   sleep 1;
   system("ps");
' ; ps
  PID TTY          TIME CMD
26683 pts/13   00:00:00 bash
26775 pts/13   00:00:00 perl
26776 pts/13   00:00:00 perl <defunct>       <-- zombie
26777 pts/13   00:00:00 perl <defunct>       <-- zombie
26778 pts/13   00:00:00 perl <defunct>       <-- zombie
26779 pts/13   00:00:00 ps
  PID TTY          TIME CMD
26683 pts/13   00:00:00 bash
26780 pts/13   00:00:00 ps
                                             <-- all gone

如果父母在孩子之前退出,那就没有问题。

如果父母在孩子离开后不久就退出,那就没有问题。

如果父进程在子进程退出后很长时间才退出,那么您就会想要收获它们。你可以使用wait or waitpid(可能来自SIGCHLDhandler),或者你可以使用以下命令自动收获它们$SIG{CHLD} = 'IGNORE';. See perlipc.

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

perl fork() exec() ,子进程疯狂 的相关文章

  • 大多数 Linux 系统头文件与 C++ 兼容吗?

    大多数 Linux 系统头文件 API C 兼容吗 今天我试图做这样的事情 include
  • Linux中的定时器类

    我需要一个计时器来以相对较低的分辨率执行回调 在 Linux 中实现此类 C 计时器类的最佳方法是什么 有我可以使用的库吗 如果您在框架 Glib Qt Wx 内编写 那么您已经拥有一个具有定时回调功能的事件循环 我认为情况并非如此 如果您
  • 检查一个数字是 int 还是 float

    在perl中 我想检查给定变量是否包含浮点数 为了检查我正在使用的 my Var 0 02 Floating point number if int Var Var floating point number 但上面的代码对于 0 0 不起
  • 域套接字“sendto”遇到“errno 111,连接被拒绝”

    我正在使用域套接字从另一个进程获取值 就像 A 从 B 获取值一样 它可以运行几个月 但最近 A 向 B 发送消息时偶尔会失败 出现 errno 111 连接被拒绝 我检查了B域套接字绑定文件 它是存在的 我也在另一台机器上做了一些测试 效
  • Perl 正则表达式图灵完备吗?

    我见过 Ruby 和 Perl 程序员做了一些事情复杂的代码挑战 https codegolf stackexchange com questions 3596 regex validating regex完全用正则表达式 这前瞻和后瞻 h
  • linux perf:如何解释和查找热点

    我尝试了linux perf https perf wiki kernel org index php Main Page今天很实用 但在解释其结果时遇到了困难 我习惯了 valgrind 的 callgrind 这当然是与基于采样的 pe
  • Perl 语言的目标是在运行时生成快速的程序吗?

    最近有朋友告诉我 看 Perl 从来就不是为了快而设计的 真的吗 我能找到的相关信息是来自维基百科 http en wikipedia org wiki Perl Overview 该语言旨在实用 易于使用 高效 完整 而不是美观 微小 优
  • 无法使用 wget 在 CentOS 机器上安装 oracle jdk

    我想在CentOS上安装oracle java jdk 8 我无法安装 java jdk 因为当我尝试使用命令安装 java jdk 时 root ADARSH PROD1 wget no cookies no check certific
  • Process.Start 阻塞

    我正在调用 Process Start 但它会阻止当前线程 pInfo new ProcessStartInfo C Windows notepad exe Start process mProcess new Process mProce
  • PHP 从命令行启动 gui 程序,但 apache 不启动

    首先 我阅读了有类似问题的人的一些帖子 但所有答案都没有超出导出 DISPLAY 0 0 和 xauth cookies 这是我的问题 提前感谢您的宝贵时间 我开发了一个小库 它使用 OpenGL 和 GLSL 渲染货架 过去几天我将它包装
  • 如何将目录及其子目录中的所有 PDF 文件复制到一个位置?

    如何全部复制PDF文件从目录及其子目录到单个目录 实际上还有更多的文件 并且深度有些任意 假设四个目录的最大深度是公平的 我想这些文件需要重命名 如果a pdf例如 位于多个目录中 因为我会adding https ebooks stack
  • 如何在apache 2.4.6上安装apxs模块

    我刚刚用过apt get update我的 apache 已更新为2 4 6 我想安装 apxs 来编译模块 但收到此错误 The following packages have unmet dependencies apache2 pre
  • 安装J语言的JQt IDE,出现错误

    我一直按照这里的说明进行操作 http code jsoftware com wiki System Installation Linux http code jsoftware com wiki System Installation L
  • 有谁知道在哪里定义硬件、版本和序列号。 /proc/cpuinfo 的字段?

    我想确保我的 proc cpuinfo 是准确的 目前它输出 Hardware am335xevm Revision 0000 Serial 0000000000000000 我可以在代码中的哪里更改它以给出实际值 这取决于 Linux 的
  • ubuntu:升级软件(cmake)-版本消歧(本地编译)[关闭]

    Closed 这个问题是无关 help closed questions 目前不接受答案 我的机器上安装了 cmake 2 8 0 来自 ubuntu 软件包 二进制文件放置在 usr bin cmake 中 我需要将 cmake 版本至少
  • 为arm构建WebRTC

    我想为我的带有arm926ej s处理器的小机器构建webrtc 安装 depot tools 后 我执行了以下步骤 gclient config http webrtc googlecode com svn trunk gclient s
  • SSE:跨页边界的未对齐加载和存储

    我在页面边界旁边执行未对齐加载或存储之前读过某处 例如使用 mm loadu si128 mm storeu si128内在函数 代码应首先检查整个向量 在本例中为 16 个字节 是否属于同一页 如果不属于同一页 则切换到非向量指令 我知道
  • docker容器大小远大于实际大小

    我正在尝试从中构建图像debian latest 构建后 报告的图像虚拟大小来自docker images命令为 1 917 GB 我登录查看尺寸 du sh 大小为 573 MB 我很确定这么大的尺寸通常是不可能的 这里发生了什么 如何获
  • 我的线程图像生成应用程序如何将其数据传输到 GUI?

    Mandelbrot 生成器的缓慢多精度实现 线程化 使用 POSIX 线程 Gtk 图形用户界面 我有点失落了 这是我第一次尝试编写线程程序 我实际上并没有尝试转换它的单线程版本 只是尝试实现基本框架 到目前为止它是如何工作的简要描述 M
  • ftrace:仅打印trace_printk()的输出

    是否可以只转储trace printk 输出于trace文件 我的意思是过滤掉函数跟踪器 或任何其他跟踪器 中的所有函数 一般来说 您可以在选项目录中关闭选项 sys kernel debug tracing options Use ls显

随机推荐

  • 有没有简单的方法可以在 JPanel 上画一个圆?

    我在使用 drawOval x y width height 方法时遇到问题 该方法假设 x 和 y 值代表 要绘制的椭圆形的左上角 的坐标 javadoc 我希望 x 和 y 值代表中心点一个圆圈 我该怎么做呢 谢谢 如果您提前声明了宽度
  • 通过对另外两个数组的所有元素应用二元运算来在 Swift 中创建数组

    Swift 中是否有一种通过对另外两个数组的元素应用二元运算来创建数组的简洁方法 例如 let a 1 2 3 let b 4 5 6 let c 0 lt 3 map a 0 b 0 c 5 7 9 如果你使用zip要组合元素 您可以参考
  • 精确浮点计算两个乘积的和与差

    两个乘积之差和两个乘积之和是在各种常见计算中发现的两个原语 diff of products a b c d ab cd 和 sum of products a b c d ab cd 是密切相关的伴随函数 仅部分操作数的符号不同 使用这些
  • 如何用C#发送彩信

    我需要通过 C 应用程序发送彩信 我已经发现了 2 个有趣的组件 http www winwap com http www nowsms com 有人有使用其他第三方组件的经验吗 有人可以解释一下我需要什么样的服务器来发送这些彩信吗 它是经
  • WCF ria 服务 SP1 超时已过期

    我的解决方案是 Silverlight 它使用 WCF RIA 服务 SP1 和实体框架 4 我在加载大尺寸数据时遇到问题 我收到此错误消息 System ServiceModel DomainServices Client DomainE
  • 同一 JPA 类的多个数据库支持

    我们的项目使用 MYSQL 和 Hibernate JPA用于将对象持久保存在数据库中 我们有多个具有相似代码的类 Entity Table name users class Users implement Serializable Id
  • 当出现 E_USER_DEPRECATED 级别错误时如何运行 Behat 测试

    我有一个 Symfony 2 7 表单类型 它导致了一些级别错误E USER DEPRECATED 这个错误不是来自我自己的代码 而是来自vendor symfony symfony src Symfony Bridge Doctrine
  • Python套接字模块:如何更改客户端的本地端口?

    我想使用 TCP IP 作为客户端从网络获取包 With connect TCP IP TCP PORT 我可以更改对等地址的端口 但是我改变了本地计算机的端口 编辑 我想使用带有四个端口的网卡 网卡连接到发送大量数据的测量设备 我如何查看
  • 如何从身份验证器重定向到外部身份验证端点?

    我正在编写一个网络应用程序 由于不同客户的需求 我希望拥有灵活的身份验证选项 我用的是官方的cakephp 身份验证库 但它没有 OpenID Connect 身份验证器 所以我正在滚动自己的 我遇到的问题是我无法返回修改后的Cake Ht
  • 解码 IntelliJ IDEA 文件夹名称颜色

    我有一个项目 有 4 个 Git 根 Project Project commons Project ui and Data Model 由于某些配置 我需要放置Project commons Project ui and Data Mod
  • 向 BroadcastReceiver 发送额外内容

    我有一个运行以下代码的活动 定义了时间和间隔 Intent buzzIntent new Intent getBaseContext BuzzReceiver class PendingIntent pendingIntent Pendin
  • 上周一的日期 Excel

    今天是 2013 年 2 月 27 日 星期三 我需要一个公式 该公式将返回上周一的日期 即 02 17 2013 我需要这样才能在发送电子邮件的 vba 代码中使用文件名或电子邮件主题 With oMail Uncomment the l
  • 是否可以在 Silverlight 中绑定到 lambda 表达式?

    我有一个仅绑定到集合的列表框 该集合有一个子集合 StepDatas 我想绑定到子集合的计数 但使用 WHERE 语句 我可以绑定到 ChildCollection Count 但在需要添加 lambda 表达式时会迷失方向 这是 XAML
  • 在 init 中使用属性访问 iVar?

    这是上一个问题的分支 这是不好的做法吗 使用属性来设置 iVar Designated initializer 001 id initWithName NSString newName andType NSString newType se
  • 如何计算R中沿线的两点之间的地理距离?

    Inputs 我有两个形状文件导入到 R 中 这样我最终得到了 包含公交路线的空间线数据框 包含公交车站的空间点数据帧 绘制给定路线及其停靠点如下所示 样本数据 This link包括两个可作为 zip 格式下载的 shapefile 其中
  • IF EXISTS 条件不适用于 PLSQL

    我正在尝试在条件为 TRUE 时打印文本 选择的代码工作正常 当我只运行选择代码时 它显示 403 值 但当条件存在时我必须打印一些文本 下面的代码有什么问题 BEGIN IF EXISTS SELECT CE S REGNO FROM C
  • 用于测验应用程序的 Rails 关联和数据库设计

    我正在构建这个测验应用程序 我希望它有点复杂 我想出了这个数据库模式 但我真的很困惑 对我需要什么关联和东西感到困惑 嗯 需要注意的一件事是 当创建测试时 没有关于参加该测试的考生人数的信息 所以 我创建了test questions an
  • AJAX jQuery 每 5 秒刷新一次 div

    我从一个网站获得了这段代码 并根据我的需要进行了修改 div div
  • 如何使用适当的特异性来设计没有 !important 的 :root 样式

    里面一个自定义元素因为border color在父页面上设置 我无法设置border color不求助于工作 important host player O color var color2 border color var color2
  • perl fork() exec() ,子进程疯狂

    我在用Linux and sh is in tcsh 我做了一个非常基本的fork and exec 但我需要帮助来实施安全措施 基本上我的 perl 脚本调用 sh子进程中的脚本 但当我这样做时Ctrl c为了杀死父进程 子进程会忽略该信