linux信号学习1(kill、alarm、setitimer函数)

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;
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值