Skip to content

Commit 4766b28

Browse files
committed
udp
1 parent 82849c6 commit 4766b28

File tree

6 files changed

+577
-0
lines changed

6 files changed

+577
-0
lines changed

LinuxCodes/signal_block.c

Lines changed: 190 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,190 @@
1+
/*
2+
#include<stdio.h>
3+
#include<signal.h>
4+
#include<unistd.h>
5+
6+
int flag_sigusr1 = 0;
7+
int flag_sigusr2 = 0;
8+
9+
void sig_usr1(int signo)
10+
{
11+
fprintf(stdout, "caught SIGUSR1\n");
12+
flag_sigusr1 = 1;
13+
return;
14+
}
15+
16+
void sig_usr2(int signo)
17+
{
18+
fprintf(stdout, "caught SIGUSR2\n");
19+
flag_sigusr2 = 1;
20+
return;
21+
}
22+
23+
int main(void){
24+
sigset_t newmask, oldmask;
25+
signal(SIGUSR1, sig_usr1);
26+
signal(SIGUSR2, sig_usr2);
27+
28+
fprintf(stdout, "catch sigusr1 can break\n");
29+
30+
while(1)
31+
{
32+
if(flag_sigusr1)
33+
{
34+
fprintf(stdout, "break\n");
35+
break;
36+
}
37+
sleep(5);
38+
}
39+
fprintf(stdout, "first while was broken\n");
40+
41+
//重新设置为0
42+
flag_sigusr1 = 0;
43+
flag_sigusr2 = 0;
44+
45+
// block SIGUSR1
46+
sigemptyset(&newmask);
47+
sigaddset(&newmask, SIGUSR1);
48+
if(sigprocmask(SIG_BLOCK, &newmask, &oldmask) < 0)
49+
{
50+
perror("sigprocmask error");
51+
}
52+
53+
fprintf(stdout, "only catch sigusr2 can break, because sigusr1 has been blocked\n");
54+
while(1)
55+
{
56+
if(flag_sigusr1 || flag_sigusr2)
57+
{
58+
fprintf(stdout, "break\n");
59+
break;
60+
}
61+
sleep(5);
62+
}
63+
fprintf(stdout, "second while was broken\n");
64+
65+
fprintf(stdout, "after second while was broken, flag_sigusr1=%d, flag_sigusr2=%d\n", flag_sigusr1, flag_sigusr2);
66+
67+
return 0;
68+
}
69+
70+
*/
71+
72+
#include<stdio.h>
73+
#include<signal.h>
74+
#include<unistd.h>
75+
#include<pthread.h>
76+
77+
int flag_sigusr1 = 0;
78+
int flag_sigusr2 = 0;
79+
int flag_sighup = 0;
80+
81+
void sig_usr1(int signo)
82+
{
83+
fprintf(stdout, "sig|caught SIGUSR1\n");
84+
flag_sigusr1 = 1;
85+
return;
86+
}
87+
88+
void sig_usr2(int signo)
89+
{
90+
fprintf(stdout, "sig|caught SIGUSR2\n");
91+
flag_sigusr2 = 1;
92+
return;
93+
}
94+
95+
void sig_hup(int signo)
96+
{
97+
fprintf(stdout, "sig|caught SIGHUP\n");
98+
flag_sighup = 1;
99+
return;
100+
}
101+
102+
void *thread_control_signal(void *arg)
103+
{
104+
sigset_t newmask, oldmask;
105+
sigemptyset(&newmask);
106+
107+
//thread block sighup
108+
sigemptyset(&newmask);
109+
sigaddset(&newmask, SIGHUP);
110+
if(pthread_sigmask(SIG_BLOCK, &newmask, &oldmask) < 0)
111+
{
112+
perror("sigprocmask error");
113+
}
114+
115+
fprintf(stdout, "thread|first while. catch sigusr1 or sigusr2 can break\n");
116+
while(1)
117+
{
118+
if(flag_sigusr1 || flag_sigusr2)
119+
{
120+
fprintf(stdout, "thread|break\n");
121+
break;
122+
}
123+
sleep(5);
124+
}
125+
flag_sigusr1 = 0;
126+
127+
//thread block SIGUSR1
128+
sigaddset(&newmask, SIGUSR1);
129+
if(pthread_sigmask(SIG_BLOCK, &newmask, &oldmask) < 0)
130+
{
131+
perror("sigprocmask error");
132+
}
133+
134+
fprintf(stdout, "thread|first while. catch sigusr2 can break\n");
135+
while(1)
136+
{
137+
if(flag_sigusr1 || flag_sigusr2)
138+
{
139+
fprintf(stdout, "break\n");
140+
break;
141+
}
142+
sleep(10);
143+
}
144+
fprintf(stdout, "thread|thread exit\n");
145+
return (void *)0;
146+
}
147+
148+
int main()
149+
{
150+
sigset_t newmask;
151+
pthread_t tid;
152+
int signo;
153+
154+
//signal action
155+
signal(SIGUSR1, sig_usr1);
156+
signal(SIGUSR2, sig_usr2);
157+
signal(SIGHUP , sig_hup);
158+
159+
if(pthread_create(&tid, NULL, thread_control_signal, NULL) < 0)
160+
{
161+
perror("create pthread failed");
162+
return -1;
163+
}
164+
165+
//main thread block sigusr1
166+
sigemptyset(&newmask);
167+
sigaddset(&newmask, SIGUSR1);
168+
if(pthread_sigmask(SIG_BLOCK, &newmask, NULL) < 0)
169+
{
170+
perror("sigprocmask error");
171+
}
172+
173+
//main thread wait sighup
174+
sigemptyset(&newmask);
175+
sigaddset(&newmask, SIGHUP);
176+
if(sigwait(&newmask, &signo) < 0)
177+
{
178+
perror("sigwait failed");
179+
return -1;
180+
}
181+
fprintf(stdout, "main|get SIGHUP\n");
182+
183+
pthread_kill(tid, SIGUSR2);
184+
pthread_kill(tid, SIGUSR2);
185+
pthread_join(tid, NULL);
186+
187+
fprintf(stdout, "main|exit\n");
188+
return 0;
189+
}
190+

LinuxCodes/signal_siguser1.c

Lines changed: 114 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,114 @@
1+
/*
2+
#include <stdio.h>
3+
#include <stdlib.h>
4+
#include <signal.h>
5+
#include <unistd.h>
6+
#include <sys/wait.h>
7+
8+
void handler(int signo)
9+
{
10+
switch(signo) {
11+
case SIGUSR1: //处理信号 SIGUSR1
12+
printf("Parent : catch SIGUSR1\n");
13+
break;
14+
case SIGUSR2: //处理信号 SIGUSR2
15+
printf("Child : catch SIGUSR2\n");
16+
break;
17+
default: //本例不支持
18+
printf("Should not be here\n");
19+
break;
20+
}
21+
}
22+
23+
int main(void)
24+
{
25+
pid_t ppid, cpid;
26+
//为两个信号设置信号处理函数
27+
if(signal(SIGUSR1, handler) == SIG_ERR)
28+
{ //设置出错
29+
perror("Can't set handler for SIGUSR1\n");
30+
exit(1);
31+
}
32+
33+
if(signal(SIGUSR2, handler) == SIG_ERR)
34+
{ //设置出错
35+
perror("Can't set handler for SIGUSR2\n");
36+
exit(1);
37+
}
38+
39+
ppid = getpid();//得到父进程ID
40+
41+
if((cpid = fork()) < 0)
42+
{
43+
perror("fail to fork\n");
44+
exit(1);
45+
}
46+
else if(cpid == 0)
47+
{
48+
// 子进程内向父进程发送信号SIGUSER1
49+
if(kill(ppid, SIGUSR1) == -1)
50+
{
51+
perror("fail to send signal\n");
52+
exit(1);
53+
}
54+
55+
while(1);//死循环,等待父进程的信号
56+
}
57+
else
58+
{
59+
sleep(1);//休眠,保证子进程先运行,并且发送SIGUSR1信号
60+
// 父进程向自己发送SIGUSER2信号
61+
if(kill(cpid, SIGUSR2) == -1)
62+
{
63+
perror("fail to send signal\n");
64+
exit(1);
65+
}
66+
67+
// 必须sleep一下,否则子进程捕获不到SIGUSER2信号
68+
sleep(1);
69+
70+
printf("will kill child\n");//输出提示
71+
if(kill(cpid, SIGKILL) == -1)
72+
{ //发送SIGKILL信号,杀死子进程
73+
perror("fail to send signal\n");
74+
exit(1);
75+
}
76+
77+
if(wait(NULL) ==-1)
78+
{ //回收子进程状态,避免僵尸进程
79+
perror("fail to wait\n");
80+
exit(1);
81+
}
82+
printf("child has been killed.\n");
83+
}
84+
return;
85+
}
86+
87+
*/
88+
89+
90+
#include <stdio.h>
91+
#include <signal.h>
92+
#include <unistd.h>
93+
94+
static void sig_usr(int);
95+
int main(void)
96+
{
97+
if(signal(SIGUSR1, sig_usr) == SIG_ERR)
98+
printf("can not catch SIGUSR1\n");
99+
if(signal(SIGUSR2, sig_usr) == SIG_ERR)
100+
printf("can not catch SIGUSR2\n");
101+
for(;;)
102+
pause();
103+
}
104+
105+
static void sig_usr(int signo)
106+
{
107+
if(signo == SIGUSR1)
108+
printf("received SIGUSR1\n");
109+
else if(signo == SIGUSR2)
110+
printf("received SIGUSR2\n");
111+
else
112+
printf("received signal %d\n", signo);
113+
}
114+

LinuxCodes/udp_client.cpp

Lines changed: 49 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,49 @@
1+
#include<iostream>
2+
#include<stdlib.h>
3+
#include<stdio.h>
4+
#include<string.h>
5+
#include<unistd.h>
6+
#include<sys/socket.h>
7+
#include<netinet/in.h>
8+
#include<arpa/inet.h>
9+
#include<sys/select.h>
10+
using namespace std;
11+
12+
#define BUFSZ 1024
13+
#define PORT 8888
14+
#define SERVER_IP "127.0.0.1"
15+
16+
int main(int argc, char *argv[])
17+
{
18+
struct sockaddr_in svr_addr;
19+
int ret;
20+
int sock;
21+
socklen_t addrlen = sizeof(struct sockaddr_in);
22+
char buf[BUFSZ] = {};
23+
24+
if ((sock = socket(AF_INET, SOCK_DGRAM, 0)) < 0)
25+
{
26+
perror("socket");
27+
exit(EXIT_FAILURE);
28+
}
29+
30+
//sendto()函数需要指定目的端口/地址
31+
svr_addr.sin_family = AF_INET;
32+
svr_addr.sin_port = htons(PORT);
33+
svr_addr.sin_addr.s_addr = inet_addr(SERVER_IP);
34+
35+
while (1)
36+
{
37+
memset(buf, 0, BUFSZ);
38+
printf("please input: ");
39+
fgets(buf, BUFSZ, stdin);
40+
sendto(sock, buf, BUFSZ, 0, (struct sockaddr* )&svr_addr, addrlen);
41+
42+
ret = recvfrom(sock, buf, BUFSZ, 0, (struct sockaddr* )&svr_addr, &addrlen);
43+
printf("client: IPAddr = %s, Port = %d, recvfrom-buf = %s\n", inet_ntoa(svr_addr.sin_addr), ntohs(svr_addr.sin_port), buf);
44+
}
45+
46+
close(sock);
47+
return 0;
48+
}
49+

0 commit comments

Comments
 (0)