jstechg
jstechg

Reputation: 143

A segmentation fault occurs when thread_kill is executed

I am developing a simple program in C on linux in which there is a thread that checks the time elapsed since the beginning of the program and when they have passed 10 seconds, sends an end signal (SIGINT or SIGTERM, for example) to the main program, what should make it end in a clean way.

The C program is attached at the end.

When the call to thread_kill is executed, a Segmentation fault occurs.

The result of running this program with gdb is as follows:

Program received signal SIGSEGV, Segmentation fault.
[Switching to Thread 0x7ffff77f2700 (LWP 25472)]
__pthread_kill (threadid=25466, signo=2) at 
../nptl/sysdeps/unix/sysv/linux/pthread_kill.c:42
42  ../nptl/sysdeps/unix/sysv/linux/pthread_kill.c: No such file or directory.
(gdb) bt
#0  __pthread_kill (threadid=25466, signo=2) at     ../nptl/sysdeps/unix/sysv/linux/pthread_kill.c:42
#1  0x0000000000400a1e in ThreadRoutine (number=1) at program_16b.c:46
#2  0x00007ffff7bc4184 in start_thread (arg=0x7ffff77f2700) at pthread_create.c:312
#3  0x00007ffff78f103d in clone () at ../sysdeps/unix/sysv/linux/x86_64/clone.S:111
(gdb) 

What is wrong on my code?

program.c :

#include <pthread.h>
#include <stdio.h>
#include <unistd.h>
#include <string.h>
#include <sys/time.h>
#include <signal.h>


#define _REENTRANT

struct timeval begin, end;


void siginthandler(int param)
{
  printf("User has pressed Ctrl + C\n");

}


void *ThreadRoutine(int number)
{
  long microseconds;

  printf ("[thread %d] pthread_self = %d, getpid = %d, getppid = %d\n",
           number, pthread_self(), getpid(), getppid());


  while(1) // loop forever
  {
    printf("thread type 1 (%d) running\n",number);
    if (number == 1)
    {
      gettimeofday(&end, NULL);
      microseconds = (end.tv_sec - begin.tv_sec) * 1000000 + (end.tv_usec - begin.tv_usec);
      printf ("Microseconds from starting time = %ld\n", microseconds);
      if (microseconds >= 10000000)
      {
        printf("Killing parent process after 10 seconds from starting.\n");
        pthread_kill(getppid(), SIGINT);
      }    
    }
    sleep(number); // sleep for number seconds, value passed as a parameter.
  }
}



int main(void)
{
  int t;
  pthread_t tid[13]; // an array to keep track of the threads

  // To create a detached thread.
  pthread_attr_t attr; // thread attribute

  // To call to pthread_attr_get...
  int rc, val;
  struct sched_param sp;
  size_t v;
  void *stkaddr;


  signal(SIGINT, siginthandler);

  printf ("[parent] pid = %d\n", getpid());

  gettimeofday(&begin, NULL);

  for (t=1; t<3; t++)
    {
    pthread_create(&tid[t],NULL,(void *)ThreadRoutine,(int *)t);
    printf ("Created thread %d with id=%d\n", t, (int)tid[t]);
    }

  sleep(30);

  return 0;
}

screen output when the program runs :

[parent] pid = 18994
Created thread 1 with id=1463871232
[thread 1] pthread_self = 1463871232, getpid = 18994, getppid = 25402
thread type 1 (1) running
Microseconds from starting time = 175
[thread 2] pthread_self = 1455478528, getpid = 18994, getppid = 25402
thread type 1 (2) running
Created thread 2 with id=1455478528
thread type 1 (1) running
Microseconds from starting time = 1000319
thread type 1 (2) running
thread type 1 (1) running
Microseconds from starting time = 2000536
thread type 1 (1) running
Microseconds from starting time = 3000722
thread type 1 (2) running
thread type 1 (1) running
Microseconds from starting time = 4000819
thread type 1 (1) running
Microseconds from starting time = 5000997
thread type 1 (2) running
thread type 1 (1) running
Microseconds from starting time = 6001088
thread type 1 (1) running
Microseconds from starting time = 7001264
thread type 1 (2) running
thread type 1 (1) running
Microseconds from starting time = 8001383
thread type 1 (1) running
Microseconds from starting time = 9001556
thread type 1 (2) running
thread type 1 (1) running
Microseconds from starting time = 10001677
Killing parent process after 10 seconds from starting.
Segmentation fault (core dumped)

Upvotes: 0

Views: 5474

Answers (2)

Armali
Armali

Reputation: 19375

the man page for pthread_kill() for Ubuntu 18.04 has this prototype: int pthread_kill(pthread_t thread, int sig);... Notice the first argument is a "threadID", not a process ID that you have specified via getppid(). – TonyB

I use pthread_self() instead, the program works right. – jstechg

Upvotes: 0

user3629249
user3629249

Reputation: 16540

regarding:

Killing parent process after 10 seconds from starting

A thread is NOT a child process. So the code in the thread function is trying kill the process that setup/ran your program (probably the shell)

Upvotes: 1

Related Questions