大四,找工作前重新整理一下过往的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
-------------------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)
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;
-------------------2016年10月14日 10:59:59-----------------
vfork()不会复制所有父进程地址空间,针对exec函数族使用在调用exec或者exit函数之前实际运行在父进程空间,并且阻塞父进程的执行
如果在调用这两个函数之前子进程依赖于父进程的进一步动作,则会导致死锁;
--------------------2016年10月13日 19:27:18-----------------
_exit()直接返回内核
exit()进行垃圾清理等工作
atexit(void (*fun)(void))
已压栈 的方式将清理函数压入