• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
1 /*
2  * Copyright (c) 2013-2019 Huawei Technologies Co., Ltd. All rights reserved.
3  * Copyright (c) 2020-2021 Huawei Device Co., Ltd. All rights reserved.
4  *
5  * Redistribution and use in source and binary forms, with or without modification,
6  * are permitted provided that the following conditions are met:
7  *
8  * 1. Redistributions of source code must retain the above copyright notice, this list of
9  * conditions and the following disclaimer.
10  *
11  * 2. Redistributions in binary form must reproduce the above copyright notice, this list
12  * of conditions and the following disclaimer in the documentation and/or other materials
13  * provided with the distribution.
14  *
15  * 3. Neither the name of the copyright holder nor the names of its contributors may be used
16  * to endorse or promote products derived from this software without specific prior written
17  * permission.
18  *
19  * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
20  * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO,
21  * THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
22  * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR
23  * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
24  * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
25  * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS;
26  * OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY,
27  * WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR
28  * OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF
29  * ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
30  */
31 #include "it_test_signal.h"
32 #include "signal.h"
33 
SigAlrm(int signum)34 static void SigAlrm(int signum)
35 {
36     printf("Alert rings.\n");
37 }
38 
TestBlock()39 static int TestBlock()
40 {
41     int sig = SIGALRM;
42     void *ret;
43     int retValue, status;
44 
45     int fpid = fork();
46     if (fpid == 0) {
47         sigset(SIGALRM, SigAlrm);
48         int clock = 2;
49         printf("Alarm after %d seconds\n", clock);
50         alarm(clock);
51         for (int i = 0; i < 4; i++) { // 4, Number of cycles
52             printf("time = %d s\n", i);
53             sleep(1);
54         }
55         printf("\n\n");
56 
57         printf("Hold the signal\n");
58         retValue = sighold(sig);
59         if (retValue != 0) {
60             exit(retValue);
61         }
62         alarm(clock);
63         for (int i = 0; i < 4; i++) { // 4, Number of cycles
64             printf("time = %d s\n", i);
65             sleep(1);
66         }
67         printf("\n\n");
68 
69         printf("Release the signal\n");
70         retValue = sigrelse(sig);
71         if (retValue != 0) {
72             exit(retValue);
73         }
74         alarm(clock);
75         for (int i = 0; i < 4; i++) { // 4, Number of cycles
76             printf("time = %d s\n", i);
77             sleep(1);
78         }
79         printf("\n\n");
80 
81         printf("Signal Pause(1)\n");
82         printf("The process sleeps until alter rings (after 2 seconds)\n");
83         alarm(clock);
84         retValue = sigpause(sig);
85         if (retValue != -1) {
86             exit(retValue);
87         }
88         printf("\n\n");
89 
90         printf("Signal Pause(2)\n");
91         printf("To test whether pause can release the signal\n");
92         alarm(clock);
93         retValue = sighold(sig);
94         if (retValue != 0) {
95             exit(retValue);
96         }
97         retValue = sigpause(sig);
98         if (retValue != -1) {
99             exit(retValue);
100         }
101         printf("\n\n");
102 
103         printf("Ignore the signal\n");
104         retValue = sigignore(sig);
105         if (retValue != 0) {
106             exit(retValue);
107         }
108         alarm(clock);
109         for (int i = 0; i < 4; i++) { // 4, Number of cycles
110             printf("time = %d s\n", i);
111             sleep(1);
112         }
113         printf("\n\n");
114         printf("Test Ends\n");
115 
116         exit(0);
117     }
118     retValue = waitpid(fpid, &status, 0);
119     ICUNIT_ASSERT_EQUAL(retValue, fpid, retValue);
120     ICUNIT_ASSERT_EQUAL(WEXITSTATUS(status), 0, WEXITSTATUS(status));
121     return 0;
122 }
123 
ItPosixSignal025(void)124 void ItPosixSignal025(void)
125 {
126     TEST_ADD_CASE(__FUNCTION__, TestBlock, TEST_POSIX, TEST_SIGNAL, TEST_LEVEL0, TEST_FUNCTION);
127 }