hModule=CreateToolhelp32Snapshot(TH32CS_SNAPMODULE,pinfo->th32ProcessID);
Module32First(hModule, minfo); GetShortPathName(minfo->szExePath,shortpath,256);如果还需要详细的代码,请Q我吧。。我最近刚在做这块。。。新手,写的东西比较简单- -
我给你说几个API吧至于程序你自己写吧:1查看进程用到的API:CreateToolhelp32Snapshow:这个函数获得当前系统进程快照。Process32First:获得快照中的第一个进程。Process32Next:遍历系统进程。2获取CPU信息用到的API:NtQuerySystemInformation:这是个Native API哦,使用时要注意的。3获得用户名用NetUserEnum就OK了,具体参数自己查msdn
我觉得这个问题你应该从另外一个方向去考虑,既然b不需要a的资源,那么就不要在fork之前打开这些资源。
你如,你原来的代码是
fd
=
open();
fork();
你现在就应该改成
fork();
if
(parent)
{
fd
=
open();
}
else
{
}
如果你是要在a进程打开资源,运行了一些东西,得到了足够的信息才需要调用其他啊程序来做下一步内容,如果按照上面的方法就无法实现了话,你面对的实际是进程间同步和通信的问题。
解决方法也很简单,随便通过一种通信机制(signal,pipe,等等),等a进程获得足够信息后,再通知b进程执行。比如
a:
fork();
/
below
code
are
running
in
parent,
a
/
fd
=
open();
notify(b);
/
use
kill,
send,
etc
to
notify
child
task
b)
b:
wait();
/
for
example,
while(1)
sleep();
/
execlp(xxx);
通过调用ThreadgetState()方法获取当前线程的状态。以下是我的代码,可以直接编译运行。
public class Test {
public static void main(String[] args) {
new NewThread()start(); //启动线程
}
}
class NewThread extends Thread{
public NewThread() {
super("NewThread"); //定义当前线程的名称为NewThread
}
@Override
public void run() {
Systemoutprintln("当前线程:"+currentThread()getName()+"运行状态为:"+getState()); //打印线程的运行状态
}
}
一、单链表的建立
有了动态内存分配的基础,要实现链表就不难了。
所谓链表,就是用一组任意的存储单元存储线性表元素的一种数据结构。链表又分为单链表、双向链表和循环链表等。我们先讲讲单链表。所谓单链表,是指数据接点是单向排列的。一个单链表结点,其结构类型分为两部分:
1、数据域:用来存储本身数据
2、链域或称为指针域:用来存储下一个结点地址或者说指向其直接后继的指针。
例:
typedef strUCt node
{
char name[20];
struct node link;
}stud;
这样就定义了一个单链表的结构,其中char name[20]是一个用来存储姓名的字符型数组,指针link是一个用来存储其直接后继的指针。
定义好了链表的结构之后,只要在程序运行的时候爱数据域中存储适当的数据,如有后继结点,则把链域指向其直接后继,若没有,则置为NULL。
下面就来看一个建立带表头(若未说明,以下所指链表均带表头)的单链表的完整程序。
#include <stdioh>
#include <malloch> /包含动态内存分配函数的头文件/
#define N 10 /N为人数/
typedef struct node
{
char name[20];
struct node link;
}stud;
stud creat(int n) /建立单链表的函数,形参n为人数/
{
stud p,h,s; / h保存表头结点的指针,p指向当前结点的前一个结点,s指向当前结点/
int i; /计数器/
if((h=(stud )malloc(sizeof(stud)))==NULL) /分配空间并检测/
{
PRintf("不能分配内存空间!");
exit(0);
}
h->name[0]='\0'; /把表头结点的数据域置空/
h->link=NULL; /把表头结点的链域置空/
p=h; /p指向表头结点/
for(i=0;i<n;i++)
{
if((s= (stud ) malloc(sizeof(stud)))==NULL) /分配新存储空间并检测/
{
printf("不能分配内存空间!");
exit(0);
}
p->link=s; /把s的地址赋给p所指向的结点的链域,这样就把p和s所指向的结点连接起来了/
printf("请输入第%d个人的姓名",i+1);
scanf("%s",s->name); /在当前结点s的数据域中存储姓名/
s->link=NULL;
p=s;
}
return(h);
}
main()
{
int number; /保存人数的变量/
stud head; /head是保存单链表的表头结点地址的指针/
number=N;
head=creat(number); /把所新建的单链表表头地址赋给head/
}
这样就写好了一个可以建立包含N个人姓名的单链表了。写动态内存分配的程序应注重,请尽量对分配是否成功进行检测。
引用自:>
用进程快照是可以的,以下代码你自己看着选你所需
void CLoaderDlg::UpdateProcessList()
{
UpdateData(TRUE);
m_ProcListDeleteAllItems();
MYHOOKSTRUCT ProcHookArry[20];
memset(ProcHookArry,0,20sizeof(MYHOOKSTRUCT));
int nCount = 0;
CString str="";
//Second=1;
PROCESSENTRY32 pe32;//进程信息结构体
pe32dwSize = sizeof(pe32);//必须先填充大小。
HANDLE hProcessSnap = ::CreateToolhelp32Snapshot(TH32CS_SNAPPROCESS,0);
if(hProcessSnap == INVALID_HANDLE_VALUE)
{
MessageBox("CreateToolhelp32Snapshot调用失败","Warning");
return;
}
BOOL bMore = ::Process32First(hProcessSnap,&pe32);
while(bMore)
{
//注意:当列表框控件中选中了排序(sort)时会出现ID与程序名不一致。
if(strcmp(strupr(pe32szExeFile),"NOTEPADEXE")==0)
{
ProcHookArry[nCount]ProcessID=pe32th32ProcessID;
ProcHookArry[nCount]ThreadID=GetThreadId(pe32th32ProcessID);
ProcHookArry[nCount]hWnd=myGetWindowByProcessId(pe32th32ProcessID);
strcpy(ProcHookArry[nCount]Name,pe32szExeFile);
ProcHookArry[nCount]hHook=0;
ProcHookArry[nCount]HookFlag=0;
nCount++;
}
bMore = ::Process32Next(hProcessSnap,&pe32);
}
::CloseHandle(hProcessSnap);
for(int i=0;i<nCount;i++)
{
for(int j=0;j<m_HookArryLen;j++)
{
if(ProcHookArry[i]ThreadID==m_ProcHookArry[j]ThreadID)
{
ProcHookArry[i]hHook=m_ProcHookArry[j]hHook;
ProcHookArry[i]hWnd=m_ProcHookArry[j]hWnd;
ProcHookArry[i]ProcessID=m_ProcHookArry[j]ProcessID;
ProcHookArry[i]HookFlag=m_ProcHookArry[j]HookFlag;
strcpy(ProcHookArry[i]Name,m_ProcHookArry[j]Name);
break;
}
}
}
memcpy(m_ProcHookArry,ProcHookArry,nCountsizeof(MYHOOKSTRUCT));
m_HookArryLen=nCount;
int index=0;
for(int n=0;n<m_HookArryLen;n++)
{
strFormat("%d",m_ProcHookArry[n]ThreadID);
index=m_ProcListGetItemCount();
m_ProcListInsertItem(index,str);
m_ProcListSetItemText(index,1,m_ProcHookArry[n]Name);
if(m_ProcHookArry[n]HookFlag)
{
str="已加载";
m_ProcListSetItemText(index,2,str);
}
else
{
str="未加载";
m_ProcListSetItemText(index,2,str);
}
char buf[100]={0};
::GetWindowText(m_ProcHookArry[n]hWnd,buf,100);
str=buf;
m_ProcListSetItemText(index,3,str);
//::SendMessage(m_ProcHookArry[n]hWnd,WM_CLOSE,0,0);
}
UpdateData(FALSE);
}
以上就是关于C语言...如何获取进程的可执行文件路径...全部的内容,包括:C语言...如何获取进程的可执行文件路径...、用C或C++程序编写可以查看window进程,CPU,用户名(没分了,大家帮帮忙啊)、使用linux编写C语言程序,如何才能得到进程信息和父进程信息等相关内容解答,如果想了解更多相关内容,可以关注我们,你们的支持是我们更新的动力!
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)