URL: https://linuxfr.org/forums/programmation-c--2/posts/killer-un-processus-sans-fermer-la-socket Title: Killer un processus sans fermer la socket ? Authors: str000mff Date: 2007年01月12日T11:27:27+01:00 Tags: Score: 0 Salut à tous. Dans le cadre d'une reproduction d'incident je tente de flooder un serveur avec des mauvaise deconnection. Donc pour se faire j'ai un process maitre qui creer des fils - qui se connectent donc, et puis au bout d'un certain tps le maitre fait un kill des process avec le signal SIGKILL. Le probleme c'est qu'en tuant ses processus fils, les socket sont fermées proprement et c'est ce que j'aimerais éviter. Quelqu'un a t il une idee ? Ci dessous ma fonction work qui pourra certainement vous aider à comprendre mon pb... static int Work(int argc, char **argv) { £spaces£ £/spaces£char host[1024]; £spaces£ £/spaces£char port[1024]; £spaces£ £/spaces£char outfile[1024]; £spaces£ £/spaces£int pid[50] ; £spaces£ £/spaces£int nbCreatedProc = 0 ; £spaces£ £/spaces£int pidScan = 0 ; £spaces£ £/spaces£int flags; £spaces£ £/spaces£int fd ; £spaces£ £/spaces£SOCKET sock_in ; £spaces£ £/spaces£ £spaces£ £/spaces£memset(host,0,1024);strcpy(host, argv[1]); £spaces£ £/spaces£memset(port,0,1024);strcpy(port, argv[2]); £spaces£ £/spaces£if (argc>=4) £spaces£ £/spaces£tester_trace=atoi(argv[3]); £spaces£ £/spaces£while (1) { £spaces£ £/spaces£pid[nbCreatedProc] = fork(); £spaces£ £/spaces£if (pid[nbCreatedProc] == -1) { /* Error */ £spaces£ £/spaces£fprintf(stdout, "proc creation error"); £spaces£ £/spaces£return -1 ; £spaces£ £/spaces£} £spaces£ £/spaces£else if (pid[nbCreatedProc]) { /* This process */ £spaces£ £/spaces£fprintf(stdout, "created proc : %d\n", pid[nbCreatedProc]); £spaces£ £/spaces£nbCreatedProc ++ ; £spaces£ £/spaces£if (nbCreatedProc == 50){ £spaces£ £/spaces£fprintf(stdout, "50 process created... sleep 2\n"); £spaces£ £/spaces£sleep(2); £spaces£ £/spaces£for (pidScan=0; pidScan < 50 ; pidScan++){ £spaces£ £/spaces£kill(pid[pidScan], SIGKILL); £spaces£ £/spaces£fprintf(stdout, "killed proc : %d\n", pid[pidScan]); £spaces£ £/spaces£nbCreatedProc -- ; £spaces£ £/spaces£} £spaces£ £/spaces£} £spaces£ £/spaces£} else { /* Child */ £spaces£ £/spaces£/* £spaces£ £/spaces£* Open standard streams. £spaces£ £/spaces£*/ £spaces£ £/spaces£memset(outfile, 0, 1024); £spaces£ £/spaces£sprintf(outfile,"./%d_out.txt",getpid()); £spaces£ £/spaces£ £spaces£ £/spaces£open("/dev/null", O_RDONLY); £spaces£ £/spaces£flags = (O_CREAT | O_WRONLY); £spaces£ £/spaces£flags |= (FLAGS & PROC_TRUNCATE_STDOUT) ? O_TRUNC : O_APPEND; £spaces£ £/spaces£fd=open(outfile, flags, 0666); £spaces£ £/spaces£if (fd >= 0) £spaces£ £/spaces£/*redefine stdout*/ £spaces£ £/spaces£dup2(fd,1); £spaces£ £/spaces£if (client (host, port) < 0) { £spaces£ £/spaces£fprintf(stdout, "[%d] CONNECTION FAILED", getpid()); £spaces£ £/spaces£return -1 ; £spaces£ £/spaces£} £spaces£ £/spaces£else £spaces£ £/spaces£sleep(10); £spaces£ £/spaces£} £spaces£ £/spaces£}