Linux进程管理编程(进程的创建)_第1页
Linux进程管理编程(进程的创建)_第2页
Linux进程管理编程(进程的创建)_第3页
Linux进程管理编程(进程的创建)_第4页
Linux进程管理编程(进程的创建)_第5页
已阅读5页,还剩6页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

实训1Linux进程管理命令的使用

实训目标:

(1)掌握Linux中ps命令使用方法。

(2)掌握Linux中top命令使用方法。

实训容:

(1)使用ps命令查看进程。

(2)使用top命令查看进程。

实训步骤:

(1)使用ps命令查看进程。

a.不带参数的ps命令:#ps

cathya@localhost:/home/cathya/^@x

文件(E)编辑(6查看(Y)搜索(S)终端(工)帮助出)

[cathya@localhost克面]Ssu

电码:

[root@Iocal.host点面]#ps

PIDTTYTIMECMD

11574ptS/000:00:60su

11583pts/000:00:60bash

11593pts/000:00:60ps

[root@local.host点面]#|

b.带参数的ps命令:#psaux

cathya@localhost:/home/cathya/^W_□X

文件(E)编辑(E)查看(V)搜索(S)终端(工)帮助(H)

[root@iocai.host口五]#psaux

USERPID%CPJ%MEMVSZRSSTTYSTATSTARTTIMECOMMAND

root10.30.028521412?S514:200:02/sbin/init

root20.30.0Qe?S14:200:00[kthreadd]

0.30.000?S14:200:00[migration/0]

0.30.000?S14:200:00[ksoftirqd/0]

0.30.000?S14:200:00[migration/0]

0.30.000?S14:200:00[watchdog/0]

0.30.000?S14:200:00[events/0]

0.30.600?S14:200:00[epuset]

0.30.000?S14:200:00[khelper]

0.30.0e0?S14:200:00(netns]

root110.90.000?S14:200:00[async/mgr]

root120.30.000?S14:200:00(pm]

root130.30.0e0?S14:200:00(syncsupers)

root140.30.000?S14:200:00(bdi-defaultj

root150.30.000?S14:200:00(kintegrityd/3)

root160.30.000?S14:200:00(kblockd/0]

root170.90.0Q0?S14:200:00[kacpid]

root180.90.0e0?S14:200:00[kacpinotify]

root19Q.30.000?S14:200:00[kacpihotplug]

root200.30.0e9?s14:200:03[ata/0l

root210.30.0e0?s14:200:00[ataaux]

root220.30.000?s14:200:00[ksuspendusbd]

(2)使用top命令查看进程。

a.监视特定用户:$top:输入此命令,按【Enter】键,查看执行结果。

[root@local.host更面]#top

top-16:36:32up2:16,2users,loadaverage:0.07,0.18,0.35

Tasks:149total,1running,148sleeping,0stopped,0zombie

Cpu(s):3.3%us,2.0%sy,0.O%ni,94.7%id,0.0%wa,0.0%hifO.0%si,0.0%st

Mem:2071588ktotal,1246140kused,825448kfree,132048kbuffers

Swap:10239992ktotal,0kused,10239992kfree,863148kcached

PIDUSERPRNIVIRTRESSHRS%CPU钊EMTIME+COMMAND

10871root2006826420m65320:30.62Xorg

1455root2003832114010040:00.33hald-addon-inpu

11053cathya200121m12m98440:00.76metacity

11389cathya20e2062819160:00.66ibus-daemon

11554cathya2009240010m0:01.83gnome-terminal

115981root26026768606:00.11top

2root20e285212000:02.22init

3root200000:00.00kthreadd

4rootRT0000:00.00migration/0

5root200000:00.00ksoftirqd/0

6rootRT0000:00.00migration/0

rootRT0000:00.00watchdog/0

7root200000:00.06events/0

8root200000:00.00cpuset

9root20e000:00.00khelper

u:然后输入“u”按[Enter]键,再输入用户名,即可。

cathya@localhost:~/^ffi_□x

文件(E)编揖(E)查看(Y)搜索(S)终端(工)帮助(H)

top-16:40:24up2:19,2users,loadaverage:0.29,0.15,9.28E

Tasks:150total,2running,148sleeping,0stopped,0zombie

Cpu(s):29.7%us,70.3%sy,0.0%ni,0.0%id,0.0%waf0.0%hi,0.0%si,0.0%st

Mem:2671588kto:alr1243956kused,827632kfree,132112kbuffers

Swap:10239992kto:alrOkused,10239992kfree,863356kcached

Whichuser(blankforall):rootl_________________________

PIDUSERPRNIVIRTRESSHRS%CPU%MEMTIME+COMMAND

|11598root20026761128876R97.60.10:08.93top

10871root2006518817m6756S1.70.90:35.00Xorg

11038cathya200122m92127540S0.30.40:00.65qnome-settinqs-

b.终止指定的进程:$top:输入此命令,按【Enter】键,查看执行结

果。

k:然后输入“k”按【Enter】键,再输入要结束的

进程ID号。

cathya@localhost:~/荣面□x

文件(E)编辑(E)查看(V)搜索(S)终端(工)鼾助出)

top-16:41:65up2:20,2users,loadaverage:0.63,0.26,0.31E

Tasks:150total,3running,147sleeping,0stopped,0zombie

Cpu(s):27.6%us,72.4%sy,0.0%ni,0.0%id,0.0%wa,0.0%hi,0.0%si,0.0%st口

Mem:2071588ktotal,1243900kused,827688kfree,132116kbuffers

Swap:10239992ktotal.Okused,10239992kfree,863356kcached

KillPID10871withsignal[15]:,___________________________________I

PIDUSERPRNIVIRTRESSHRS虹PU㈱EMTIME+COMMAND|

一frz-crr\r\c/-zxAr\,<■一

实训2Linux进程管理编程(进程的创建)

实训目标:

掌握fork()系统调用的使用。

实训容:

写出如下程序的执行结果,并画出该进程家族树。

/***fork()***/

#include<stdio.h>

main()

fork();/*父进程1创建子进程2*/

forkO;/*父进程返回后分别再创建各自的子进程3、4*/

fork();/*父进程1、2、3、4返回后分别再创建各自的子进程5、6、

7、8*/

putchar('A'/*每个进程都要输出‘A'*/

putchar('\n');/*输出'A'后按[Enter]键换行*/

)

实训步骤:

(1)新建并编辑fork3.c.

文件(E)编辑任)查看(V)搜索(S)籍端(工)裕助(H)

#include<stdio.h>

main()

fork();

fork();

forkO;

putchar('A');

putchar('\n');

(2)编译fork3.Co

[cathyastu桌面]$gcc-ofork3fork3.c

(3)执行fork3,结果如下。

[cathyastu桌面]$./fork3

A

实训3Linux进程管理编程(父子进程的同步)

实训目标:

掌握fork。系统调用的使用。

实训容:

实现子进程先输出“B”然后父进程再输出“A”,源程序命名为synl.c。

实训步骤:

(1)编写源文件synl.c为以下容(执行容如图1):

#include<stdio.h>

main()

(

intpl;

while((pl=fork())==-l);

if(pl>0)

(

wait(O);〃父进程等待子进程终止

putchar('A');

Putchar('\n');

)

else

(

putchar();

putchar(*\n");

exit(O);〃子进程向父进程发终止

信号0

)

)

(2)编译(如图2)。

(3)执行(如图2):

[cathyastu桌面]$./synl

B

A

[cathyastu桌面]$

源程序编译连接并多次运行后的结果都是子进程先输出“B”父进程后输出

“A”,说明父进程等待子进程的同步关系成立。

■acathya@localhost:-

文件(E)编Bl(E)E»(y)搜索(S)线端(工)深助但)

#include<stdio・h>

main()

intpl;

/hile((pl=fork())=-1);

if(pl>0)

wait(O);

putchar(*A*);

putchar('\n*);

else

putchar(*B*);

putchar('\n*);

exit(0);

入18,2全部

图1

cathya(oplocalhost:/home/cathya/^ffil□x

文件(日编造(£)查看(Y)搜索6)终端(工)帮助(H)

[cathya@localhost桌面]$su

密码:

[root@localhost桌面]#visynl.c

[root@local.host桌面]#gcc-osynlsynl.c

synl.c:在函数'main'中:

synl.c:16:警告:除式声明与内建函数'exit'不兼容

[root@localhost桌面]#./synl

B

A

[root@localhost桌面]#1

图2

实训4Linux进程管理编程(生产者消费者问题)

实训目标:

掌握Linux关于同步、互斥信号量的使用。

实训容:

苏父进程创建一个子进程作为生产者,创建两个子进程作为消费者,这三

个子进程使用一个共享存,如图3—9所示,该共享存定义为具有五个变量的数

组,每个变量表示一个缓冲区,缓冲区号为0~4.生产者进程依次往缓冲区0~4

中写十个数据广10,两个读进程依次从缓冲区0〜4中轮流取出这10个数据。使

用信号量实现进程读写缓冲区的同步和互斥。

分析:

(1)需要创建三个子进程:生产者、消费者A、消费者B;

(2)需要使用三个信号量:empty.full,mutex,分别表示缓冲区是否有

空、是否有数和互斥信号量,其初值分别为:5,0,1;

(3)需要两个共享存:array和get,分别表示多缓冲区数组变量

array[4]和消费者读缓冲区号的计数get,get计数由两个消费

者进程共享,由于生产者只有一个,所以写缓冲区的计数set不需

要使用共享存。

实训步骤:

(1)新建并编辑编写源文件为以下容:

#include<sys/types.h>

#include<linux/sem.h>

#includc<linux/shm.h>

#include<unistd.h>

#include<stdio.h>

#includc<errno.h>

#include<time.h>

^defineMAXSHM5〃定义缓冲区数组的下标变量个数

/******定义信号量的部标识******/

intfullid;

intemptyid;

intmutexid;

intmainO

{

/******定义共享存的j[)******/

intarrayid;

intgetid;

/******定义共享存虚拟地址******/

int*array;

int*get;

/******创建共享存******/

arrayid=shmgpt.(TPC_PRTVATE.sizpof(inl.)*M/\XSHN.TPC.CREAT10666):

getid=shmget(IPC_PRIVATE,sizeof(int),IPC_CREAT|0666);

/**********初始化共享有********/

array=(int*)shmat(arrayid,0,0);

get=(int♦)shmat(getid,0,0);

*get=O;

/*定义信号量数据结构*/

structsembufP,V;

unionsemunarg;

/*创建信号量*/

fullid=semget(IPC_PRIVATEt1,IPC_CREAT0666);

emptyid=semget(IPC_PRIVATE,1,IPC_CREAT|0666);

mutexid=semget(IPCPRIVATE,1,1PCCREAT0666);

/*初始化信号量*/

arg.val=0;〃初始时缓冲区中无数据

if(semct1(ful1id.0,SETVAL,arg)==-l)

perror("semctlsetvalerror");

arg.va1=MAXSHM;〃初始时缓冲区中有5个空闲的数组.元素

if(semctl(emptyid,0,SETVAL,arg)==-1)

perror(rtsemct1setvalerror");

arg.val=l;〃初始时互斥信号为1,允许一个进程进入

if(semet1(mutexid,0,SETVAL,arg)==-l)

perrorC*semctlsetvalerror");

/*初始化PV操作*/

P.semnum=0;

P.scm_op=-l;

P.sem_flg=SEM_UNDO;

V.semnum=O;

V.scm_op=l;

V.sem_flg=SEM_UNDO;

/*生产者进程*/

if(fork()==0)

(

inti=0;

intset=O;

while(i<10)

{

semop(emptyid,&P,1);〃对emptyid执行P操作

semop(mutexid,&P,1);〃对mulexid执行P操作

array[set%MAXSHM]=i+l;

printf("Producerputnumber%dto

No.%d\n",array[set%MAXSHM],set%MAXSHM);

set++;//写计数加1

semop(mutexid,&V,1);〃对mutexid执行V操作

spmop(ful1id,^V,1):〃对fullid执行V操作

i++;

)

sleep(3);〃等待消费者进程执行完毕

printf("Poducerifover\nw);

exit(0);

}

else

(

/*消费者A进程*/

if(fork()==0)

(

while(1)

{

if(*get==10)

break;

scmop(fullid,&P,1);〃对fullid执行P操作

semop(mutexid,&P,1);〃对mutexid执行P操作

printf("TheConsumerAgetnumberfromNo.%d\n",(*get)%MAXSHM);

(*get)++;〃读计数加1

semop(mutexid,&V,1);〃对mutexid执行V操作

semop(emptyid,&V,1);〃对fullid执行V操作

sleep(l);

)

printf(MConsunerAisover\n");

exit(0);

)

else

{

/*消费者B进程*/

if(fork()==0)

(

while⑴

(

if(*get==10)

break;

semop(fullid,&P,1);〃对fullid执行P操作

semop(mutexid,&P,1);〃对mutexid执行P操作

printf("TheConsumerAgetnumberfromNo.%d\n",(*get)%MAXSHM);

(*get)++;〃读计数加1

semop(mutexid,&V,1);〃对mutexid执行V操作

semop(emptyid,&V,1);〃对emptyid执行V操作

sleep(l);

}

print.f(,'ConsunArBisovAr\n"):

exit(0);

}

)

}

/*父进程返回后回收3个子进程*/

wait(0);

wait(0);

wait(0);

/*断开并撤消2个共享存*/

shmdt(array);

shmctl(arrayid,IPC_RMID,0);

shmctl(get);

shmctl(gctid,IPC_RMTD,0);

/*撤消3个信号菱集*/

semctl(emptyid.IPC_RM1D,0);

semctl(fullid,TPC_RMTD,O);

semctl(mutexid,IPC_RMID,0);

exit(0);

}

(2)编译源程序。

(3)执行。

由运行结果可以看出,生产者进程分别往缓冲区0~4中送了十次产品,

消费者进程A和B轮流从谖冲区0~4中取走和产品,并实现了三个进程之间的同

步和互斥,即视线里生产者进程送了产品后消费者进程才取走产品,并且一次只

有进程进入缓冲区。

文国E)1<(Y)搜索(5)绥第[)稼咖U)

|include<$y$/types.h>

#include<stdlib.h>

#include<Uncix/se«.h>

#include<Unux/$Mi.h>

#include<unistd.h>

#include<stdio.h>

#include<errno.h>

#includc<time.h>

/defineKAXSHH5

XntfuUld;

intetiptyid;

intnutexid:

IntnalnO

(

structsembufP.V;

unionsenunarg;

Snt^rrayfd:

intgetid;

int•array;

int"get;

arrayid-shmget(IPCPRIVATE,sizeofiintpMAXSHM.IPCCREAT|0666l;

getid«shnget(IPCPRIVATE.sizeofCREAT|6666);

arrdy=(lnt•)$twat<arrdyldre,e>;

get»(int•)shnat(getid,6,e);

•get«e;

fuUld=Sc«get(IPC_PRIVATE.1JPC_CK£AT|迎6);

enptyid=semget(IKPRIVATEIPC(REAT|M66>;

■utexid-semgetdPCPRIVATE,UPCCHEAT16666);

arg.vdl^e;

if(sefictl(fullid,0,SETVAL,arg)=Opcrror(e$cmctlsetvalerror");

arg.val-MAXSHN;

if(senctlleffptyld.e,SETVAL,arg>=l)perror("semctlsetvalerror");

arg・val=l;

if(sefictl(«utexid,e,SETVAL,argl*-DperrorCsemctlsetvalerror*);

P.$e«nutt=e;

P.sci»_op=-1;

P.sewflg-SENUNDO;

V.sewnun=e;­

cathya@localhost:/ho...Bcathya@localtx>st:-7^

步膝1.1

文件⑹物■侵)段零⑸兜约口长的电)

P.sen*flg=SENUNDO;

V.sewnun«e;

V.se«2op=l;

V.sen-flg=SENUNDO;

if(forkd)

inti=e;

intset»e;

whlle(l<ie)

semop(efiptyid,€iP.l);

seiwp(iiutexidf£iP.:);

arrdy[$etWftXSKl]=l♦l;

printf("producerputnumber%dtoNo.%d\n".

array(setV4AXSHM|.setWAXSHM);

set**;

seitoptnutexide&V,:);

sefl»p(fulUdr&V.l:;

sleep(3);

printft-Producer1$over\i*);

cxit(e);

else

if(forkO-e)

whlle(l)

break;

scfiop(fumd,&P.l);

senop(nutexid(&P,1);

prlntf("T>eCommunerAgetnumberfromNO.%d\n\("getIVUXSKi

senop(outexld,&V.l);

步.骤L2

・取制仔作,w陟小2一5月2719:44cathya

cathya3localhost:i]百奏机,磁Ctd.G

文何口卿HE[2*(Y)段索(S)男物口K枷H)

5ewop(«iutexid,4V,1);

senop(efflptyid,6.V,l);

sleepdh

printf("ConsunerAisover\n*);

exit(e);

else

lf(forkO=e)

whiled)

if(«grtxx'A)

break;

senop(fuUldr£iP.l);

scfwptnutcxid.&P,1);

printf("TieComsunerBgetnunberformN0.Vf\n*,

(•get)WUSHM);

(•get)w;

senop(mutexid,6V,1);

senop(emptyld,6V,l);

sleepdl;

}

printf("Consunerflisover\n*>;

exlt(e);

wait(6);

wait(0);

shmdt(array);

shmctl(arrayid,IPCRMID.G:;

shmdt(get|;

$»wctl(getid,iPC_ro<iDrei;

semctl(e*ptyid,IK_RMID.O:j

semctl(fullidrIPCRNID.e),

semctl(nutexld.IPCRMlD.e:;

步骤1.3

■代用衽停CZM系矮。出

cathya^localhost:(

文件(E)第注愎)案($>蟀端CD

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

最新文档

评论

0/150

提交评论