上一周完成任务不是非常的好,所以总结一下,希望这一周能做好
requirement(代码已补全)
1. 进程实验
#include <stdio.h>
#include <sys/types.h>
#include <unistd.h>
#include <signal.h>
#include <ctype.h>
#include <stdlib.h>
/* 允许建立的子进程个数最大值 */
#define MAX_CHILD_NUMBER 10
/* 子进程睡眠时间 */
#define SLEEP_INTERVAL 2
int proc_number=0;
/* 子进程的自编号,从0开始 */
void do_something();
int main(int argc, char* argv[])
{
/* 子进程个数 */
int child_proc_number = MAX_CHILD_NUMBER;
int i, ch;
pid_t child_pid;
pid_t pid[10]={
0}; /* 存放每个子进程的id */
if (argc > 1) /* 命令行参数第一个参数表示子进程个数*/
{
child_proc_number = atoi(argv[1]);
child_proc_number= (child_proc_number > 10) ? 10 :child_proc_number;
}
for (i=0; i<child_proc_number; i++) {
/* 填写代码,建立child_proc_number个子进程要执行
* 父进程把子进程的id保存到pid[i] */
pid_t a = fork();
if(a < 0){
printf("fork error\n");
exit(-1);
}
else if(a == 0){
proc_number = i;
do_something(); //子进程进行任务
}
else{
pid[i] = a; //存储进程id号
}
}
/* 让用户选择杀死进程,数字表示杀死该进程,q退出 */
while ((ch = getchar()) != 'q')
{
if (isdigit(ch))
{
/* 填写代码,向pid[ch-'0']发信号SIGTERM,
* 杀死该子进程 */
kill(pid[ch-'0'],SIGTERM); //向该进程发送kill信号
}
}
/* 在这里写代码,杀死本组的所有进程 */
for(i=0;i<=proc_number;i++){
//杀死每个进程
kill(pid[i],SIGTERM);
}
kill(0,SIGTERM); //杀死主进程
return 0;
}
void do_something()
{
for(;;)
{
printf("This is process No.%d and its pid is %d\n",proc_number, getpid());
sleep(SLEEP_INTERVAL); // 主动阻塞两秒钟
}
}
实验过程
先猜想一下这个程序的运行结果。假如运行“./process 20”,输出会是什么样?
答:只生成十个进程,然后不断循环输出,因为代码定义最大进程数为`0个`
运行程序。开另一个终端窗口,运行“ps aux|grep process”命令,看看process 究竟启动了多少个进
程。回到程序执行窗口,按“数字键+回车”尝试杀掉一两个进程,再到另一个窗口看进程状况。按q 退出程序再看进程情况。
答:创建几个进程就有几个进程,杀死一个进程少一个进程,q退出之后进程都没了,见下图。
回答下列问题
你最初认为运行结果会怎么样?
答:和我想到差不多。
实际的结果什么样?有什么特点?试对产生该现象的原因进行分析。
proc_number 这个全局变量在各个子进程里的值相同吗?为什么?
答:不同,因为在创建进程是我设定了值,具体在代码注释。
kill 命令在程序中使用了几次?每次的作用是什么?执行后的现象是什么?
答:使用了创建进程数2次,之前一次是杀死子进程,最后一次杀死所有进程。
使用kill 命令可以在进程的外部杀死进程。进程怎样能主动退出?这两种退出方式哪种更好一些?
答:杀死进程是使用wait()让主进程等待子进程退出,如果使用kill命令在外部杀死没有在内部杀死好,因为这样进程不是正常结束退出了。生成僵死进程,然后他并不会释放资源
2. 线程实验
/* POSIX 下线程控制的实验程序残缺版 */
#include <stdio.h>
#include <sys/types.h>
#include <unistd.h>
#include <ctype.h>
#include <pthread.h>
#define MAX_THREAD 3 /* 线程的个数 */
unsigned long long main_counter, counter[MAX_THREAD];
/* unsigned long long是比long还长的整数 */
void* thread_worker(void*);
int main(int argc,char* argv[])
{
int i, rtn, ch;
pthread_t pthread_id[MAX_THREAD] = {
0}; /* 存放线程id*/
for (i=0; i<MAX_THREAD; i++)
{
/* 在这里填写代码,用pthread_create建一个普通的线程,
线程id存入pthread_id[i],线程执行函数是thread_worker
并i作为参数传递给线程 */
pthread_create(&pthread_id[i],NULL,thread_worker,(void *)i);
}
do
{
/* 用户按一次回车执行下面的循环体一次。按q退出 */
unsigned long long sum =