| Index: third_party/pexpect/tests/platform_checks/CSIGNALTEST/test.c
|
| diff --git a/third_party/pexpect/tests/platform_checks/CSIGNALTEST/test.c b/third_party/pexpect/tests/platform_checks/CSIGNALTEST/test.c
|
| new file mode 100644
|
| index 0000000000000000000000000000000000000000..86bcc17fab5b6a9043b0c4009d14c2aa0e2f38a8
|
| --- /dev/null
|
| +++ b/third_party/pexpect/tests/platform_checks/CSIGNALTEST/test.c
|
| @@ -0,0 +1,90 @@
|
| +/* I built this with "gcc -lutil test.c -otest" */
|
| +#include <sys/types.h> /* include this before any other sys headers */
|
| +#include <sys/wait.h> /* header for waitpid() and various macros */
|
| +#include <signal.h> /* header for signal functions */
|
| +#include <stdio.h> /* header for fprintf() */
|
| +#include <unistd.h> /* header for fork() */
|
| +#ifdef LINUX
|
| +#include <pty.h>
|
| +#else
|
| +#include <util.h> /* header for forkpty, compile with -lutil */
|
| +#endif
|
| +
|
| +void sig_chld(int); /* prototype for our SIGCHLD handler */
|
| +
|
| +int main()
|
| +{
|
| + struct sigaction act;
|
| + int pid;
|
| + int fdm;
|
| + char slave_name [20];
|
| +
|
| +
|
| + /* Assign sig_chld as our SIGCHLD handler.
|
| + We don't want to block any other signals in this example
|
| + We're only interested in children that have terminated, not ones
|
| + which have been stopped (eg user pressing control-Z at terminal).
|
| + Finally, make these values effective. If we were writing a real
|
| + application, we would save the old value instead of passing NULL.
|
| + */
|
| + act.sa_handler = sig_chld;
|
| + sigemptyset(&act.sa_mask);
|
| + act.sa_flags = SA_NOCLDSTOP;
|
| + if (sigaction(SIGCHLD, &act, NULL) < 0)
|
| + {
|
| + fprintf(stderr, "sigaction failed\n");
|
| + return 1;
|
| + }
|
| +
|
| + /* Do the Fork thing.
|
| + */
|
| + pid = forkpty (&fdm, slave_name, NULL, NULL);
|
| + /* pid = fork(); */
|
| +
|
| + switch (pid)
|
| + {
|
| + case -1:
|
| + fprintf(stderr, "fork failed\n");
|
| + return 1;
|
| + break;
|
| +
|
| + case 0: /* Child process. */
|
| + printf ("This child output will cause trouble.\n");
|
| + _exit(7);
|
| + break;
|
| +
|
| + default: /* Parent process. */
|
| + sleep(1);
|
| + printf ("Child pid: %d\n", pid);
|
| + sleep(10); /* let child finish -- crappy way to avoid race. */
|
| + break;
|
| + }
|
| +
|
| + return 0;
|
| +}
|
| +
|
| +void sig_chld(int signo)
|
| +{
|
| + int status, wpid, child_val;
|
| +
|
| + printf ("In sig_chld signal handler.\n");
|
| +
|
| + /* Wait for any child without blocking */
|
| + wpid = waitpid (-1, & status, WNOHANG);
|
| + printf ("\tWaitpid found status for pid: %d\n", wpid);
|
| + if (wpid < 0)
|
| + {
|
| + fprintf(stderr, "\twaitpid failed\n");
|
| + return;
|
| + }
|
| + printf("\tWaitpid status: %d\n", status);
|
| +
|
| + if (WIFEXITED(status)) /* did child exit normally? */
|
| + {
|
| + child_val = WEXITSTATUS(status);
|
| + printf("\tchild exited normally with status %d\n", child_val);
|
| + }
|
| + printf ("End of sig_chld.\n");
|
| +}
|
| +
|
| +
|
|
|