APUE信号-程序汇总

最近重看APUE,发现对于很多程序的要领还是没有完全理解,所以梳理下便于查看,而且有很多值得思考的问题。

程序清单10- 1  捕获 SIGUSR1 和 SIGUSR2的简单程序

#include "util.h"

static void sig_usr(int);

int
main(void){
	if(signal(SIGUSR1,sig_usr) == SIG_ERR)
		err_sys("cannot catch SIGUSR1!");
	if(signal(SIGUSR2,sig_usr) == SIG_ERR)
		err_sys("cannot catch SIGUSR2!");
	for(;;)
		pause();
}

static void sig_usr(int signo){
	if(signo == SIGUSR1)
		printf("received SIGUSR1\n");
	else if(signo == SIGUSR2)
		printf("received SIGUSR2\n");
	else err_dump("received signal %d\n",signo);
}

程序清单10- 2  在信号处理程序中调用不可重入函数

#include "util.h"
#include <pwd.h>

static void
my_alarm(int signo){
    struct passwd*rootptr;
    printf("in signal handler\n");
    if ((rootptr = getpwnam("de15")) == NULL)
        err_sys("getpwnam(de15) error");
    alarm(1);
}

int
main(void){
    struct passwd*ptr;

    signal(SIGALRM, my_alarm);
    alarm(1);
    for ( ; ; ) {
        if ((ptr = getpwnam("vonzhou")) == NULL)
            err_sys("getpwnam error");
        if (strcmp(ptr->pw_name, "vonzhou") != 0)
            printf("return value corrupted!, pw_name = %s\n", ptr->pw_name);
    }
}

程序清单10- 3  SIGCLD处理程序(在Linux下等价于SIGCHLD)

#include"util.h"
#include<sys/wait.h>

static void sig_cld(int);

int
main()
{
        pid_t pid;
        if (signal(SIGCLD, sig_cld) == SIG_ERR)
            perror("signal error");
        if ((pid = fork()) < 0) {
            perror("fork error");
        } else if (pid == 0) {/* child */
            sleep(2);
            _exit(0);
        }

        pause();/* parent */
        exit(0);
}

static void
sig_cld(int signo)/* interrupts pause() */
{
    pid_t    pid;
    int status;

    printf("SIGCLD received\n");
    if (signal(SIGCLD, sig_cld) == SIG_ERR)/* reestablish handler */
        perror("signal error"   );
    if ((pid = wait(&status)) < 0)/* fetch child status */
        perror("wait error");
    printf("pid = %d\n", pid);
}

程序清单10- 4  sleep 的简单而不完整的实现

#include<signal.h>
#include<unistd.h>

/**存在的问题是,可能在一个繁忙的系统中调用pause之前超时,
 * 直接调用信号处理程序,pause后如果没有捕捉到其他信号,
 * 该程序将永远被挂起
 */
static void
sig_alrm(int signo)
{
        /* nothing to d o, just return to wake up the pause */
}

unsigned int
sleep1(unsigned int nsecs)
{
    if (signal(SIGALRM, sig_alrm) == SIG_ERR)
        return(nsecs);
    alarm(nsecs);/*      start the timer */
    pause();/* next caught signal wakes us up */
    return(alarm(0));/* turn off timer, return unslept time */
}

程序清单10- 5  sleep 的另一个(不完善)实现

#include<setjmp.h>
#include<signal.h>
#include<unistd.h>

static jmp_buf env_alrm;

static void
sig_alrm(int signo)
{
    longjmp(env_alrm, 1);
}

unsigned int
sleep2(unsigned int nsecs)
{
    if (signal(SIGALRM, sig_alrm) == SIG_ERR)
        return(nsecs);
    if(setjmp(env_alrm) == 0){
        alarm(nsecs);/*      start the timer */
        pause();/* next caught signal wakes us up */
    }

    return(alarm(0));/* turn off timer, return unslept time */
}

程序清单10- 6  在一个捕获其他信号的程序中调用sleep2

#include "util.h"

unsigned int sleep2(unsigned int);
static void sig_int(int);

int
main(void)
{
    unsigned int unslept;
    if (signal(SIGINT, sig_int) == SIG_ERR)
        err_sys("signal(SIGINT) error");
    unslept = sleep2(5);
    printf("sleep2 returned: %u\n", unslept);
    exit(0);
}

static void
sig_int(int signo)
{
    int i, j;
    volatile int k;
    /*
     * Tune these loops to run for more than 5 seconds
     * on whatever system this test program is run.
     */
    printf("\nsig_int starting\n");
    for (i = 0; i < 300000; i++)
        for (j = 0; j < 4000; j++)
            k += i * j;
    printf("sig_int finished\n");
}
/*
 [email protected]:~/Coding/apue/signals$ ./a.out
 ^C
 sig_int starting
 sleep2 returned: 0
 [email protected]:~/Coding/apue/signals$
 */

程序清单10- 7  具有超时限制的read调用

#include "util.h"

static void sig_alrm(int);

int
main(void)
{
    int n;
    char line[MAXLINE];
    if (signal(SIGALRM, sig_alrm) == SIG_ERR)
        err_sys("signal(SIGALRM) error");
    alarm(10);
    if ((n = read(STDIN_FILENO, line, MAXLINE)) < 0)
        err_sys("read error");
    alarm(0);
    write(STDOUT_FILENO, line, n);
    exit(0);
}

static void
sig_alrm(int signo)
{
        /* nothing to do, just return to interrupt the read */
}
/*
 [email protected]:~/Coding/apue/signals$ ./a.out
 read error: Interrupted system call (如果长时间不输入,则发现系统调用被中断)
 [email protected]:~/Coding/apue/signals$ ./a.out
 oewutjowerjtlewrt
 oewutjowerjtlewrt
 [email protected]:~/Coding/apue/signals$
*/

程序清单10- 8  使用longjmp,带超时限制,调用read

#include "util.h"
#include <setjmp.h>

static void sig_alrm(int);
static jmp_buf env_alrm;

int
main(void)
{
    int n;
    char line[MAXLINE];
    if (signal(SIGALRM, sig_alrm) == SIG_ERR)
        err_sys("signal(SIGALRM) error");
    if (setjmp(env_alrm) != 0)
        err_quit("read timeout");

    alarm(10);
    if ((n = read(STDIN_FILENO, line, MAXLINE)) < 0)
        err_sys("read error");
    alarm(0);

    write(STDOUT_FILENO, line, n);
    exit(0);
}

static void
sig_alrm(int signo)
{
    longjmp(env_alrm, 1);
}

程序清单10- 9  sigaddset,sigdelset,sigismember的实现(假定信号集合是整型)

#include<signal.h>
#include<errno.h>
/**
 * 假设把 sigset_t 视为整数,各种位操作
 */
/* <signal.h> usually defines NSIG to include signa l number 0 */
#define SIGBAD(signo)((signo) <= 0 || (signo) >= NSIG)

int sigaddset(sigset_t *set, int signo)
{
    if (SIGBAD(signo)) { errno = EINVAL; return(-1); }

    *set |= 1 << (signo - 1);/* turn bit on */
    return(0);
}       

int
sigdelset(sigset_t *set, int signo)
{
    if (SIGBAD(signo)) { errno = EINVAL; return(-1); }
    *set &= ~(1 << (signo - 1));/* turn bit off */
    retur   n(0);
}

int
sigismember(const sigset_t *set, int signo)
{
    if (SIGBAD(signo)) { errno = EINVAL; return(-1); }
    return((*set & (1 << (signo - 1))) != 0);
}

程序清单10-10  为进程打印信号屏蔽字

#include "util.h"
#include<errno.h>

void
pr_mask(const char *str){
	sigset_t sigset;
	int errno_save;

	errno_save = errno;
	if(sigprocmask(0, NULL, &sigset) < 0)
		err_sys("sigpromask failed.");
	printf("%s",str);
	if(sigismember(&sigset, SIGINT))
        printf("SIGINT ");
	if(sigismember(&sigset, SIGQUIT))
        printf("SIGQUIT ");
	if(sigismember(&sigset, SIGUSR1))
        printf("SIGUSR1 ");
	if(sigismember(&sigset, SIGALRM))
        printf("SIGARM ");

	//remaining signals can get here.
	printf("\n");
	errno = errno_save;
}

程序清单10-11  信号设置和 sigpromask 实例

#include "util.h"

static void sig_quit(int);

int
main(void)
{
    sigset_t newmask, oldmask, pendmask;
    if (signal(SIGQUIT, sig_quit) == SIG_ERR)
        err_sys("can't catch SIGQUIT");
    /*
    * Block SIGQUIT and save current signal mask.
    */
    sigemptyset(&newmask);
    sigaddset(&newmask, SIGQUIT);
    if (sigprocmask(SIG_BLOCK, &newmask, &oldmask) < 0)
        err_sys("SIG_BLOCK error");

    sleep(5);/* SIGQUIT here will remain pending */

    if (sigpending(&pendmask) < 0)
        err_sys("sigpending error");
    if (sigismember(&pendmask, SIGQUIT))
        printf("\nSIGQUIT pending\n");

    /*
    * Reset signal mask which unblocks SIGQUIT.
    */
    if (sigprocmask(SIG_SETMASK, &oldmask, NULL) < 0)
        err_sys("SIG_SETMASK error");
    printf("SIGQUIT unblocked\n");

    sleep(5);/* SIGQUIT here will terminate with core file */
    exit(0);
}

static void
sig_quit(int signo)
{
    printf("caught SIGQUIT\n");
    if (signal(SIGQUIT, SIG_DFL) == SIG_ERR)
        err_sys("can't reset SIGQUIT");
}

程序清单10-12  用 sigaction 实现的 signal 函数

#include "util.h"
// Reliable version of signal(),using POSIX sigaction;
Sigfunc *signal(int signo,Sigfunc *func){
	struct sigaction act,oact;

	act.sa_handler = func;
	sigemptyset(&act.sa_mask);
	act.sa_flags = 0;
	if(signo == SIGALRM){
		#ifdef SA_INTERRUPT
			act.sa_flags |= SA_INTERRUPT;
		#endif
	}else{
		#ifdef SA_RESTART
			act.sa_flags |= SA_RESTART;
		#endif
	}
	if(sigaction(signo,&act,&oact)<0)
		return(SIG_ERR);
	return(oact.sa_handler);
}

程序清单10-13  阻止任何被中断系统调用重启动的的 signal 函数

#include "util.h"

// will stop all the inttrupted signal,that is sigaction's
//default behavior ,so deal with the early aspects;
Sigfunc *
signal_intr(int signo, Sigfunc *func)
{
    struct sigaction    act, oact;
    act.sa_handler = func;
    sigemptyset(&act.sa_mask);
    act.sa_flags = 0;

#ifdef SA_INTERRUPT
    act.sa_flags |= SA_INTERRUPT;
#endif
    if (sigaction(signo, &act, &oact) < 0)
        return(SIG_ERR);
    return(oact.sa_handler);
}

程序清单10-14  信号屏蔽字,sigsetjmp,siglongjmp 实例

#include "util.h"
#include<setjmp.h>
#include<time.h>

static void sig_usr(int),sig_alrm(int);
static sigjmp_buf jmpbuf;
static volatile sig_atomic_t canjmp;

int
main(void){
	if(signal(SIGUSR1,sig_usr) == SIG_ERR)
		err_sys("register signal SIGUSR1 error");
	if(signal(SIGALRM,sig_alrm) == SIG_ERR)
		err_sys("register signal SIGALRM error");

	pr_mask("starting main:");

	if(sigsetjmp(jmpbuf,1)){
		pr_mask("ending main:");
		exit(0);
	}

	canjmp = 1;// now sigsetjmp is ok ,can jmp there
	for(;;)
		pause();
}

static void
sig_usr(int signo){
	time_t starttime;
	if(canjmp == 0)
		return;//not prepare well,so ignore it ;
	pr_mask("starting sig_usr:");
	alarm(3); // SIGALRM in 3 sec
	starttime = time(NULL);
	for(;;)
		if(time(NULL) > starttime + 5)
			break;
	pr_mask("ending sig_usr:");

	canjmp = 0;
	siglongjmp(jmpbuf,1);
}

static void
sig_alrm(int signo){
	pr_mask("in sig_alrm:");
}

程序清单10-15  保护临界区不被信号中断

#include "util.h"

static void sig_int(int);

int
main(void)
{
    sigset_t newmask, oldmask, waitmask;
    pr_mask("program start: ");
    if (signal(SIGINT, sig_int) == SIG_ERR)
        err_sys("signal(SIGINT) error");
    sigemptyset(&waitmask);
    sigaddset(&waitmask, SIGUSR1);
    sigemptyset(&newmask);
    sigaddset(&newmask, SIGINT);
    /*
     * Block SIGINT and save current signal mask.
     * */
    if (sigprocmask(SIG_BLOCK, &newmask, &oldmask) < 0)
        err_sys("SIG_BLOCK error");
    /*
     * Critical region of code.
     */
    pr_mask("in critical region: ");
    /*
     * * Pause, allowing all signals except SIGUSR1.
     */
    if (sigsuspend(&waitmask) != -1)
        err_sys("sigsuspend error");
    pr_mask("after return from sigsuspend: ");
    /*
     * Reset signal mask which unblocks SIGINT.
     */
    if (sigprocmask(SIG_SETMASK, &oldmask, NULL) < 0)
        err_sys("SIG_SETMASK error");

    /*
     * And continue processing ...
     */
    pr_mask("program exit: ");

    exit(0);
}

static void
sig_int(int signo)
{
    pr_mask("\nin sig_int: ");
}

程序清单10-16  用sigsuspend等待一个全局变量被设置

#include "util.h"

volatile sig_atomic_t	quitflag;	/* set nonzero by signal handler */

static void
sig_int(int signo)	/* one signal handler for SIGINT and SIGQUIT */
{
	if (signo == SIGINT)
		printf("\ninterrupt\n");
	else if (signo == SIGQUIT)
		quitflag = 1;	/* set flag for main loop */
}

int
main(void)
{
	sigset_t	newmask, oldmask, zeromask;

	if (signal(SIGINT, sig_int) == SIG_ERR)
		err_sys("signal(SIGINT) error");
	if (signal(SIGQUIT, sig_int) == SIG_ERR)
		err_sys("signal(SIGQUIT) error");

	sigemptyset(&zeromask);
	sigemptyset(&newmask);
	sigaddset(&newmask, SIGQUIT);

	/*
	 * Block SIGQUIT and save current signal mask.
	 */
	if (sigprocmask(SIG_BLOCK, &newmask, &oldmask) < 0)
		err_sys("SIG_BLOCK error");

	while (quitflag == 0)
		sigsuspend(&zeromask);
	// suspend will use zeromask to replace the new mask , this is to say ,
	//here we temporarily change the signal mask, can catch any signal ;
	/*
	 * SIGQUIT has been caught and is now blocked; do whatever.
	 */
	quitflag = 0;

	/*
	 * Reset signal mask which unblocks SIGQUIT.
	 */
	if (sigprocmask(SIG_SETMASK, &oldmask, NULL) < 0)
		err_sys("SIG_SETMASK error");

	exit(0);
}

程序清单10-17  父子进程可以用来实现同步的例程(TELL_WAIT)

#include "util.h"

static volatile sig_atomic_t sigflag; 	/* set nonzero by sig handler */
static sigset_t newmask, oldmask, zeromask;

static void sig_usr(int signo)	/* one signal handler for SIGUSR1 and SIGUSR2 */
{
	sigflag = 1;
}

void TELL_WAIT(void)
{
	if (signal(SIGUSR1, sig_usr) == SIG_ERR)
		err_sys("signal(SIGUSR1) error");
	if (signal(SIGUSR2, sig_usr) == SIG_ERR)
		err_sys("signal(SIGUSR2) error");
	sigemptyset(&zeromask);
	sigemptyset(&newmask);
	sigaddset(&newmask, SIGUSR1);
	sigaddset(&newmask, SIGUSR2);

	/*
	 * Block SIGUSR1 and SIGUSR2, and save current signal mask.
	 */
	if (sigprocmask(SIG_BLOCK, &newmask, &oldmask) < 0)
		err_sys("SIG_BLOCK error");
}

void TELL_PARENT(pid_t pid)
{
	kill(pid, SIGUSR2);		/* tell parent we're done */
}

void WAIT_PARENT(void)
{
	while (sigflag == 0)
		sigsuspend(&zeromask);	/* and wait for parent */
	sigflag = 0;

	/*
	 * Reset signal mask to original value.
	 */
	if (sigprocmask(SIG_SETMASK, &oldmask, NULL) < 0)
		err_sys("SIG_SETMASK error");
}

void TELL_CHILD(pid_t pid)
{
	kill(pid, SIGUSR1);			/* tell child we're done */
}

void WAIT_CHILD(void)
{
	while (sigflag == 0)
		sigsuspend(&zeromask);	/* and wait for child */
	sigflag = 0;

	/*
	 * Reset signal mask to original value.
	 */
	if (sigprocmask(SIG_SETMASK, &oldmask, NULL) < 0)
		err_sys("SIG_SETMASK error");
}

程序清单10-18  abort 的 POSIX.1 实现

#include <signal.h>
#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>

void
abort(void)         /* POSIX-style abort() function */
{
    sigset_t            mask;
    struct sigaction action;

    /*
     * * Caller can't ignore SIGABRT, i   f so reset to default.
     * *       */
    sigaction(SIGABRT, NULL, &action);
    if (action.sa_handler == SIG_IGN) {
        action.sa_handler = SIG_DFL;
        sigaction(SIGABRT, &action, NULL);
    }

    if (action.sa_handler == SIG_DFL)
        fflush(NULL);/* flush all open stdio streams */
    /*
     * *   * Caller can't block SIGA          BRT; make sure it's unblocked.
     * *       */
    sigfillset(&mask);
    igdelset(&mask, SIGABRT);/* mask has only SIGABRT turned off */
    sigprocmask(SIG_SETMASK, &mask, NULL);
    kill(getpid(), SIGABRT);/* send the signal */

    /*
     * *   * If we're here, p rocess caught SIGABRT and returned.
     * *       */
    fflush(NULL);/* flush all                open stdio streams */
    action.sa_handler = SIG_DFL;
    sigaction(SIGABRT, &action, NULL);/* reset to default */
    igprocmask(SIG_SETMASK, &mask, NU  LL);/* just in case ... */
    kill(getpid(), SIGABRT);/* and one mor                  e time */
    exit(1);/* this should never be executed ... */
}

程序清单10-19  用 system 调用 ed 编辑器

#include "util.h"

static void sig_int(int signo){
    printf("Caught SIGINT \n");
}
static void sig_chld(int signo){
    printf("Caught SIGCHLD \n");
}
int main(){
 if(signal(SIGINT, sig_int)  == SIG_ERR)
     err_sys("signal(SIGINT) error");
 if(signal(SIGCHLD, sig_chld) == SIG_ERR)
     err_sys("signal(SIGCHLD) error");

 if(system("/bin/ed") < 0)
     err_sys("system(ed) error");

 exit(0);
}

程序清单10-20  system 函数的 POSIX.1 正确实现

#include<sys/wait.h>
#include<errno.h>
#include<signal.h>
#include<unistd.h>
#include <stdio.h>

int
system(  const char *cmdstring)/* with appropriate signal handling */
{
    pid_t                   pid;
    int status;
    struct sigaction ignore, saveintr, savequit;
    sigset_t chldmask, savemask;
    if (cmdstring == NULL)
        return(1);                  /* always a command processor with UNIX */

    ignore.sa_handler = SIG_IGN;/* ignore SIGINT and SIGQUIT */
    sigemptyset(&ignore.sa_mask);
    ignore.sa_flags = 0;
    if (sigaction(SIGINT, &ignore, &saveintr) < 0)
        return(-1);
    if (sigaction(SIGQUIT, &ignore, &savequit) < 0)
        return(-1);
    sigemptyset(&chldmask);/* now block SIGCHLD */
    sigaddset(&chldmask, SIGCHLD);
    if(sigprocmask(SIG_BLOCK, &chldmask, &savemask) < 0)
        return(-1);

    if ((pid = fork()) < 0) {
        status = -1;/* probably out of processes */
    } else if (pid == 0)     {/* child */
        /* restore previous signal actions & reset signal ma           sk */
        sigaction(SIGINT, &saveintr, NULL);
        sigaction(SIGQUIT, &savequit, NULL);
        sigprocmask(SIG_SETMASK, &savemask, NULL);

        execl("/bin/sh", "sh", "-c", cmdstring, (char *)0);
        _exit(127);/* exec error */
    } else {                                /* parent */
        while (waitpid(pid, &status, 0) < 0)
            if (errno != EINTR) {
                status = -1; /* error other than EINTR from waitpid() */
                break;
            }
    }

    /* restore previous signal actions & reset signal mask */
    if (sigaction(SIGINT, &saveintr, NULL) < 0)
        return(-1);
    if (sigaction(SIGQUIT, &savequit, NULL) < 0)
        return(-1);
    printf("before unblock SIGCHLD...\n");
    if (sigprocmask(SIG_SETMASK, &savemask, NULL) < 0)
        return(-1);

    return(status);
}

程序清单10-21  sleep 的可靠实现

#include "util.h"

static void
sig_alrm(int signo)
{
    /* nothing to do, just returning wakes up sigsuspend() */
}

unsigned int
sleep(unsigned int nsecs)
{
    struct sigaction newact, oldact;
    sigset_t                newmask, oldmask, suspmask;
    unsigned int unslept;

    /* set our handler, save previous information */
    newact.sa_handler = sig_alrm;
    sigemptyset(&newact.sa_mask);
    newact.sa_flags = 0;
    sigaction(SIGALRM, &newact, &oldact);

    /* block SIGALRM and save current signal mask */
    sigemptyset(&newmask);
    sigaddset(&newmask, SIGALRM);
    sigprocmask(SIG_BLOCK, &newmask, &oldmask);

    alarm(nsecs);

    suspmask = oldmask;
    sigdelset(&suspmask, SIGALRM);/* make sure SIGALRM isn't    blocked */
    sigsuspend(&suspmask);/* wait for any signal to be caught */

    /* some signal has been caught, SIGALRM is now blocked */

    unslept = alarm(0);
    sigaction(SIGALRM, &oldact, NULL);/* reset previous action */

    /* reset signal mask, which unblocks SIGALRM  */
        sigprocmask(SIG_SETMASK, &oldmask, NULL);
    return(unslept);
}

时间: 2024-07-30 13:50:47

APUE信号-程序汇总的相关文章

APUE: 信号相关系统调用和库函数

信号就是软件中断,信号提供一种处理异步事件的方法. 信号出现时按照下列方式处理: 1.忽略此信号,有两个信号不能忽略. 2.捕捉此信号,有两个信号不能被捕捉. 3.默认处理,少数默认处理是忽略,大部分默认处理是终止. ctrl+D组合键,不是信号,只是EOF字符 linux中1-31为普通信号:34-64为实时信号. trap-l 命令查看所有信号,64个 信号从1开始,没有0. SIGHUP:终端接口检测到连接断开发出该信号, SIGINT:ctrl+c,终端中断符,一般用来停止一个失去控制的

Android L Camera2 API 使用实例程序汇总

在网上发现几个使用Camera API2开发的实例程序,总结一下方便后续参考: 1.Camera2 Basic : https://github.com/googlesamples/android-Camera2Basic This sample demonstrates how to use basic functionalities of Camera2 API. You can learn how to iterate through characteristics of all the

APUE 线程 - 程序清单

程序清单11-1 打印线程ID #include "util.h" #include<pthread.h> pthread_t ntid; void printids(const char *s) { pid_t pid; pthread_t tid; pid = getpid(); tid = pthread_self(); //之所以打印16进制,便于pthread_t是结构体的话看地址: printf("%s pid %u tid %u (0x%x)\n&q

小程序汇总

1. C#相关文章(链接地址) 1.1 C# 基础(一) 访问修饰符.ref与out.标志枚举等等 1.2 C# 基础(二) 类与接口 1.3 C# DateTime日期格式化 1.4 C# DateTime与时间戳转换 1.5 C# Web应用调试开启外部访问 2. C#问题区 2.1 Log4Net 生成多个文件.文件名累加解决方法 2.2 未在本地计算机上注册"OraOLEDB.Oracle"提供程序 2.3 C# 发送邮件 附件名称为空 2.4 Visual Studio 由于

Java入门的程序汇总--第一部分

Java入门的基础程序,虽然很简单,也要多练习,下面有重点的总结一下 1.HelloWorld这个不说了 2.常量与变量部分 基本数据类型使用 1 public class Javashujuleixing { 2 public static void main(String[] args) { 3 String name="张三"; 4 char sex='男'; 5 int num=18; 6 double price=120.5; 7 boolean isOK=true; 8 S

APUE学习笔记——10信号——信号接口函数 signal 和 sigaction

signal函数 signal函数是早起Unix系统的信号接口,早期系统中提供不可靠的信号机制.在后来的分支中,部分系统使用原来的不可靠机制定有signal函数,如 Solaris 10 .而更多的系统采用新语义 可靠信号机制,如4.4BSD. 出于signal函数不同系统的不统一性,我们一般使用sigaction函数取代它.关于sigaction函数,我们在本文后面做详细介绍. 函数原型: #include <signal.h> void (*signal(int signo,void (*

1万字!彻底看懂微信小程序

Q:为什么说小程序如炮友? A:小程序刚发布不久就流行一个段子:APP如原配,一年不用几次:服务号如情人,一个月固定几次:订阅号如酒店小卡片,天天可以卖广告:小程序像炮友,用完就走. 资本如嫖客,各个平台和垂直类掠夺者已经瓜分掉了线上流量,那么未来争夺的流量战场必然在实体场景,很多巨头其实已经证明了线下流量庞大的潜力.在快递包裹上印上自己的二维码关注公众号形成二次寄出快递的粘性,PokemonGo让用户在实体地图上捕获小精灵. 未来的入口不限于二维码,而是一切的富媒体.二维码之于2D识别,复杂图

常用程序管理命令[转]

ps ps参数 [[email protected] ~]# ps aux <==观察系统所有的程序数据 [[email protected] ~]# ps -lA <==也是能够观察所有系统的数据 [[email protected] ~]# ps axjf <==连同部分程序树状态 选项与参数: -A :所有的 process 均显示出来,与 -e 具有同样的效用: -a :不与 terminal 有关的所有 process : -u :有效使用者 (effective user)

Linux系统开发6 信号

[本文谢绝转载,原文来自http://990487026.blog.51cto.com] <大纲> Linux系统开发6 信号 linux系统有64种信号 signal man文档 终端按键信号 ctrl +c SIGIN ctrl +z SIGTSTP ctrl +\ SIGQUIT 硬件产生信号 浮点数例外信号  访问非法内存 kill()函数 信号与权限 kill()函数的pid 与返回值 信号产生原因 raise() 信号 abort() 信号 alarm() 信号 收到信号的默认操作