kill函数
函数: kill - send signal to a process
#include <sys/types.h>
#include <signal.h>
int kill(pid_t pid, int sig);
pid > 0: 发送信号给指定的进程。
pid = 0: 发送信号给 与调用kill函数进程属于同一进程组的所有进程。
pid < -1: 取|pid|发给对应进程组。
pid = -1:发送给进程有权限发送的系统中所有进程。
return value : On success (at least one signal was sent), zero is returned. On error, -1 is returned, and errno is set appro?priately.
#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
#include <fcntl.h>
#include <string.h>
#include <pthread.h>
#include <sys/mman.h>
#include <errno.h>
#include <signal.h>
void sys_error(const char* string1){
perror(string1);
exit(1);
}
int main(int argc,char* argv[]){
pid_t pid = fork();
if(pid == 0){ // 子进程
printf("child : %d, whose parent pid:%d\r\n",getpid(),getppid());
sleep(2);
kill(getppid(),SIGKILL); //将父进程给杀死
}else if (pid > 0){ //父进程
printf("parent pid:%d\r\n",getpid());
while(1); //让父进程一直循环
}
return 0;
}
haitu@ubuntu:/opt/modbus_test/linux_test/signal$ ./kill_test
parent pid:30425
child : 30426, whose parent pid:30425
已杀死
alarm函数
函数:alarm - set an alarm clock for delivery of a signal
#include <unistd.h>
unsigned int alarm(unsigned int seconds);
returns the number of seconds remaining until any previously scheduled alarm was due to be delivered,or zero if there was no previously scheduled alarm
返回0或剩余的秒数,无失败。
常用:取消定时器alarm(0),返回旧闹钟余下秒数
#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
#include <fcntl.h>
#include <string.h>
#include <pthread.h>
#include <sys/mman.h>
#include <errno.h>
void sys_error(const char* string1){
perror(string1);
exit(1);
}
int main(int argc,char* argv[]){
int i = 1;
alarm(1);
while(1){
printf("i = %d\n",i++);
}
return 0;
}
haitu@ubuntu:/opt/modbus_test/linux_test/signal$ ./alarm
.......
i = 137034
i = 137035
i = 137036
i = 137037
i = 137038
i = 137039
i = 137040
i = 137041
i = 137042
i = 137043
i = 137044
i = 137045
i = 137046
i = 137047
i = 137048
i = 137049闹钟
setitimer函数
函数:getitimer, setitimer - get or set value of an interval timer
#include <sys/time.h>
int getitimer(int which, struct itimerval *curr_value);
int setitimer(int which, const struct itimerval *new_value,struct itimerval *old_value);
On success, zero is returned. On error, -1 is returned, and errno is set appropriately。
which:
ITIMER_REAL: 采用自然计时。 ——> SIGALRM
ITIMER_VIRTUAL: 采用用户空间计时 ---> SIGVTALRM
ITIMER_PROF: 采用内核+用户空间计时 ---> SIGPROF
new_value:定时秒数
类型:
struct itimerval {
struct timeval it_interval; /* Interval for periodic timer */
struct timeval it_value; /* Time until next expiration */
};
struct timeval {
time_t tv_sec; /* seconds */
suseconds_t tv_usec; /* microseconds */
};
old_value:传出参数,上次定时剩余时间。
eg:
struct itimerval new_t;
struct itimerval old_t;
new_t.it_interval.tv_sec = 0;
new_t.it_interval.tv_usec = 0;
new_t.it_value.tv_sec = 1;
new_t.it_value.tv_usec = 0;
int ret = setitimer(&new_t, &old_t); 定时 1 秒
#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
#include <fcntl.h>
#include <string.h>
#include <pthread.h>
#include <sys/time.h>
#include <sys/mman.h>
#include <errno.h>
#include <signal.h>
void sys_error(const char* string1){
perror(string1);
exit(1);
}
void myfunc(int signalNo){
printf("hello nihao\n");
}
int main(int argc,char* argv[]){
struct itimerval new_t;
struct itimerval old_t;
signal(SIGALRM, myfunc); //注册SIGALRM信号的扑捉函数
new_t.it_interval.tv_sec = 5;
new_t.it_interval.tv_usec = 0; //设置周期时间
new_t.it_value.tv_sec = 2;
new_t.it_value.tv_usec = 0; //设置第一次时间
if(setitimer(ITIMER_REAL,&new_t,&old_t) == -1){ //设置erorno
perror("setitimer error\n");
exit(1);
}
while (1)
{
/* code */
}
return 0;
}
//第一次两秒后打印,后面5秒周期的打印
haitu@ubuntu:/opt/modbus_test/linux_test/signal$ ./setitimer
hello nihao
hello nihao
^C
haitu@ubuntu:/opt/modbus_test/linux_test/signal$
使用setitimer函数实现alarm函数的1秒打印数字的程序mian函数
int main(int argc,char* argv[]){
int i = 0;
struct itimerval new_t;
struct itimerval old_t;
new_t.it_interval.tv_sec = 0;
new_t.it_interval.tv_usec = 0; //设置周期时间
new_t.it_value.tv_sec = 1;
new_t.it_value.tv_usec = 0; //设置第一次时间
while(1){
printf("i = %d\n",i++);
}
return 0;
}