diff -r f345bda72bc4 -r 43e37759235e Symbian3/Examples/guid-6013a680-57f9-415b-8851-c4fa63356636/sigterm_signal_8c_source.html --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/Symbian3/Examples/guid-6013a680-57f9-415b-8851-c4fa63356636/sigterm_signal_8c_source.html Tue Mar 30 16:16:55 2010 +0100 @@ -0,0 +1,165 @@ + + +
+ +00001 // sigtermSignal.c +00002 // +00003 // Copyright (c) 2010 Nokia Corporation and/or its subsidiary(-ies). +00004 // All rights reserved. +00005 // This component and the accompanying materials are made available +00006 // under the terms of "Eclipse Public License v1.0" +00007 // which accompanies this distribution, and is available +00008 // at the URL "http://www.eclipse.org/legal/epl-v10.html". +00009 // +00010 // Initial Contributors: +00011 // Nokia Corporation - initial contribution. +00012 // +00013 // Contributors: +00014 // +00015 // Description: The source code file for sigtermSignal. +00016 // +00017 +00018 #include <stdio.h> +00019 #include <string.h> +00020 #include <stdlib.h> +00021 #include <unistd.h> +00022 #include <sys/types.h> +00023 #include <signal.h> +00024 #include <e32def.h> +00025 #include <time.h> +00026 #include <spawn.h> +00027 +00028 FILE *gfp = NULL; +00029 char *testfile = "C:\\testfile.txt"; +00030 +00034 void PressKey() +00035 { +00036 int ch; +00037 printf("Press 'e'+Enter to exit\n"); +00038 while((ch=getchar())!= 'e') +00039 { +00040 if(ch == '\n') +00041 continue; +00042 else +00043 printf("wrong option selected, please try again!!!\n"); +00044 } +00045 } +00052 void SIGTERM_handler(int signum) +00053 { +00054 if(signum == SIGTERM) +00055 { +00056 if(gfp != NULL) +00057 { +00058 printf("Received the SIGTERM signal from the raiseSignal process\n"); +00059 fclose(gfp); +00060 remove(testfile); +00061 gfp = NULL; +00062 printf("The open file descriptor was closed\n"); +00063 PressKey(); +00064 exit (0); +00065 } +00066 } +00067 } +00068 +00078 int main() +00079 { +00080 char input[11]; +00081 int count = 0,num; +00082 int ch,ret; +00083 pid_t usrProcsID; +00084 const int delay = 4; //Time delay of 4 sec provided. +00085 const int size = 50; //No.of characters allowed in the filename. +00086 const int index = 3; //No.of elements in the array. +00087 +00088 char *usrProcess = "Z:\\sys\\bin\\raisesignal.exe"; //Filename of process used for raising SIGTERM signal. +00089 char **argv = (char**)malloc(index*sizeof(char*)); //Variable holding values to be passed on to the raiseSignal process. +00090 argv[0] = (char*)malloc(size*sizeof(char)); +00091 argv[1] = (char*)malloc(index*sizeof(char)); +00092 argv[2] = NULL; +00093 +00094 +00095 strcpy(argv[0], "z:\\sys\\bin\\raisesignal.exe"); //argv[0] holding name of the child process. +00096 sprintf(argv[1],"%d",getpid()); //argv[1] holding parent pid. +00097 +00098 printf("*****************************************************************************************\n"); +00099 printf("* Welcome to the demonstration of a graceful process termination using a SIGTERM signal *\n"); +00100 printf("*****************************************************************************************\n"); +00101 +00102 printf("* This example shows how a SIGTERM signal can be used to gracefully terminate a process.\n"); +00103 printf("* The example first creates a process called sigtermSignal, assigns a custom handler\nfor the SIGTERM signal, opens a file and gets names from the user to be written in to it.\n"); +00104 printf("* It then simultaneously spawns a raiseSignal process and starts reading from the file.\n"); +00105 printf("* The raiseSignal process sends a SIGTERM signal to the sigtermSignal process.\n"); +00106 printf("* On receiving the SIGTERM signal, the sigtermSignal process closes all the \nopen file descriptors and prepares to exit.\n"); +00107 +00108 printf("\nPress the Enter key to continue\n"); +00109 getchar(); +00110 +00111 signal(SIGTERM, SIGTERM_handler); +00112 printf("************ In the sigtermSignal process ************\n"); +00113 printf("Enter the number of names you want to enter (e.g. 8) :\n"); +00114 scanf("%d", &count); +00115 gfp=fopen(testfile, "w+"); //Opening the file for read and write. +00116 if(gfp != NULL) +00117 { +00118 printf("File open sucessful\n"); +00119 } +00120 else +00121 { +00122 printf("File open failed\n"); +00123 } +00124 for(num=1; num<=count; num++) +00125 { +00126 printf("Name (%d)=", num); +00127 scanf("%s", input); +00128 fprintf(gfp, "%s\n", input); +00129 } +00130 +00131 printf("Press the Enter key to spawn the raiseSignal process\n"); +00132 getchar(); +00133 getchar(); +00134 //Spawning raiseSignal process to accept user input. +00135 ret = posix_spawn(&usrProcsID,usrProcess,NULL,NULL,argv,(char**)NULL); +00136 if(ret != 0) +00137 { +00138 printf("\n*** failure posix_spawn ***\n"); +00139 return EXIT_FAILURE; +00140 } +00141 rewind(gfp); +00142 printf("Starting to read from the file\n"); +00143 for(num=1; num<=count; num++) +00144 { +00145 sleep (delay); +00146 printf("Name (%d)=", num); +00147 while((ch=(fgetc(gfp))) != '\n') +00148 { +00149 putchar(ch); +00150 } +00151 printf("\n"); +00152 +00153 } +00154 if(!fclose(gfp)) +00155 { +00156 remove(testfile); +00157 gfp = NULL; +00158 printf("File closed successfully\n"); +00159 } +00160 else +00161 { +00162 printf("File close failed\n"); +00163 } +00164 +00165 PressKey(); +00166 return EXIT_SUCCESS; +00167 } +