小编Tru*_*ueY的帖子

如何从父进程获取子进程

是否可以从shell脚本中的父进程id获取子进程ID?

我有一个使用shell脚本执行的文件,这会导致一个新的进程process1(父进程).这个过程1已经分叉的另一个进程过程2(子进程).使用脚本,我可以使用以下命令获取process1的pid :

cat /path/of/file/to/be/executed
Run Code Online (Sandbox Code Playgroud)

但是我无法获取子进程的pid.

linux shell process child-process

64
推荐指数
7
解决办法
15万
查看次数

如何检测Perl Regexp中有多少个捕获组?

我在脚本中有一堆 .我想知道它们中有多少个捕获组.更准确地说,我想知道在@ - 和@ +数组中添加了多少项,如果它们匹配之前实际在真正的匹配操作中使用它们.

一个例子:

'XXAB(CD)DE\FG\XX' =~ /(?i)x(ab)\(cd\)(?:de)\\(fg\\)x/
    and print "'@-', '@+'\n";
Run Code Online (Sandbox Code Playgroud)

在这种情况下,输出是:

'1 2 11', '15 4 14'
Run Code Online (Sandbox Code Playgroud)

所以匹配后我知道第0项是字符串的匹配部分,并且有两个捕获组表达式.在实际比赛之前是否可以知道?

我试着把注意力集中在开口支架上.所以我首先删除了'\\'模式,以便更容易检测到转义的括号.然后我删除了'\('字符串.然后来了'(?'.现在我可以计算剩余的开括号.

my $re = '(?i)x(ab)\(cd\)(?:de)\\\\(fg\\\\)x'; print "ORIG: '$re'\n";
'XXAB(CD)DE\FG\XX' =~ /$re/ and print "RE: '@-', '@+'\n";
$re =~ s/\\\\//g; print "\\\\: '$re'\n";
$re =~ s/\\\(//g; print "\\(: '$re'\n";
$re =~ s/\(\?//g; print "\\?: '$re'\n";
my $n = ($re =~ s/\(//g); print "n=$n\n";
Run Code Online (Sandbox Code Playgroud)

输出:

ORIG: '(?i)x(ab)\(cd\)(?:de)\\(fg\\)x'
RE: '1 2 11', '15 4 14'
\\: '(?i)x(ab)\(cd\)(?:de)(fg)x'
\(: '(?i)x(ab)cd\)(?:de)(fg)x'
\?: …
Run Code Online (Sandbox Code Playgroud)

regex perl

6
推荐指数
1
解决办法
335
查看次数

即使使用了不同的变量ref,为什么waitVariable调用不是独立的?

我是Tk的新手,我想知道这个问题是否是正常的Tk行为.

简而言之:我有一个Perl/Tk(Tk版本804.028)脚本,该脚本使用两个Tk :: ExecuteCommand(v1.6)小部件.这些对象有一个execute_command方法,该方法使用定义的fileevent回调来读取已执行命令的stdout,并在完成后返回.它通过waitVariable的使用来解决.但似乎两个ExecuteCommand一起启动它们只在较慢返回时才返回.完成之后我可能会立即得到更快的回报.

我做了一个小测试Perl/Tk脚本来演示这个问题:

#!/usr/bin/perl

use strict;
use warnings;
use Tk;
use Tk::ROText;

my $MAIN = new MainWindow -title => "TEST";
my $text = $MAIN->Scrolled('ROText')->pack(qw/-expand 1 -fill both/);

sub pr { # Write into ROText widget
  $text->insert('end', join '', @_); $text->yview('end');
}
pr "Tk version ", Tk->VERSION, "\n";

my @v = (100, 200);
sub doo { # Button callback
  my ($rv, $txt) = @_;
  pr "B4 wait: $txt, ref=$rv, val=", $$rv, "\n";
  $MAIN->waitVariable($rv);
  pr "Aft wait: $txt, ref=$rv, val=", …
Run Code Online (Sandbox Code Playgroud)

linux perl tk-toolkit

5
推荐指数
1
解决办法
94
查看次数

如何将变量传递给使用gcc编译的英特尔内联asm代码

我想问一下你的帮助!我有一个包含大量C源代码的项目.他们中的大多数使用gcc编译,但有些是使用英特尔编译器编译的.后来的代码在Microsoft的MASM格式中有很多内联asm代码.我想用gcc编译整个项目,并尽可能少地修改代码.所以我写了一个perl脚本,它将intel格式内联asm转换为GAS格式.(顺便说一句:我在64位Linux机器上编译为32位).

我的问题是我必须为gcc指定在内联中将asm("...")哪些C变量传递给:: [var1] "m" var1, [var2] "m" var2, ...在末尾添加行的代码.

这是一种避免这种明确规范的方法吗?

我的尝试:

虚拟测试C代码简单地用源char数组的元素替换目标char数组的4个字符(我知道这不是最好的方法.它只是一个愚蠢的例子).

在原始函数中没有明确的规范,但它可以使用英特尔编译器进行编译(对我来说很遗憾,但我没有对此进行测试,但它应该与英特尔编译器一起使用,因为我根据实际代码进行了编译).LOOP即使在同一个C源文件中,标签也会被使用很多次.

#include <stdio.h>

void cp(char *pSrc, char *pDst) {
    __asm
    { 
        mov esi, pSrc
        mov edi, pDst
        mov edx, 4
LOOP:
        mov al, [esi]
        mov [edi], al
        inc esi
        inc edi
        dec edx
        jnz LOOP
    };
}   

int main() {
    char src[] = "abcd";
    char dst[] = "ABCD";

    cp(src, dst);
    printf("SRC: '%s', DST: '%s'\n", src, dst);
    return 0;
}
Run Code Online (Sandbox Code Playgroud)

结果是: …

c assembly gcc

4
推荐指数
1
解决办法
5505
查看次数

标签 统计

linux ×2

perl ×2

assembly ×1

c ×1

child-process ×1

gcc ×1

process ×1

regex ×1

shell ×1

tk-toolkit ×1