我正在开发一个具有进程监视功能的C++应用程序,它根据这个模型监视状态变化:http://www.macdesign.net/capella/it4813/images/stallings-Linux_process-thread_states-f4.18.png
但是,由于/ proc/pid/status将"就绪"和"执行"状态组合成"运行"状态,我不知道如何找出进程实际处于哪些状态.任何人都可以提供有关我如何发现这一点的任何建议?
这可能是一个愚蠢的问题,但我找不到一个在动态调用的PL/SQL过程中传递"DATE"类型的解决方案.我需要的是在被调用的proc中传递日期和时间部分:
create or replace
PROCEDURE DATE_TIME_TEST ( dte_Date_IN IN DATE )
IS
vch_SQL_Stmnt VARCHAR2(2000);
BEGIN
DBMS_OUTPUT.PUT_LINE('Date is :'||TO_CHAR(dte_Date_IN, 'DD-Mon-YYYY HH24:MI:SS'));
END;
/
declare
v_sql varchar2(2000);
begin
v_sql := 'begin DATE_TIME_TEST( dte_Date_IN => '''||
sysdate || ''''|| '); end;';
execute immediate v_sql;
end;
/
Run Code Online (Sandbox Code Playgroud)
这里的输出是 - 日期是:2013年8月27日00:00:00.
我希望它是 - 日期是:2013年8月27日13:01:09
我在显示套接字的/ proc中找到此信息:
$ cat /proc/net/sockstat
sockets: used 8278
TCP: inuse 1090 orphan 2 tw 18 alloc 1380 mem 851
UDP: inuse 6574
RAW: inuse 1
FRAG: inuse 0 memory 0
Run Code Online (Sandbox Code Playgroud)
您能帮我找出这些值的含义吗?这些值是否足够可靠,还是我需要在其他地方搜索?
这些其他方法可以找到有关Linux中TCP / UDP连接的信息吗?
我想用一些方法编写小类,它们实际上属于其他类,所以如何在其他类中定义现有副本的方法.我相信这是我不明白的元编程魔法师.
class Foo
def initialize
# with blocks, I would just pass block, but this is methods
# so this won't work
Bar.class_eval(perform)
Bar.class_eval(process)
Bar.class_eval(save)
end
def perform
1+1
end
def process
# some code
end
def save
# some code
end
end
class Bar; end
foo = Foo.new
foo.perform
#=> 2
Bar.test
#=> 1
Run Code Online (Sandbox Code Playgroud)
为什么我需要这个?我正在研究gem,它只需要三个方法.在初始化时(可能隐藏在父类中),它会将此方法传递给不同的类.我可以使用块来制作它,但是使用方法它会更清洁.
PS:这就像从一个类复制方法到另一个类
PSS:或者...如何将方法转换为proc,所以我可以将它传递给class_eval
我今天早上发现proc.new在类初始化方法中工作,但不是lambda.具体来说,我的意思是:
class TestClass
attr_reader :proc, :lambda
def initialize
@proc = Proc.new {puts "Hello from Proc"}
@lambda = lambda {puts "Hello from lambda"}
end
end
c = TestClass.new
c.proc.call
c.lambda.call
Run Code Online (Sandbox Code Playgroud)
在上面的例子中,结果将是:
Hello from Proc
test.rb:14:in `<main>': undefined method `call' for nil:NilClass (NoMethodError)
Run Code Online (Sandbox Code Playgroud)
这是为什么?
谢谢!
如何在同一方法中产生两个不同的块
示例代码:
def by_two(n,a)
yield n
yield a
end
proc1 = proc {|x| p x * 2}
proc2 = proc {|x| x + 100}
by_two(10, 300, &proc1, &proc2)
Run Code Online (Sandbox Code Playgroud)
错误是这样的 -
main.rb:7: syntax error, unexpected ',', expecting ')'
by_two(10, 300, &proc1, &proc2)
Run Code Online (Sandbox Code Playgroud)
有什么建议在哪里,哪些是错的?谢谢
如何将“ inode”列中的值绑定/proc/net/tcp到中的文件/proc/<pid>/fd/?
我的印象是,inodeTCP 中的列具有套接字的inode的十进制表示形式,但事实并非如此。
例如,如果我运行,则会telnet localhost 80看到以下内容(telnet为pid 9021)。
/proc/net/tcp 包含
sl local_address rem_address st tx_queue rx_queue tr tm->when retrnsmt uid timeout inode
23: 0100007F:CE2A 0100007F:0050 01 00000000:00000000 00:00000000 00000000 1000 0 361556 1 00000000 20 0 0 10 -1
Run Code Online (Sandbox Code Playgroud)
这让我认为连接到127.0.0.1:80的套接字的inode是361556。但是如果我运行ls --inode -alh /proc/9021/fd,我会看到
349886 lrwx------ 1 me me 64 Dec 26 10:51 3 -> socket:[361556]
Run Code Online (Sandbox Code Playgroud)
索引节点为349886,与tcp表的索引节点列中的值不同:361556。但是链接目标似乎具有正确的名称。同样,stat /proc/9021/3显示:
File: ‘/proc/9021/fd/3’ -> ‘socket:[361556]’
Size: 64 Blocks: 0 IO Block: 1024 …Run Code Online (Sandbox Code Playgroud) 我说的是:
struct {
struct spinlock lock;
struct proc proc[NPROC];
} ptable;
Run Code Online (Sandbox Code Playgroud)
它驻留在 proc.c 文件中。
有人可以解释它在哪里初始化吗?因为,在 proc.c 中,我从未见过向其中添加了某些东西(进程)。
更准确地说,假设我正在查看调度程序代码:
void
scheduler(void)
{
struct proc *p;
for(;;){
// Enable interrupts on this processor.
sti();
// Loop over process table looking for process to run.
acquire(&ptable.lock);
for(p = ptable.proc; p < &ptable.proc[NPROC]; p++){
if(p?>state != RUNNABLE)
continue;
// Switch to chosen process. It is the process’s job
// to release ptable.lock and then reacquire it
// before jumping back to us.
proc = …Run Code Online (Sandbox Code Playgroud) 我对 Linux 操作系统编程世界相当陌生。我正在开发一个控制 Intel CPU 的项目(涡轮增压、超线程、最小和最大缩放频率以解决其他用户的问题)。在调查/proc/statCPU 利用率时我偶然发现了这一点:
$ ll /proc/thread-self
lrwxrwxrwx 1 root root 0 Aug 22 04:26 /proc/thread-self -> 9389/task/9389/
$ ll /proc/self
lrwxrwxrwx 1 root root 0 Aug 22 04:26 /proc/self -> 29420/
$ ll /proc/self
lrwxrwxrwx 1 root root 0 Aug 22 04:26 /proc/self -> 29636/
$ ll /proc/thread-self
lrwxrwxrwx 1 root root 0 Aug 22 04:26 /proc/thread-self -> 30021/task/30021/
Run Code Online (Sandbox Code Playgroud)
thread-selfself每次列出带有 的符号链接时,它们都会不断变化ll。但日期和时间仍保留为上次启动时间。
我做了一些挖掘,在 2014 年发现了这个电子邮件链:
该补丁集实现了
/proc/thread-self一个神奇的符号链接,可以解决几个问题。
....电子邮件的下面写道: …
我的理解是,必须生成一个隐式附加到方法的块;它不能被调用。所以我试图理解为什么会这样:
def execute_code
proc.call
end
execute_code { "Why does this work?" } # => "Why does this work?"
Run Code Online (Sandbox Code Playgroud)
将块附加到此代码会成功执行。
任何见解?我没有发现任何文档暗示隐式块会自动转换为 proc 对象并分配给变量proc。
红宝石 2.5.3