linux 练习六 信号的发送与信号处理
2017-12-02 21:31
239 查看
题目:实现两个程序mysignal、mycontrl,mycontrl给mysignal发送SIGINT信号,控制mysignal是否在屏幕打印“hello”字符串。
//mycontrol.c
#include <signal.h>
#include <sys/types.h>
#include <unistd.h>
#include <stdlib.h>
#include <stdio.h>
int main(int argc , char *argv[])
{
pid_t result = 0;
int ret = 0;
result = fork();
printf("fork result=%d\n",result);
if(result < 0)
{
perror("fork");
exit(1);
}
else if(result == 0)
{
printf("now in child,pid=%d\n",getpid());
ret = execl("./mysignal.o","mysignal.o",NULL);
if(ret < 0)
{
perror("execl");
exit(1);
}
printf("child process exit\n");
}
else
{
int cyccnt = 0;
printf("in parent child pid=%d\n",result);
sleep(3);
do
{
ret = kill(result,SIGINT);
if(ret < 0)
{
perror("kill");
}
sleep(3);
cyccnt++;
}while(cyccnt < 3);
result = waitpid(result,NULL,0);
printf("child process=%d,return\n",result);
}
}
book@ubuntu:~/watchman$ ./mycontrol.o
fork result=4480
in parent child pid=4480
fork result=0
now in child,pid=4480
mysignal pid=4480
wait for signal
wait for signal
hello signal=2
wait for signal
wait for signal
hello signal=2
wait for signal
child process=4480,return
//mycontrol.c
#include <signal.h>
#include <sys/types.h>
#include <unistd.h>
#include <stdlib.h>
#include <stdio.h>
int main(int argc , char *argv[])
{
pid_t result = 0;
int ret = 0;
result = fork();
printf("fork result=%d\n",result);
if(result < 0)
{
perror("fork");
exit(1);
}
else if(result == 0)
{
printf("now in child,pid=%d\n",getpid());
ret = execl("./mysignal.o","mysignal.o",NULL);
if(ret < 0)
{
perror("execl");
exit(1);
}
printf("child process exit\n");
}
else
{
int cyccnt = 0;
printf("in parent child pid=%d\n",result);
sleep(3);
do
{
ret = kill(result,SIGINT);
if(ret < 0)
{
perror("kill");
}
sleep(3);
cyccnt++;
}while(cyccnt < 3);
result = waitpid(result,NULL,0);
printf("child process=%d,return\n",result);
}
}
//mysignal.c #include <stdlib.h> #include <stdio.h> #include <sys/types.h> #include <signal.h> #include <string.h> #include <unistd.h> void signal_handler(int signo) { printf("hello signal=%d\n",signo); } int mysignal(int signo,void (*sighandler)(int signo)) { struct sigaction newact,oldact; int ret = 0; newact.sa_handler = sighandler; ret = sigemptyset(&newact.sa_mask); if(ret < 0) { perror("sigemptyset"); return -1; } newact.sa_flags = 0; ret = sigaction(signo,&newact,&oldact); if(ret < 0) { perror("sigaction"); return -1; } return 0; } int main(int argc, char *argv[]) { int cyccnt = 0; int ret; printf("mysignal pid=%d\n",getpid()); // signal(SIGINT,signal_handler); ret = mysignal(SIGINT,signal_handler); if(ret < 0) { perror(" mysignal"); exit(1); } while(1) { printf("wait for signal\n"); sleep(2); cyccnt++; if(cyccnt > 4) { break; } } exit(0); }
book@ubuntu:~/watchman$ ./mycontrol.o
fork result=4480
in parent child pid=4480
fork result=0
now in child,pid=4480
mysignal pid=4480
wait for signal
wait for signal
hello signal=2
wait for signal
wait for signal
hello signal=2
wait for signal
child process=4480,return
相关文章推荐
- Linux向进程发送信号及执行信号处理函数的时机
- linux信号处理、killall、SIGALRM、sigaction函数和结构体、向进程发送信号
- linux 信号注册处理发送signal
- linux信号处理、killall、SIGALRM、sigaction函数和结构体、向进程发送信号
- linux信号处理--通过发送信号控制进程
- linux中的信号处理(signal和alarm)
- Linux Linux程序练习十(网络编程大文件发送)
- linux下的C语言开发(信号处理)
- linux驱动的异步通知 驱动程序向应用程序发送信号
- linux后端服务程序之信号处理
- Linux 信号signal处理机制
- Linux 多线程应用中如何编写安全的信号处理函数
- Linux信号与信号处理
- linux进程通信---几个发送信号的函数(kill,raise,alarm,pause)
- Linux 信号signal处理机制
- linux 信号处理机制--aoaohao
- Linux信号及信号处理学习总结
- Linux 进程间通信--信号、TCP粘包处理
- 【转载】linux杀死进程以及发送或响应信号
- linux信号处理