QQ登录

只需一步,快速开始

 找回密码
 注册

QQ登录

只需一步,快速开始

查看: 1703|回复: 11

帮忙改一下程序 进程软中断 ------------>

[复制链接]
发表于 2006-4-6 00:00:30 | 显示全部楼层 |阅读模式
#include <stdio.h>

#include <signal.h>

#include <unistd.h>

#include <sys/types.h>



int wait_flag;

void stop();



int main() {

        int pid1,pid2;

        signal(14,stop);  //or signal(14,stop);

        while((pid1=fork())==-1);

        if(pid1>0) {

                while((pid2=fork())==-1);

                if(pid2>0) {

                        // wait_flag=1;

                        printf("Before killed!\n");
                        sleep(5);

                       
         kill(pid1,16);

                        kill(pid2,17);

                        wait(0);

                        wait(0);

                        printf("Parent process is killed !!\n");

                        exit(0);

                }

                else {
                        // wait_flag=1;

                        signal(17,stop);

                        printf("Child process 2 is killed by parent !!\n");

                        exit(0);

                }

        }

    else {

                // wait_flag=1;
                //sleep(2);

                signal(16,stop);

                printf("Child process 1 is killed by parent !!\n");

                exit(0);

        }

}



void stop() {
        printf("This stop function!");

        wait_flag=0;

}


我在网上查signal函数是注册一个函数
这里就是注册stop函数是马?
那也没有执行stop函数啊?
实在是不懂
请指点!!

这段代码的意图是接受键盘软中断
kill()发送中断信号
子进程等待16,17号软中断的发生
然后子终止
主程序wait()函数接受
最后父进程结束

也不知道我理解的这样的流程对不对
请多多指点
谢谢各位了
帮忙看看吧
 楼主| 发表于 2006-4-12 21:41:54 | 显示全部楼层
大哥们
帮帮我
谢谢阿
回复

使用道具 举报

发表于 2006-4-12 22:02:41 | 显示全部楼层
wait应该是等待子进程结束吧。
kill是发送信号,至于干什么由注册的信号函数(stop)决定,kill并不等于中断,呵呵,不要把kill理解成“杀死”。
回复

使用道具 举报

 楼主| 发表于 2006-4-13 23:03:11 | 显示全部楼层
但是这段程序的执行结果于书上说的不一样阿?

应该是16.17号中断到来的时候子进程才结束吧?
为什么程序一执行就打印
Child process 1 is killed by parent  !!
Child process 2 is killed by parent !!
Before killed!\
等待五秒
打印父进程结束

不是应该等待键盘中断信号的吗?
如果键盘一直没有消息怎么办?
是不是应该一直等待阿?

请帮忙阿
帮忙详细说一下
也不用老麻烦您了
谢谢
回复

使用道具 举报

发表于 2006-4-13 23:08:14 | 显示全部楼层
http://www.linuxfans.org/nuke/modules.php?name=Forums&file=viewtopic&p=4576600#4576600
回复

使用道具 举报

 楼主| 发表于 2006-4-20 10:18:15 | 显示全部楼层
[code:1]
#include <stdio.h>
#include <signal.h>
#include <unistd.h>
#include <sys/types.h>
int wait_flag;
void stop();
int main() {
int pid1,pid2;
signal(14,stop); //or signal(14,stop);
while((pid1=fork())==-1);
if(pid1>0) {
while((pid2=fork())==-1);
if(pid2>0) {
// wait_flag=1;
printf("Before killed!\n");
sleep(5);
kill(pid1,16);
kill(pid2,17);
wait(0);
wait(0);
printf("Parent process is killed !!\n");
exit(0);
}
else {
// wait_flag=1;
signal(17,stop);
printf("Child process 2 is killed by parent !!\n");
exit(0);
}
}
else {
// wait_flag=1;
//sleep(2);
signal(16,stop);
printf("Child process 1 is killed by parent !!\n");
exit(0);
}
}
void stop() {
printf("This stop function!");
wait_flag=0;
}
[/code:1]
回复

使用道具 举报

 楼主| 发表于 2006-4-20 10:18:58 | 显示全部楼层
请指教
回复

使用道具 举报

发表于 2006-4-20 19:50:24 | 显示全部楼层
父进程一般会一次执行完,因为这么点代码,在一个时间片内执行完一个进程几乎是一定的.
如果你把14改成SIGINT会更好,不要用数字,移植性差.

我执行,结果正常.
回复

使用道具 举报

 楼主| 发表于 2006-4-22 13:24:59 | 显示全部楼层
如果键盘一直没有消息怎么办?
是不是应该一直等待阿?
这个程序没等kill发16.17中断信号
子进程就结束了阿
这里的stop()函数没有作用阿
回复

使用道具 举报

发表于 2006-4-22 13:47:38 | 显示全部楼层
你把14改成SIGINT就可以得到stop执行结果.
两个子进程都是注册一个信号处理函数,打印,退出.注意,是连信号都没收到就退出了.所以子进程的stop没运行.你给每个子进程一个大于5秒的sleep就可以看到了.
回复

使用道具 举报

 楼主| 发表于 2006-4-23 12:19:33 | 显示全部楼层
[root@localhost soft]# gcc -o  hello soft.c
soft.c: 在函数 ‘main’ 中:
soft.c:23: 警告:隐式声明与内建函数 ‘exit’ 不兼容
soft.c:30: 警告:隐式声明与内建函数 ‘exit’ 不兼容
soft.c:38: 警告:隐式声明与内建函数 ‘exit’ 不兼容
[root@localhost soft]# ./hello
Child process 1 is killed by parent !!
^[[3~^[[3~^[[3~Child process 2 is killed by parent !!
Parent process is killed !!
[root@localhost soft]#   

按delete键出现^[[3~
其他的没有反应
,没打印stop()内容

[code:1]
#include <stdio.h>
#include <signal.h>
#include <unistd.h>
#include <sys/types.h>

int wait_flag;
void stop();

main() {
        int pid1,pid2;   //存储进程PID
        signal(SIGINT,stop);  //or signal(14,stop);  定义中断类型
        while((pid1=fork())==-1);  //创建进程
        if(pid1>0) {
                while((pid2=fork())==-1);
                if(pid2>0) {
                        // wait_flag=1;
                        //sleep(4);
                        kill(pid1,16);  //发送16
                        kill(pid2,17);
                        wait(0);
                        wait(0);
                        printf("Parent process is killed !!\n");
                        exit(0);
                }
                else {
                        // wait_flag=1;
                        sleep(5);
                        signal(17,stop);
                        printf("Child process 2 is killed by parent !!\n");
                        exit(0);
                }
        }
    else {
                // wait_flag=1;
                //sleep(3);
                signal(16,stop);
                printf("Child process 1 is killed by parent !!\n");
                exit(0);
        }
}

void stop() {
        printf("hehehee");
        wait_flag=0;
}
[/code:1]
大哥指教
谢谢
回复

使用道具 举报

发表于 2006-4-23 19:41:20 | 显示全部楼层
先sleep再signal是不对的.还有为什么楼主取消进程1的sleep?这样不是就看不到信号处理执行了吗?
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 注册

本版积分规则

GMT+8, 2024-11-2 18:31 , Processed in 0.050197 second(s), 15 queries .

© 2021 Powered by Discuz! X3.5.

快速回复 返回顶部 返回列表