题目:实现两个程序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);
}
}
//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