gcc编译报错 xcrun: error: invalid active developer path (/Library/Developer/CommandLineTools), missing xcrun at: /Library/Developer/CommandLineTools/usr/bin/xcrun
1 |
xcode-select –install |
习惯了Linux,用上Mac真的是不适应,真他妈烦
gcc编译报错 xcrun: error: invalid active developer path (/Library/Developer/CommandLineTools), missing xcrun at: /Library/Developer/CommandLineTools/usr/bin/xcrun
1 |
xcode-select –install |
习惯了Linux,用上Mac真的是不适应,真他妈烦
1 2 3 4 5 6 7 8 9 |
#include "stdio.h" int main(int argc, char ** argv) { printf("%s\n", __FILE__);//当前程序文件 printf("%d\n" ,__LINE__);//当前行数 printf("%s\n", __DATE__);//当前日期 //printf("%s", __STDC__);//不知道是干啥的,不注释掉别的都不执行 printf("%s\n", __TIME__);//当前时间 } |
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 |
#include <stdio.h> #include <unistd.h> #include <signal.h> /*信号集合在声明之后必须用到初始化函数!否则不能使用! sigprocmask函数可以用来设置屏蔽字,他有三种方式,1、把屏蔽信号设置成为newmask和原来信号屏蔽字的并集,2、从原有信号集合中剔除newmask信号集合中的信号,3、将屏蔽信号集设置成newmask内的集合。 注意,对信号进行屏蔽并不是忽略信号,而是将信号放入味未决信号集合中。 */ /*自定义的错误处理函数*/ void my_err(const char * err_string, int line) { fprintf(stderr, "line:%d ", line); perror(err_string); exit(1); } /*SIGINT的处理函数*/ void hander_sigint(int signo) { printf("recv SIGINT\n"); } int main() { sigset_t newmask, oldmask, pendmask; // 定义信号集 /*安装信号处理函数*/ if (signal(SIGINT, hander_sigint) == SIG_ERR) { my_err("signal", __LINE__); } /*睡眠10秒*/ sleep(10); /*初始化信号集newmask并将SIGINT添加进去*/ sigemptyset(&newmask); //初始化newmask信号集为一个空信号集 sigaddset(&newmask, SIGINT); //在信号集中添加SIGINT信号 /*屏蔽信号SIGINT*/ if (sigprocmask(SIG_BLOCK, &newmask, &oldmask) < 0) {//sigprocmask函数可以用来设置屏蔽字,他有三种方式,1、把屏蔽信号设置成为newmask和原来信号屏蔽字的并集,2、从原有信号集合中剔除newmask信号集合中的信号,3、将屏蔽信号集设置成newmask内的集合;oldmask用来返回原来的信号集。 my_err("sigprocmask", __LINE__); } else { printf("SIGINT blocked\n"); } sleep(10); /*获取未决信号队列*/ if (sigpending(&pendmask) < 0) { //获取没有被处理的信号,放入pendmask信号集中 my_err("sigpending", __LINE__); } /*检查未决信号队列里面是否有SIGINT*/ switch (sigismember(&pendmask, SIGINT)) { //sigismember函数可以判断一个信号集合中是不是存在每一个信号,如果有返回1,没有返回0 case 0: printf("SIGINT is not in pending queue\n"); break; case 1: printf("SIGINT is in pending queue\n"); break; case -1: my_err("sigismember", __LINE__); break; default: break; } /*解除对SIGINT的屏蔽*/ if (sigprocmask(SIG_SETMASK, &oldmask, NULL) < 0) { my_err("sigprocmask", __LINE__); } else { printf("SIGINT unblocked\n"); } while(1) ; return 0; } |
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 |
#include <stdio.h> #include <signal.h> #include <sys/time.h> #include <unistd.h> /*配置这个定时器需要设置一个结构体struct itimerval value,这个结构体中存着第一个定时数和接下来循环的定时数,这个很像是51单片机中定时器方式2,it_value里面存着第一次执行的值,it_interval里面存着接下来的值,相当于填初值。 setitimer函数可以设置当时的模式,主要有按照实际时间和内核运行时间,这两种模式触发的信号不同*/ /*信号处理程序*/ void handler_sigtime(int signo) { switch (signo) { case SIGALRM: //为结束进程信号,可以被阻塞 printf("recv SIGALRM,这个应该多\n"); break; case SIGPROF: printf("recv SIGPROF,我觉得这个应该少\n"); break; default: break; } } int main() { struct itimerval value; /*安装信号处理函数*/ signal(SIGALRM, handler_sigtime); signal(SIGPROF, handler_sigtime); /*初始化value结构*/ value.it_value.tv_sec = 1; // 第一次1秒触发信号 value.it_value.tv_usec = 0; value.it_interval.tv_sec = 5; // 第二次开始每5秒触发信号 value.it_interval.tv_usec = 0; /*设置定时器*/ setitimer(ITIMER_REAL, &value, NULL); //按照实际时间计时,相当于一个高精度的alarm函数,产生SIGALRM信号 setitimer(ITIMER_PROF, &value, NULL); //按照内核执行时间计时,产生SIGPROF信号。 while(1) ; return 0; } |
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 |
// 简单模拟ping程序的框架 #include <stdio.h> #include <signal.h> #include <unistd.h> /*这是模拟的ping命令,但是并没有ping命令的功能,因为他没有网络通信部分。 alarm是定时器,定时结束之后产生SIGALRM信号发送给调用该函数的进程,这个很简单,一看就会,不写解释了。 */ void send_ip() { /*发送回送请求报文,这里只是打印消息*/ printf("send a icmp echo request packet\n"); } void recv_ip() { /*挂起在套接字上等待数据并解析报文,这里只是使用死循环*/ while(1) ; } void handler_sigalarm(int signo) { send_ip(); alarm(2); //两秒钟之后产生SIGALRM信号 } int main() { /*安装信号处理程序*/ signal(SIGALRM, handler_sigalarm); /*触发一个SIGALRM信号给本进程*/ raise(SIGALRM); //raise函数可以向调用它的进程发送信号。 recv_ip(); return 0; } |