5sec.c
#include <stdio.h>
#include <stdlib.h>
#include <time.h>
int main()
{
time_t end;
int64_t count = 0;
end = time(NULL) + 5;
while (time(NULL) <= end)
++count;
printf("%lld\n", count);
exit(0);
}
5sec_sig.c
#include <stdio.h>
#include <stdlib.h>
#include <signal.h>
#include <unistd.h>
// volatile 去到真正存放这个值的地址取值,不要轻信内存空间的值
static volatile int loop = 1;
static void alrm_handler(int s)
{
loop = 0;
}
int main()
{
int64_t count = 0;
//signal 在alarm之前使用
signal(SIGALRM, alrm_handler);
alarm(5);
while (loop)
++count;
printf("%lld\n", count);
exit(0);
}
block.c
/* 信号屏蔽 */
#include <stdio.h>
#include <stdlib.h>
#include <signal.h>
#include <unistd.h>
static void int_handler(int s)
{
write(1, "!", 1);
}
int main()
{
int i, j;
sigset_t set, oldset, saveset;
signal(SIGINT, int_handler);
sigemptyset(&set);
sigaddset(&set, SIGINT);
sigprocmask(SIG_UNBLOCK, &set, &saveset);
for (j = 0; j < 1000; j++) {
sigprocmask(SIG_BLOCK, &set, &oldset);
for (i = 0; i < 5; i++) {
write(1, "*", 1);
sleep(1);
}
//sigprocmask(SIG_BLOCK, &set, NULL);
//SIG_SETMASK 恢复到oldset
sigprocmask(SIG_SETMASK, &oldset, NULL);
write(1, "\n", 1);
}
sigprocmask(SIG_SETMASK, &saveset, NULL);
exit(0);
}
mycat.c
/*
* 实现cat功能
* 加入信号机制
*/
#include <stdio.h>
#include <stdlib.h>
#include <sys/types.h>
#include <sys/stat.h>
#include <fcntl.h>
#include <unistd.h>
#include <errno.h>
#define BUFFSIZE 1024
int main(int argc, char **argv)
{
int sfd, dfd = 1;
char buf[BUFFSIZE];
int len, ret, pos;
if(argc != 2)
{
fprintf(stderr, "Usage...\n");
exit(1);
}
do {
sfd = open(argv[1], O_RDONLY);
if(sfd < 0)
{
if (errno != EINTR) {
perror("sfd_open()");
exit(1);
}
}
} while (sfd < 0);
while(1)
{
len = read(sfd, buf, BUFFSIZE);
if(len < 0)
{
if (errno == EINTR)
continue;
perror("read()");
break;
}
else if (len == 0)
break;
pos = 0;
while(len > 0)
{
ret = write(dfd, buf + pos, len);
if(ret < 0)
{
if (errno == EINTR)
continue;
perror("write()");
exit(1);
}
pos += ret;
len -= ret;
}
}
close(sfd);
exit(0);
}
mycp.c
/*
* 实现复制功能
* 加入信号机制
*/
#include <stdio.h>
#include <stdlib.h>
#include <sys/types.h>
#include <sys/stat.h>
#include <fcntl.h>
#include <unistd.h>
#include <errno.h>
#define BUFFSIZE 1024
int main(int argc, char **argv)
{
int sfd, dfd;
char buf[BUFFSIZE];
int len, ret, pos;
if(argc != 3)
{
fprintf(stderr, "Usage...\n");
exit(1);
}
do {
sfd = open(argv[1], O_RDONLY);
if(sfd < 0)
{
if (errno != EINTR) {
perror("sfd_open()");
exit(1);
}
}
} while (sfd < 0);
dfd = open(argv[2], O_WRONLY|O_CREAT|O_TRUNC, 0644);
do {
if(dfd < 0)
{
if (errno != EINTR) {
close(sfd);
perror("dfd_open()");
exit(1);
}
}
} while (dfd < 0);
while(1)
{
len = read(sfd, buf, BUFFSIZE);
if(len < 0)
{
if (errno == EINTR)
continue;
perror("read()");
break;
}
else if (len == 0)
break;
pos = 0;
while(len > 0)
{
ret = write(dfd, buf + pos, len);
if(ret < 0)
{
if (errno == EINTR)
continue;
perror("write()");
exit(1);
}
pos += ret;
len -= ret;
}
}
close(dfd);
close(sfd);
exit(0);
}
slowcat.c
/*
* 实现cat功能
* 加入信号机制
* 每秒显示10个字符
*/
#include <stdio.h>
#include <stdlib.h>
#include <sys/types.h>
#include <sys/stat.h>
#include <fcntl.h>
#include <unistd.h>
#include <errno.h>
#include <signal.h>
#define CPS 10
#define BUFFSIZE CPS
static volatile int loop = 0;
static void alrm_handler(int s)
{
alarm(1);
loop = 1;
}
int main(int argc, char **argv)
{
int sfd, dfd = 1;
char buf[BUFFSIZE];
int len, ret, pos;
if(argc != 2)
{
fprintf(stderr, "Usage...\n");
exit(1);
}
signal(SIGALRM, alrm_handler);
alarm(1);
do {
sfd = open(argv[1], O_RDONLY);
if(sfd < 0)
{
if (errno != EINTR) {
perror("sfd_open()");
exit(1);
}
}
} while (sfd < 0);
while(1)
{
while(!loop)
pause();
loop = 0;
while ((len = read(sfd, buf, BUFFSIZE)) < 0) {
if (errno == EINTR)
continue;
perror("read()");
//如果出错 只能跳出内部这个循环
break;
}
if (len == 0)
break;
pos = 0;
while(len > 0)
{
ret = write(dfd, buf + pos, len);
if(ret < 0)
{
if (errno == EINTR)
continue;
perror("write()");
exit(1);
}
pos += ret;
len -= ret;
}
//sleep(1);
}
close(sfd);
exit(0);
}
slowcat_settimer.c
/*
* 实现cat功能
* 加入信号机制
*
* 使用setitimer()实现
* settimer工作机制是,先对it_value倒计时,当it_value为零时触发信号,
* 然后重置为it_interval,继续对it_value倒计时,一直这样循环下去
*
* 假如it_value为0是不会触发信号的,所以要能触发信号,it_value得大于0;
* 如果it_interval为零,只会延时,不会定时(也就是说只会触发一次信号)。
*
* 显示效果:开始时10s后打印10个字符 以后每秒打印10个字符
*/
#include <stdio.h>
#include <stdlib.h>
#include <sys/types.h>
#include <sys/stat.h>
#include <fcntl.h>
#include <unistd.h>
#include <errno.h>
#include <signal.h>
#include <sys/time.h>
#define CPS 10
#define BUFFSIZE CPS
static volatile int loop = 0;
static void alrm_handler(int s)
{
//alarm(1);
loop = 1;
}
int main(int argc, char **argv)
{
int sfd, dfd = 1;
char buf[BUFFSIZE];
int len, ret, pos;
struct itimerval itv;
if(argc != 2)
{
fprintf(stderr, "Usage...\n");
exit(1);
}
signal(SIGALRM, alrm_handler);
//alarm(1);
itv.it_interval.tv_sec = 1;
itv.it_interval.tv_usec = 0;
itv.it_value.tv_sec = 10;
itv.it_value.tv_usec = 0;
if (setitimer(ITIMER_REAL, &itv, NULL) < 0) {
perror("setitimer()");
exit(1);
}
do {
sfd = open(argv[1], O_RDONLY);
if(sfd < 0)
{
if (errno != EINTR) {
perror("sfd_open()");
exit(1);
}
}
} while (sfd < 0);
while(1)
{
while(!loop)
pause();
loop = 0;
while ((len = read(sfd, buf, BUFFSIZE)) < 0) {
if (errno == EINTR)
continue;
perror("read()");
//如果出错 只能跳出内部这个循环
break;
}
if (len == 0)
break;
pos = 0;
while(len > 0)
{
ret = write(dfd, buf + pos, len);
if(ret < 0)
{
if (errno == EINTR)
continue;
perror("write()");
exit(1);
}
pos += ret;
len -= ret;
}
//sleep(1);
}
close(sfd);
exit(0);
}
slowcat2.c
/*
* 实现cat功能
* 加入信号机制
* 每秒显示10个字符
* 积攒权限(输出字符)
*/
#include <stdio.h>
#include <stdlib.h>
#include <sys/types.h>
#include <sys/stat.h>
#include <fcntl.h>
#include <unistd.h>
#include <errno.h>
#include <signal.h>
#define CPS 10
#define BUFFSIZE CPS
#define BURST 100
//sig_atomic_t 信号原子类型,这个类型的取值和赋值操作一条指令完成
static volatile sig_atomic_t token = 0;
static void alrm_handler(int s)
{
alarm(1);
++token;
if (token > BURST)
token = BURST;
}
int main(int argc, char **argv)
{
int sfd, dfd = 1;
char buf[BUFFSIZE];
int len, ret, pos;
if(argc != 2)
{
fprintf(stderr, "Usage...\n");
exit(1);
}
signal(SIGALRM, alrm_handler);
alarm(1);
do {
sfd = open(argv[1], O_RDONLY);
if(sfd < 0)
{
if (errno != EINTR) {
perror("sfd_open()");
exit(1);
}
}
} while (sfd < 0);
while(1)
{
while(token <= 0)
pause();
--token;
while ((len = read(sfd, buf, BUFFSIZE)) < 0) {
if (errno == EINTR)
continue;
perror("read()");
break;
}
if (len == 0)
break;
pos = 0;
while(len > 0)
{
ret = write(dfd, buf + pos, len);
if(ret < 0)
{
if (errno == EINTR)
continue;
perror("write()");
exit(1);
}
pos += ret;
len -= ret;
}
//sleep(1);
}
close(sfd);
exit(0);
}
star.c
/* 信号初探 */
#include <stdio.h>
#include <stdlib.h>
#include <signal.h>
#include <unistd.h>
static void int_handler(int s)
{
write(1, "!", 1);
}
int main()
{
int i;
// signal(SIGINT, SIG_IGN);
signal(SIGINT, int_handler);
for (i = 0; i < 10; i++) {
write(1, "*", 1);
sleep(1);
}
exit(0);
}
susp.c
/*
* 信号屏蔽
* 每行打印5个*,然后暂停等^C
* 如果在中间收到了^C,那么下一行5个*也会继续打印
*
*/
#include <stdio.h>
#include <stdlib.h>
#include <signal.h>
#include <unistd.h>
static void int_handler(int s)
{
write(1, "!", 1);
}
int main()
{
int i, j;
sigset_t set, oldset, saveset;
signal(SIGINT, int_handler);
sigemptyset(&set);
sigaddset(&set, SIGINT);
sigprocmask(SIG_UNBLOCK, &set, &saveset);
sigprocmask(SIG_BLOCK, &set, &oldset);
for (j = 0; j < 1000; j++) {
for (i = 0; i < 5; i++) {
write(1, "*", 1);
sleep(1);
}
//sigprocmask(SIG_BLOCK, &set, NULL);
//SIG_SETMASK 恢复到oldset
write(1, "\n", 1);
sigsuspend(&oldset);
/*
sigset_t tmpset;
sigprocmask(SIG_SETMASK, &oldset, &tmpset);
pause();
sigprocmask(SIG_SETMASK, &tmpset, NULL);
*/
}
sigprocmask(SIG_SETMASK, &saveset, NULL);
exit(0);
}
susp_rt.c
/*
* 信号屏蔽
* 每行打印5个*,然后暂停等^C
* 如果在中间收到了^C,那么下一行5个*也会继续打印
*
* 实时信号实现
* 实时信号不丢失 :
*/
#include <stdio.h>
#include <stdlib.h>
#include <signal.h>
#include <unistd.h>
#define MYRTSIG (SIGRTMIN+6)
static void mysig_handler(int s)
{
write(1, "!", 1);
}
int main()
{
int i, j;
sigset_t set, oldset, saveset;
signal(MYRTSIG, mysig_handler);
sigemptyset(&set);
sigaddset(&set, MYRTSIG);
sigprocmask(SIG_UNBLOCK, &set, &saveset);
sigprocmask(SIG_BLOCK, &set, &oldset);
for (j = 0; j < 1000; j++) {
for (i = 0; i < 5; i++) {
write(1, "*", 1);
sleep(1);
}
//sigprocmask(SIG_BLOCK, &set, NULL);
//SIG_SETMASK 恢复到oldset
write(1, "\n", 1);
sigsuspend(&oldset);
}
sigprocmask(SIG_SETMASK, &saveset, NULL);
exit(0);
}