是否可以从shell脚本中的父进程id获取子进程ID?
我有一个使用shell脚本执行的文件,这会导致一个新的进程process1(父进程).这个过程1已经分叉的另一个进程过程2(子进程).使用脚本,我可以使用以下命令获取process1的pid :
cat /path/of/file/to/be/executed
Run Code Online (Sandbox Code Playgroud)
但是我无法获取子进程的pid.
我在脚本中有一堆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) 我是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) 我想问一下你的帮助!我有一个包含大量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)
结果是: …