Я возился с C на моем Raspberry pi, мой main () раскручивает пару потоков, есть небольшой веб-сервер, который работает в одном из этих потоков,
int main(){
printf("hello world\n");
thisfn();
pthread_t tid, led_tid;
int port = 9193;
int rc = pthread_create(&tid, NULL, webserver, &port);
assert (rc == 0);
/snip
Если веб-серверне может привязаться к нужному порту, я хочу, чтобы вся программа остановилась.
void *webserver(void *vargp){
int *port = (int *) vargp;
printf("our port is %d\n", *port);
/* First: Socket Creation */
int sockfd = socket(AF_INET, SOCK_STREAM, 0);
if (sockfd < 0){
/* On error, -1 is returned */
perror("Server Error!");
abort();
} else {
printf("sockfd is %d\n", sockfd);
}
printf("Socket: sockfd: %d\n", sockfd);
/* Second: Set socket options */
int optval = 1;
//int sockopt_int = setsockopt(sockfd, SOL_SOCKET, SO_REUSEADDR | SO_REUSEPORT, &optval, sizeof(optval) );
int sockopt_int = setsockopt(sockfd, SOL_SOCKET, SO_REUSEADDR , &optval, sizeof(optval) );
if ( sockopt_int < 0 ){
perror("Failed at setsockopt");
abort();
} else {
printf("setsockopt succeeded\n");
}
/* Third: Bind to the port */
/* int bind(int sockfd, const struct sockaddr *addr, socklen_t addrlen); */
struct sockaddr_in address;
address.sin_family = AF_INET;
address.sin_addr.s_addr = INADDR_ANY;
address.sin_port = htons(*port);
int bind_int = bind(sockfd, (struct sockaddr *)&address, sizeof(address)) ;
printf("bind_int ; %d\n", bind_int);
if (bind_int < 0 ) {
perror("Failed at bind");
abort();
} else {
printf("bind succeeded\n");
}
Я звонил abort (), я также пробовал выход (1), _exit (1) и т. Д., Однако при этом происходит утечка памяти (~ 136 байт) при проверке с помощью valgrind.
==13052== 136 bytes in 1 blocks are possibly lost in loss record 1 of 1
==13052== at 0x4849CE0: calloc (vg_replace_malloc.c:711)
==13052== by 0x401379B: allocate_dtv (dl-tls.c:322)
==13052== by 0x40141D3: _dl_allocate_tls (dl-tls.c:539)
==13052== by 0x489D9EF: allocate_stack (allocatestack.c:580)
==13052== by 0x489D9EF: pthread_create@@GLIBC_2.4 (pthread_create.c:539)
==13052== by 0x10EBF: main (fixmem.c:38)
==13052==
==13052== LEAK SUMMARY:
==13052== definitely lost: 0 bytes in 0 blocks
==13052== indirectly lost: 0 bytes in 0 blocks
==13052== possibly lost: 136 bytes in 1 blocks
==13052== still reachable: 0 bytes in 0 blocks
==13052== suppressed: 0 bytes in 0 blocks
==13052==
Я узнал о школе мысли, что когда вещи попадают в вентилятор, все в порядке, чтобы выйти, позволяя ОС очищаться после.Я пытался заставить его выйти / прерваться с более счастливым Вэлгриндом.Я не делаю никаких явных mallocs / callocs в этой функции для вызова free () до abort () - и это приводит к моему вопросу:
Какой самый чистый способ остановить main и выйти из потока?
Спасибо!