
从#include <sys/signal.h>和fork()上判断,笑毕绝这个程序应该是Linux *** 作系统的碰姿应用程序。
Windows上应该用CreateProcess创建进程
获取进程ID用
DWORD GetWindowThreadProcessld(HWND hwnd,LPDWORD lpdwProcessld)
hWnd:窗口句柄。
lpdwProcessld:接收进程标数脊识的32位值的地址。如果这个参数不为NULL,GetWindwThreadProcessld将进程标识拷贝到这个32位值中,否则不拷贝。
返回值:返回值为创建窗口的线程标识。
struct pb{int n
int k
int cha}
typedef struct pb PCB
PCB a[10]void creat()
{static int pi=1
int k,l=0,m
printf("plase input n0:")
scanf("%d",&m)
for(k=1k<=10k++)
if (a[k].n==m)
l=1
if (l==1)
{printf("error!\n")
creat()}
else
{a[pi].n=m
printf("\n")
printf("plase input k0:")
scanf("%d",&a[pi].k)
printf("\n")
a[pi++].cha=4}}void destory()
{int i,num,k=0
printf(" plase input destory number:")
scanf("%d",&num)
for(i=1i<=10i++)
if(a[i].n==num) k=i
if(k!=0)
{a[k].n=0a[k].k=0a[k].cha=0}
else
printf("No have this destory number!\n")}void wakeup()
{int i,k,m,l
printf("请输入n0:")
scanf("%d",&m)
for(k=1k<=10k++)
if (a[k].n==m)
l=k
a[l].cha=1 /*唤醒->静止就绪*/}void active()
{int i,k,m,l
printf("请输入n0:")
scanf("%d",&m)
for(k=1k<=10k++)
if (a[k].n==m)
l=k
a[l].cha=3/*激活->活动就绪*/}void dse()
{int i,k,m,l
printf("请输入n0:")
scanf("%d",&m)
for(k=1k<=10k++)
if (a[k].n==m)
l=k
a[l].cha=4 /*阻塞->活动阻塞*/}void swpend()
{int i,k,m,l
printf("请输入n0:")
scanf("%d",&m)
for(k=1k<=10k++)
if (a[k].n==m)
l=k
a[l].cha=2/* 挂起->静止阻塞 */}void look()
{int i
printf("\t\t�pcb n0 k0 cha\n")
for (i=1i<=10i++)
printf("\t\t%d\t%d\t%d\t%d\n",i,a[i].n,a[i].k,a[i].cha)
printf("\t1--静止就绪 2--静止阻塞 3--活动就绪 4--活动阻塞 5--运行\n")}void zt() /* 改变状态*/
{int i,k,m,l
printf("请输入n0:")
scanf("%d",&m)
for(k=1k<=10k++)
if (a[k].n==m)
l=k
printf("请输入当前状态:")
scanf("%d",&a[l].cha)
look()}void yxs() /*改变优先数*/
{int i,k,m,l
printf("请输入此棚春n0:")
scanf("%d",&m)
for(k=1k<=10k++)
if (a[k].n==m)
l=k
printf("请输入优先数:")
scanf("%d",&a[l].k)
look()}main()
{int d
clrscr()
do
{
printf("\t\t*************** CHOICE *****************\n")
printf("\t\t* 1--------------进程创建森耐 *\n")
printf("\t\t* 2--------------进和饥程撤消 *\n")
printf("\t\t* 3--------------阻塞 *\n")
printf("\t\t* 4--------------唤醒 *\n")
printf("\t\t* 5--------------挂起 *\n")
printf("\t\t* 6--------------激活 *\n")
printf("\t\t* 7--------------查看状态 *\n")
printf("\t\t* 8--------------改变状态 *\n")
printf("\t\t* 9--------------改变优先数 *\n")
printf("\t\t* 0--------------退出 *\n")
printf("\t\t****************************************\n")
printf("\t\t�请选择(0-9):")
scanf("%d",&d)
printf("\n")
switch(d)
{
case 1: creat()break
case 2: destory()break
case 3: dse()break
case 4: wakeup()break
case 5: swpend()break
case 6: active()break
case 7:look()break
case 8:zt()break
case 9:yxs()break
case 0: exit(0)
}
}
while(d!=0)
}
/*请解释一下*/while(((child=wait(&status))==-1)&(errno==EINTR))
这种的目的是父亲进程等待子进程结束,并枯困回收子进程的资源,将子进程的退出状态存储在status中,同时,返回该子进程的pid。
如果wait函数返回-1表示wait函数被其它情况打断返回,并没有等待到子进程结束,而同时判断errno的值是不是EINTR(意思是让你try again),那么,让进程继续等待。因为这个错误并不是真正wait错误,而是被timeout时码桐间等造成的,因此重新等待。而如果是其它情况,显然是wait函数调用错误,即下面的if(child==-1),需要打印错误信息。‘
//但你这句应该写错了。应该是逻辑与而不是位与 *** 作。即
while(((child=wait(&status))==-1)&&(errno==EINTR))
/*请解释一迟败坦下*/
if(child==-1)
你对信号处理部分还需要努力。
另外介绍一本书《Linux高级程序设计 第3版》 上面讲得很清楚。
有问题我们继续交流,一起学习。
更多技术文章可以关注我的微博,名字:成都睿尔科技 。
欢迎分享,转载请注明来源:内存溢出
微信扫一扫
支付宝扫一扫
评论列表(0条)