Linux的进程和线程_第1页
Linux的进程和线程_第2页
Linux的进程和线程_第3页
Linux的进程和线程_第4页
Linux的进程和线程_第5页
已阅读5页,还剩9页未读, 继续免费阅读

下载本文档

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

文档简介

1、操作系统课程设计实验报告册班级: 131112 学号: 13111xxx 姓名: xxxxx 教师: 第 2 页 共 14 页目 录实验说明重要提示实验3 linux的进程和线程 要求:理解进程/线程的概念掌握创建和终止进程/线程的方法掌握与进程/线程控制相关的系统函数实验编号3题目linux的进程和线程实验目的理解进程/线程的概念掌握创建和终止进程/线程的方法掌握与进程/线程控制相关的系统函数实验内容创建和终止进程/线程使用进程/线程控制相关的系统函数报告内容要求(1) 实现方法和思路(2) 测试及结果报 告 正 文 getpid():获得当前进程id getppid():获得当前进程的父进

2、程的id getuid():获得用户id getgid():获得组id源代码:#include <stdio.h>#include <unistd.h>#include <sys/types.h>int main()pid_t mypid;pid_t myparentpid;gid_t mygid;uid_t myuid; mypid = getpid();myparentpid = getppid();mygid = getgid();myuid = getuid();printf("my process id is %dn", myp

3、id);printf("my parent is process id is %dn", myparentpid);printf("my group id is %dn", mygid);printf("my user id is %dn", myuid);return 0;运行结果;api函数用途fork创建一个新的子进程wait将进程挂起直到子进程退出signal注册一个新的信号句柄pause将进程挂起直到捕获到信号kill向某个指定的进程发出信号exit正常中止当前进程wait函数pid = wait( &status

4、);if( wifexited(status) ) printf(“child exited normally with status %dn”, wexitstatus(status);else if( wifsignaled(status) ) printf(“child exited by signal with status %dn”,wtermsig(status);源代码:#include <sys/types.h>#include <unistd.h>#include <errno.h>int main()pid_t ret;int statu

5、s , i;int role = -1;ret = fork();if(ret > 0)printf("parent: this the parent process (pid %d)n", getpid();for(i=0;i<6;i+)printf("parent: at count %dn", i);sleep(3); ret = wait(&status);/防止僵尸进程的产生role=0; elseif(ret =0)printf("child: this the child process (pid %d)n&q

6、uot;, getpid();for(i=0;i<6;i+)printf("chile: at count %dn",i);sleep(1); role = 1; elseprintf("parent: error trying to fork() (%d)n", errno);printf("%s: exiting.n", (role =0)?"parent":"child");return 0;运行结果:signal函数信号说明sighup挂起sigint键盘中断sigkillkill

7、信号sigusr1用户自定义信号sigusr2用户自定义信号sigpipe终止管道sigterm终止信号源代码:#include <stdio.h>#include <sys/types.h>#include <signal.h>#include <unistd.h>void catch_ctlc( int sig_num)printf("caught control-cn");fflush(stdout);/清除标准输出的缓存区int main()signal( sigint, catch_ctlc);printf(&quo

8、t;go ahead, make my day.n");pause();return 0;运行结果: pause函数 pause函数会把进程挂起,直到接收到信号。在接收到以后,调用进程从pause中返回,继续进行。如果进程捕获的信号已经注册了信号句柄,那么pause函数会在信号句柄被调用并返回之后才返回。 pause原型: 头文件<unistd.h> int pause( void );pid说明>0信号发送到由pid指定的进程0信号发送到与调用进程同组的所有进程-1信号发送到所有进程(init进程除外)<0信号发送到由pid的绝对值指定的进程组中的所有进程源

9、代码:#include <stdio.h>#include <sys/types.h>#include <sys/wait.h>#include <unistd.h>#include <signal.h>#include <errno.h>void usr1_handler( int sig_num)printf("parent (%d) got the sigusr1n", getpid() );int main()pid_t ret;int status;int role = -1;ret = fo

10、rk();if( ret > 0)printf("parent: this is the parent process (pid %d)n",getpid() );signal( sigusr1, usr1_handler);role = 0;pause();printf("parent: awaiting child exitn");ret = wait( &status); else if(ret = 0)printf("child: this is the child process (pid %d)n", get

11、pid();role = 1;sleep(1);printf("child: sending sigusr1 to pid %dn", getppid();kill(getppid(), sigusr1);sleep(2);elseprintf("parent: error trying to fork() (%d)n", errno);printf("%s: exitingn", ( ( role = 0) ? "parent" : "child");return 0;运行结果: exit函数

12、 终止调用进程。传入exit的参数会返回给父进程,为wait或waitpid调用提供所需要的状态信息。 exit原型: void exit( int status); 进程调用exit时还会向父进程发出sigchld信号,释放当前进程占用的资源。 这个函数调用十分重要,因为他会向shell坏境表明状态时成功还是失败。 线程函数 头文件<pthread.h> 创建线程原型 int pthread_create(pthread_t *thread, pthread_attr_t *attr, void *(*start_routine)(void*), void *arg); 第一个参

13、数为指向线程标示符的指针。 第二个参数用来设置线程属性。 第三个参数是线程运行函数的起始地址。 最后一个参数是运行函数的参数。 若成功则返回0,若失败则返回出错编号。 线程函数 终止线程原型 int pthread_exit(void *retval);源代码:#include <pthread.h>#include <stdlib.h>#include <stdio.h>#include <string.h>#include <errno.h>void *mythread(void *arg)printf("thread

14、rann");pthread_exit(arg);int main()int ret;pthread_t mythread;ret = pthread_create(&mythread,null,mythread,null);if(ret!=0)printf("can not create pthread (%s)n",strerror(errno);exit(-1);return 0;程序无输出内容修改代码:#include <pthread.h>#include <stdlib.h>#include <stdio.h>

15、;#include <string.h>#include <errno.h>void *mythread(void *arg)printf("thread rann");pthread_exit(arg);int main()int ret;pthread_t mythread;ret = pthread_create(&mythread,null,mythread,null);if(ret!=0)printf("can not create pthread (%s)n",strerror(errno);exit(-1);

16、if(ret!=1)printf("11111111n");exit(-1);return 0;运行结果: 线程管理 pthread_t pthread_self(void);/获得自己的线程描述符void *mythread(void *arg) pthread_t pt; pt = pthread_self(); printf("thread %x ran!n", (int)pt); pthread_exit(null); int pthread_join(pthread_t th, void *thread_return ); 参数th是想要加入的

17、线程 参数thread_return存储线程完成后的返回值,可以为null,表明不捕获线程的返回状态。 返回值,0代表成功,非0代表失败的编号。源代码;#include <pthread.h>#include <stdio.h>void *mythread(void *arg)printf("thread %d startedn", (int)arg);pthread_exit(arg);#define max_threads 5int main()int ret, i, status;pthread_t threadidsmax_threads;for(i = 0; i<max_threads; i+)ret = pthread_create(&threadidsi, null, mythread, (void*)i);if(ret != 0)printf

温馨提示

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

评论

0/150

提交评论