你用了pthread库,在链接的时候要加上
gcc
-lpthread
1c
-o
1
即可
子进程(对应pid==0语句)调用pthread接口创建线程,在县城内将value赋值5,然后打印
child:
value=%d\n
此时value
=
5
父进程
(对应
pid
>
0
语句),等待子进程执行完成后(wait语句),打印parent:
value=%d\n
,此时value
=
0
对于你补充问题的回答:
线程是在子进程里创建的,它只改变了子进程的value
(子进程和父进程的value处在不同的地址空间,互相没有关系,而子进程和它所创建的线程是在同一地址空间,所以线程可以改变子进程的value),
父进程没有创建线程,因此它的值不会被改变。
在《如何压缩程序占用内存的方法》里我为了测试程序的内存占用大小写了一个shell脚本
$1 &
echo "$1 pid:$!"
sleep 3
pmap $!|grep total|awk -v pid="$!" '{print "pid",pid," memory:",$2}'
里面需要用到linux shell的特殊变量$!,网上都是说$! 返回的是 上一个命令的PID。
但是我实际测试得出,这个说法一般不对,一般对
对于前台命令不对:
[root@bogon ~]# wc -l atxt
2162 atxt
[root@bogon ~]# echo $!
[root@bogon ~]#
但是对于后台命令是对的:
[root@bogon ~]# wc -l atxt &
[1] 9155
2162 atxt
[root@bogon ~]# echo $!
9155
[1]+ Done wc -l atxt
而且,之后若是执行的命令不是后台命令的话,$!里的值都不会改变,直到下一个后台命令执行为止
[root@bogon ~]# wc -l atxt
2162 atxt
[root@bogon ~]# echo $!
9155
[root@bogon ~]# wc -l atxt &
[1] 9198
[root@bogon ~]# 2162 atxt
[1]+ Done wc -l atxt
[root@bogon ~]# echo $!
9198
要用到2个API函数
1Declare
Function
GetWindowThreadProcessId
Lib
"user32"
(ByVal
hwnd
As
Long,
lpdwProcessId
As
Long)
As
Long
从窗口句并获取进程PID
2Declare
Function
FindWindow
Lib
"user32"
Alias
"FindWindowA"
(ByVal
lpClassName
As
String,
ByVal
lpWindowName
As
String)
As
Long
查找窗口句柄
pw
=
FindWindow(vbNullString,
"连连看
v41")‘'查找连连看把找到的结果存在PW是保存窗口句柄GetWindowThreadProcessId
pw,
pid
'从窗口句柄获取进程ID,PID是保存进程ID
HANDLE hSnapShot=CreateToolhelp32Snapshot(TH32CS_SNAPPROCESS,0 );
PROCESSENTRY32 procentry=sizeof(PROCESSENTRY32);
BOOL bFlag=Process32First( hSnapShot, &procentry ) ;
while( bFlag )
{
if(stricmp(procentryszExeFile, "你的程序名 ")==0)
processid=procentryth32ProcessID; //找到
bFlag=Process32Next(hSnapShot,&procentry);
}
注意一个程序可能有几个实例同时运行,所以可能同时找到几个ID。
下面的命令就是显示进程名称为cmdexe的pid,不过这里有一个问题就是获得的pid是包括双引号的,这个你要自己再处理一下。
for
/f
"delims=,
tokens=1,2
skip=3"
%%a
in
('tasklist
/fo
csv
/fi
^"imagename
eq
cmdexe^"')
do
echo
%%b
以上就是关于linux 如何获得正在运行程序的pid全部的内容,包括:linux 如何获得正在运行程序的pid、如何取得后台进程的pid、vb 如何获取进程PID等相关内容解答,如果想了解更多相关内容,可以关注我们,你们的支持是我们更新的动力!
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)