blob: e92b364e7323d9de4937fc4468821a406e74f1c9 [file] [log] [blame]
#include <signal.h>
#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
#include <sys/wait.h>
#include "posixtest.h"
/*
* Copyright (c) 2002-2003, Intel Corporation. All rights reserved.
* Created by: julie.n.fleischer REMOVE-THIS AT intel DOT com
* This file is licensed under the GPL license. For the full content
* of this license, see the COPYING file at the top level of this
* source tree.
* Test that the kill() function shall send signal sig to the process
* specified by pid when the process specified by pid is not the calling
* process.
* 1) Fork a child process.
* 2) In the parent process, call kill with signal SIGTOTEST for the
* pid of the child.
* In the child,
* 3) Wait for signal SIGTOTEST.
* 4) Return 1 if SIGTOTEST is found. Return 0 otherwise.
* 5) In the parent, return success if 1 was returned from child.
*
* This test is only performed on one signal. All other signals are
* considered to be in the same equivalence class.
*
* This test makes the assumption that 1 second of sleeping on the part
* of the parent is enough to give the child time to start waiting for
* the parent's signal. If that is not the case, this test will fail.
*/
#define SIGTOTEST SIGUSR1
void myhandler (int signo) {
exit(1);
}
int main()
{
int pid;
int sig;
sigset_t set;
if (sigemptyset(&set) == -1) {
perror("Error calling sigemptyset\n");
return PTS_UNRESOLVED;
}
if (sigaddset(&set, SIGTOTEST) == -1) {
perror("Error calling sigaddset\n");
return PTS_UNRESOLVED;
}
if ((pid = fork()) == 0) {
/* child here */
struct sigaction act;
act.sa_handler=myhandler;
act.sa_flags=0;
sigemptyset(&act.sa_mask);
sigaction(SIGTOTEST, &act, 0);
if (0 != sigwait(&set, &sig)) {
printf("Sigwait did not return 0. Possible problem with sigwait function\n");
return 0; /* FAIL */
}
if (sig != SIGTOTEST)
return 0; /* FAIL */
return 1;
} else {
/* parent here */
int i;
sleep(1);
if (kill(pid, SIGTOTEST) != 0) {
printf("Could not raise signal being tested\n");
return PTS_UNRESOLVED;
}
if (wait(&i) == -1) {
perror("Error waiting for child to exit\n");
return PTS_UNRESOLVED;
}
if (WEXITSTATUS(i)) {
printf("Child exited normally\n");
printf("Test PASSED\n");
return PTS_PASS;
} else {
printf("Child did not exit normally.\n");
printf("Test FAILED\n");
return PTS_FAIL;
}
}
printf("Should have exited from parent\n");
printf("Test FAILED\n");
return PTS_FAIL;
}