Linux的进程和线程Word格式.docx
《Linux的进程和线程Word格式.docx》由会员分享,可在线阅读,更多相关《Linux的进程和线程Word格式.docx(13页珍藏版)》请在冰豆网上搜索。
使用进程/线程控制相关的系统函数
报告内容要求
(1)实现方法和思路
(2)测试及结果
报告正文
•getpid():
获得当前进程ID
•getppid():
获得当前进程的父进程的ID
•getuid():
获得用户ID
•getgid():
获得组ID
源代码:
#include<
stdio.h>
unistd.h>
sys/types.h>
intmain(){
pid_tmyPid;
pid_tmyParentPid;
gid_tmyGid;
uid_tmyUid;
myPid=getpid();
myParentPid=getppid();
myGid=getgid();
myUid=getuid();
printf("
myprocessidis%d\n"
myPid);
myparentisprocessidis%d\n"
myParentPid);
mygroupidis%d\n"
myGid);
myuseridis%d\n"
myUid);
return0;
}
运行结果;
API函数
用途
fork
创建一个新的子进程
wait
将进程挂起直到子进程退出
signal
注册一个新的信号句柄
pause
将进程挂起直到捕获到信号
kill
向某个指定的进程发出信号
exit
正常中止当前进程
Wait函数
pid=wait(&
status);
If(WIFEXITED(status)){
printf(“Childexitednormallywithstatus%d\n”,WEXITSTATUS(status));
}elseif(WIFSIGNALED(status)){
printf(“Childexitedbysignalwithstatus%d\n”,WTERMSIG(status));
errno.h>
pid_tret;
intstatus,i;
introle=-1;
ret=fork();
if(ret>
0){
printf("
Parent:
Thistheparentprocess(pid%d)\n"
getpid());
for(i=0;
i<
6;
i++){
printf("
Atcount%d\n"
i);
sleep(3);
}
ret=wait(&
status);
//防止僵尸进程的产生
role=0;
else
if(ret==0){
Child:
Thisthechildprocess(pid%d)\n"
for(i=0;
printf("
Chile:
i);
sleep
(1);
}
role=1;
}
else{
Errortryingtofork()(%d)\n"
errno);
%s:
Exiting...\n"
((role==0)?
"
Parent"
:
Child"
));
return0;
运行结果:
signal函数
信号
说明
SIGHUP
挂起
SIGINT
键盘中断
SIGKILL
Kill信号
SIGUSR1
用户自定义信号
SIGUSR2
SIGPIPE
终止管道
SIGTERM
终止信号
signal.h>
voidcatch_ctlc(intsig_num){
CaughtControl-C\n"
);
fflush(stdout);
//清除标准输出的缓存区
signal(SIGINT,catch_ctlc);
Goahead,makemyday.\n"
pause();
•pause函数
–pause函数会把进程挂起,直到接收到信号。
在接收到以后,调用进程从pause中返回,继续进行。
如果进程捕获的信号已经注册了信号句柄,那么pause函数会在信号句柄被调用并返回之后才返回。
–pause原型:
•头文件<
•intpause(void);
pid
>
信号发送到由pid指定的进程
信号发送到与调用进程同组的所有进程
-1
信号发送到所有进程(init进程除外)
<
信号发送到由pid的绝对值指定的进程组中的所有进程
sys/wait.h>
voidusr1_handler(intsig_num){
Parent(%d)gottheSIGUSR1\n"
getpid());
intstatus;
if(ret>
Thisistheparentprocess(pid%d)\n"
getpid());
signal(SIGUSR1,usr1_handler);
role=0;
pause();
Awaitingchildexit\n"
ret=wait(&
}
else{
if(ret==0){
Thisisthechildprocess(pid%d)\n"
sleep
(1);
SendingSIGUSR1topid%d\n"
getppid());
kill(getppid(),SIGUSR1);
sleep
(2);
}else{
Exiting…\n"
((role==0)?
"
:
•exit函数
–终止调用进程。
传入exit的参数会返回给父进程,为wait或waitpid调用提供所需要的状态信息。
–exit原型:
•voidexit(intstatus);
–进程调用exit时还会向父进程发出SIGCHLD信号,释放当前进程占用的资源。
–这个函数调用十分重要,因为他会向Shell坏境表明状态时成功还是失败。
•线程函数
–头文件<
pthread.h>
–创建线程原型
•intpthread_create(pthread_t*thread,pthread_attr_t*attr,void*(*start_routine)(void*),void*arg);
•第一个参数为指向线程标示符的指针。
•第二个参数用来设置线程属性。
•第三个参数是线程运行函数的起始地址。
•最后一个参数是运行函数的参数。
•若成功则返回0,若失败则返回出错编号。
–终止线程原型
–intpthread_exit(void*retval);
stdlib.h>
string.h>
void*myThread(void*arg){
Threadran\n"
pthread_exit(arg);
intmain()
{
intret;
pthread_tmythread;
ret=pthread_create(&
mythread,NULL,myThread,NULL);
if(ret!
=0){
Cannotcreatepthread(%s)\n"
strerror(errno));
exit(-1);
程序无输出内容
修改代码:
=1){
11111111\n"
•线程管理
–pthread_tpthread_self(void);
//获得自己的线程描述符
void*myThread(void*arg)
pthread_tpt;
pt=pthread_self();
Thread%xran!
\n"
(int)pt);
pthread_exit(NULL);
•intpthread_join(pthread_tth,void**thread_return);
•参数th是想要加入的线程
•参数thread_return存储线程完成后的返回值,可以为NULL,表明不捕获线程的返回状态。
•返回值,0代表成功,非0代表失败的编号。
源代码;
Thread%dstarted\n"
(int)arg);
#defineMAX_THREADS5
intret,i,status;
pthread_tthreadIds[MAX_THREADS];
for(i=0;
i<
MAX_THREADS;
i++){
ret=pthread_create(&
threadIds[i],NULL,myThread,(void*)i);
if(ret!
=0){
Errorcreatingthread%d\n"
(void*)i);
ret=pthread_join(threadIds[i],(void**)&
Errorjoiningthread%d\n"
(void*)i);
Status=%d\n"
status);