进程

来源:互联网 发布:免费中文字体下载mac 编辑:程序博客网 时间:2024/06/11 09:55
 Python Code 
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
#!/bin/bash
#运行程序并关闭
#一,运行记事本并关闭
reset
echo 
"现在演示下进程的休眠关闭,一会我会打开一个记事本,然后休眠5秒关闭它"
echo 
准备好了吗,按任意键继续"
echo 
gedit
read -sn1
echo 
echo 
"现在你的屏幕会自动打开一个记事本"
echo
echo 
"进程会休息15秒"
echo 
"因为后面紧跟着kill命令,如果进程没有休眠成功,那么记事本会被瞬间关掉"
sleep 
15
echo
echo 
"好的,现在15秒到了,我会关闭记事本"
killall -
9 gedit
#判断用户是否自己关闭了记事本
if $? 0 ]
      then
      echo
      echo 
"看,现在笔记本被关闭了对吧"
      echo
      echo 
"进程睡眠有两个命令,分别是sleep和wait,他们的区别是sleep是占着CPU去睡觉的,别人无法使用他的CPU资源。而wait是不占CPU资源的,wait后程序如果再次开启要重新等待CPU分配资源才能运行."
      echo
      echo 
"现在输入任意字符进行下一个实验"
      
read -sn1
else
    echo 
"都说了不要关掉,你要重新来一次吗?输入y重新开始,输入c继续本次,输入其他任意键退出.."
    
#判断用户是否需要再来一次
      read -s userin
      case $userin 
in
        Y|y)
            
exec $0;;
        C|c)  
            ;;
        *)
            exit 
0;;
    esac
    echo 
"跳过本次实验,进行下个实验"
      
read -s1
                
fi
#进程暂停
reset
echo 
"下面是,进程暂停。"
echo
echo 
"暂停的话进程会被终止,你无法对它进行任何操作"
echo
echo 
"这部分我会为你打开一个备用的新终端,防止程序意外崩溃。"
echo 
"现在此程序的进程号是$$,"
GUI=`gnome-terminal`
echo 
"--------------------------------------------------------------------"
echo 
                          第一部分"
echo 
"--------------------------------------------------------------------"
echo 
"首先我会让程序持续输出循环,大概一半的时候让它暂停"
echo 
"这时候需要你帮助他恢复"
echo 
"准备好了输入任意键"
read -sn1
#第一部分代码
#循环输出1到100000,当数值等于50000时触发暂停进程,等待用户解除
for((i=1;i<=100000;i++));do
 echo 
"啊啊啊,黑猫警长~"
 echo $i
   
if $i -eq 50000 ]
    then
        echo 
"查看此终端现有的后台进程命令是:jobs "
        echo 
"程序放入后台执行的命令是:bg 任务编号"
        echo 
"放入前台执行的命令是:fg 任务编号"
        echo 
"通常情况下我们执行比较耗费时间但是并不耗费CPU资源的事情时(例如用find命令查找磁盘的某一个文件)一般会用ctrl 停止它"
        echo 
"输入bg命令挂入后台.等到时间差不多输入fg调到前台即可,查找的结果会直接显示."
        kill -STOP $$
    
else
        echo
   fi   
done
echo 
"做的不错呦,按任意键继续"
read -sn1
reset
echo 
"--------------------------------------------------------------------"
echo 
                          第二部分"
echo 
"--------------------------------------------------------------------"
echo 
"第二部分同样运行刚才的循环,首先我会让进程  睡眠  两次,然后让他暂停一次,每次少许间隔它都会自己恢复运行。为了这里的几行代码我真的是煞费苦心啊......."
echo 
"准备好按任意键开始~"
read -sn1
#第二段代码开始
#准备自动唤醒暂停进程的脚本
echo "kill -18 $$" >>/root/桌面/1.sh
chmod 
777 /root/桌面/1.sh 
#进入循环,执行两次睡眠和一次自动暂停并自动恢复
for((i=1;i<=100000;i++));do
 echo 
"啊啊啊,黑猫警长~"
 echo $i
   
if $i -eq 20000 ]
    then
            echo 
"进入第一次睡眠"
          sleep 
3
        echo 
"睡眠完成,现在继续"
    
elif $i -eq 50000 ]
    then
        echo 
"进入第二次睡眠"
            sleep 
3
        echo 
"睡眠完成,现在继续"
     
elif $i -eq 70000 ]
    then
        wait
        
#第三段自动暂停和程序自动恢复
        {

            function li 
                        kill -STOP $$
                            
            }
            function yao     
                         sleep 
5
                         /root/桌面/
1.sh      
            }
 
            
#创建一个fifo文件
            FIFO_FILE=/tmp/$.fifo
            mkfifo $FIFO_FILE
 
            
#关联fifo文件和fd6
            exec 6<>$FIFO_FILE      将fd6指向fifo类型
            rm $FIFO_FILE
 
            
#最大进程数
            PROCESS_NUM=2
 
            
#向fd6中输入$PROCESS_NUM个回车
            for ((idx=0;idx<$PROCESS_NUM;idx++));
            do
               echo
            done >&
6 
 
            
#for循环用来设置执行几次
            for ((idx=0;idx<</span>1;idx++));
            do
                
read -u6  #read -u6命令执行一次,相当于尝试从fd6中获取一行,如果获取不到,则阻塞
                #获取到了一行后,fd6就少了一行了,开始处理子进程,子进程放在后台执行
                {
                li && yao


                
#完成后再补充一个回车到fd6中,释放一个锁
                echo >&6 当进程结束以后,再向fd6中加上一个回车符,即补上了read -u6减去的那个
                &
            done
 
            
#关闭fd6
            exec 6>&-
           
        

    
else
        echo
   fi   
done
rm -f /root/桌面/
1.sh

echo 
"打开源码看看吧,其实这些命令对于我们来人来说,非常简单,难得是怎么让电脑自动去执行。第二部分实现起来非常非常难,难的地方是因为以我的知识面来说,查了很久但是不知道如何创建多线程。"
echo 
"不能创建多线程的就意味着,不能自动唤醒。因为一旦我在程序里输入了kill -STOP后,整个程序就停止了,程序一旦停止,那么后面的自动唤醒也就没法实现。如果我把唤醒的代码放到前面,那么又没用,因为执行到唤醒代码时你的电脑还没STOP"
echo 
"总之查了很多了思考了很多,最终实现了这个想法,我就不剧透了,困的不行了..."