1/* 2 * Copyright (c) 2022 Huawei Device Co., Ltd. 3 * Licensed under the Apache License, Version 2.0 (the "License"); 4 * you may not use this file except in compliance with the License. 5 * You may obtain a copy of the License at 6 * 7 * http://www.apache.org/licenses/LICENSE-2.0 8 * 9 * Unless required by applicable law or agreed to in writing, software 10 * distributed under the License is distributed on an "AS IS" BASIS, 11 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 12 * See the License for the specific language governing permissions and 13 * limitations under the License. 14 */ 15 16#include <errno.h> 17#include <signal.h> 18 19#include "test.h" 20 21/** 22 * @tc.name : sigwaitinfo_0100 23 * @tc.desc : wait for queued signals 24 * @tc.level : Level 0 25 */ 26void sigwaitinfo_0100(void) 27{ 28 // block a signal 29 sigset_t set; 30 sigemptyset(&set); 31 32 int sig = SIGALRM; 33 sigaddset(&set, sig); 34 int result = sigprocmask(SIG_BLOCK, &set, NULL); 35 if (result != 0) { 36 t_error("%s failed: result = %d\n", __func__, result); 37 } 38 39 // raise a signal 40 union sigval sigval = {.sival_int = 1}; 41 result = sigqueue(getpid(), sig, sigval); 42 if (result != 0) { 43 t_error("%s failed: result = %d\n", __func__, result); 44 } 45 46 // get the pending signal. 47 siginfo_t info; 48 errno = 0; 49 result = sigwaitinfo(&set, &info); 50 if (errno != 0) { 51 t_error("%s failed: errno = %d\n", __func__, errno); 52 } 53 54 if (result != sig) { 55 t_error("%s failed: result = %d\n", __func__, result); 56 } 57 58 if (info.si_signo != sig) { 59 t_error("%s failed: info.si_signo = %d\n", __func__, info.si_signo); 60 } 61 62 if (info.si_value.sival_int != sigval.sival_int) { 63 t_error("%s failed: info.si_value.sival_int = %d\n", __func__, info.si_value.sival_int); 64 } 65} 66 67int main(int argc, char *argv[]) 68{ 69 sigwaitinfo_0100(); 70 71 return t_status; 72} 73