kill

发信号 ,而多半的信号的功能是终止。 int kill(pid_t pid,int sig)

pid

wait函数中也有一个pid参数。

  • pid 为正数
  • pid=0,sig发送给和当前进程同组的所有进程。组内广播。
  • pid=-1 指定的sig发送给当前进程有权限发送信号的所有进程,除了1号,)全局广播.init会发,关机时。
  • pid1时,sig发送给所有进程组id为 -pid。负负得正。

sig

  • sig =0 没有信号发出,error check。 被用于检测一个进程(组)是否存在。

返回值

-1返回值为-1,不一定不存在,看errno,如果返回的时eperm说明没有权限。真错假错。

raise

send a signal to the caller

自己给自己发。int raise(int sig)=“kill(getpid(),sig) 在多线程中pthread_(pthread_self(),sig)一个以进程为单位,一个以线程为单位。 什么时候给自己发送信号?

杀掉进程得到coredump文件。

alarm()

里程碑式,可以做很多事情。

unsigned int alarm(unsigned int seconds);倒计时结束后,发送信号。以秒为单位计时,alarm默认动作 杀掉进程。 信号的响应有时间延迟。

#include<stdio.h>
#include<stdlib.h>
#include<unistd.h>
 
int main()
{
	alarm(5);
	while(1);
	
	exit(0);
}
#include<stdio.h>
#include<stdlib.h>
#include<unistd.h>
 
int main()
{
	alarm(10);
	alarm(1);
	alarm(5);
	while(1);
	
	exit(0);
}

5秒杀死。是sleep(alarm+pause来封装的)的问题。

pause()

wait for signal

人为的阻塞系统调用。

 
#include<stdio.h>
#include<stdlib.h>
#include<unistd.h>
 
int main()
{
	alarm(10);
	alarm(1);
	alarm(5);
	while(1)
		pause();
		
	exit(0);
}
  • 定时循环
#include<stdion.h>
#include<stblib.h>
#include<time.h>
 
int main()
{
 
	time_t end;
	int64_t count=0; //64防止溢出
	
	end = time(NULL)+5; //time获取当前时戳,终止时间
	while(time(NULL)<= end)
		count++; //在五秒钟之内
	printf("%lld\n",count);
 
}
  • time ./5sec >tmp/out
#include<stdio.h>
#include<stdlib.h>
static int loop=1;
static void alrm_handler(int s)
{
	loop=0;	 //异步事件。
}
int main()
{
	int64_t count=0;
	alarm(5);
	signal(SIGALRM,alrm_handler);
	while(loop)
		count++;
	printf("%lld\n",count);
	exit(0);
}
 

  • volatile 的作用 gcc 优化会成永真循环。loop永远为真。
  • 信号和time 不同精度。

mycat dfd改为1 argc 2 读源数据写到终端。