linux c编程复习笔记1-10章

大四,找工作前重新整理一下过往的linux c编程知识

本人之前学的是《linux高级程序设计》加一些网上看的文章博客,翻了一些《Unix环境高级编程(第二版)》和《Unix网络编程》玩

此次系统巩固下, 完整阅读下《Unix环境高级编程(第三版)》(虽然和第二版相比没什么多少改动 (=^ ^=)),为找工作做些准备。


记录下已生疏的点和当时学得不深的点,以及一些值得探究的点

作为一个补充记录。


-------------------2016年10月17日 15:27:08-------------
sigsuspend(sigset_t *set)
原子操作
如果在信号阻塞时将其发送给进程,那么该信号的传递就被推迟直到对它解除了阻塞。对应用程序而言,该信号好像发生解除
对SIGINT的阻塞和pause之间,如果发生了这种情况,后者如果在解除阻塞时刻和pause之间确实发生了信号,那么就出现了
问题,我们可能不会再见到该信号,这样使得pause永远阻塞。


#include 
#include 


static void sig_int(int);


int main(void){
        sigset_t newmask,oldmask,waitmask;
        printf("program start.\n");
        if(signal(SIGUSR1, sig_int) == SIG_ERR){
                perror("signal");
                return -1;
        }
        if(signal(SIGUSR2, sig_int) == SIG_ERR){
                perror("signal");
                return -1;
        }


        sigemptyset(&waitmask);
        sigaddset(&waitmask, SIGUSR1);
        sigemptyset(&newmask);
        sigaddset(&newmask, SIGUSR2);


        if(sigprocmask(SIG_BLOCK, &newmask, &oldmask) < 0){
                perror("sigprocmask");
                return -1;
        }


        printf("in critical region.\n");


        sigsuspend(&waitmask);


        if(sigprocmask(SIG_SETMASK, &oldmask, NULL) < 0){
                perror("sigprocmask");
                return -1;
        }
        printf("program exit.\n");


        return 0;
}


static void sig_int(int signo){
        printf("int sig_int:%d.\n",signo);
}



结果:
root@yb-machine:/home/yb/Unix# ./a.out &
[1] 9763
root@yb-machine:/home/yb/Unix# program start.
in critical region.
ps -aux | grep a.out
root      9763  0.0  0.0   2036   500 pts/14   S    15:45   0:00 ./a.out
root      9765  0.0  0.1   6128  2068 pts/14   S+   15:45   0:00 grep --color=auto a.out
root@yb-machine:/home/yb/Unix# kill -SIGUSR1 9763
root@yb-machine:/home/yb/Unix# kill -SIGUSR2 9763
int sig_int:12.
int sig_int:10.
program exit.
[1]+  已完成               ./a.out






system()
实现是fork+exec,并加上信号处理
忽略SIGINT和SIGQUIT,阻塞SIGCHLD



-------------------2016年10月15日 09:18:43---------------

struct tms
{
    clock_t tms_utime;
    clock_t tms_stime;
    clock_t tms_cutime;
    clock_t tms_cstime;
}
times(struct tms * buf)


u-user ;s-system;c-child


sysconf(_SC_CLK_TCK)
返回每秒嘀嗒数 ;




signal信号
sigabrt 一般abrt()函数发送,异常终止,发生转储(core)
sigint ctrl+c 发送,发送给该进程树
sigkill kill -9 命令发送,不可忽略和捕获
sigterm kill命令缺省发送 请求中止进程
sigtquit ctrl+ \ 发送,posix兼容,发送给该进程树,发生转储(core)


-------------------2016年10月14日 13:48:36----------------
free(a),连续free两次,不合理,清除掉了堆的维护信息,第一次free完后即为野指针了,没了维护信息后,无法依据清除。理论上为报错。
但在windows+codeblocks上,并未有任何异常,在linux+gcc上直接报段错误。
代码如下
char *a =(char *)malloc(5);
strcpy(a,"ddd");
    printf("%s\n",a);
    free(a);
    printf("%x  %c\n",a,a[2]);
    free(a);
    printf("%x  %c\n",a,a[2]);
    return 0;





当一个进程正常或异常终止时,内核就向其父进程发送 SIGCHLD信号



waitpid(int pid ,int * status ,int option)
pid == -1;表示等待任意子进程,和wait()一样;
pid > 0 ;等待pid号的子进程;
pid <=0 ;根据组ID(pid)等待子进程;


双重fork,防止僵死进程



-------------------2016年10月14日 10:59:59-----------------
vfork()不会复制所有父进程地址空间,针对exec函数族使用在调用exec或者exit函数之前实际运行在父进程空间,并且阻塞父进程的执行
如果在调用这两个函数之前子进程依赖于父进程的进一步动作,则会导致死锁;


--------------------2016年10月13日 19:27:18-----------------
_exit()直接返回内核
exit()进行垃圾清理等工作


atexit(void (*fun)(void))
已压栈 的方式将清理函数压入

你可能感兴趣的:(linux,c)