Sic Parvis Magna

10 Nisan 2025 Perşembe

C/CPP - Fonksiyonlar ve Kullanım Yöntemleri #14

Nisan 10, 2025 Posted by unexpected , , No comments

signal

Sinyalere özel bir handler tanımlanır. Başarılı ise tanımlı handler döner.

Syntax
__sighandler_t signal(int sig, __sighandler_t hnd);

Params

  • sig: Sinyal tanımları alır.
  • hnd: Bir callback function alır.
example.cpp
#include <stdio.h>
#include <signal.h>

int isrunning = 1;

void callback_handler(int num)
{
	isrunning = 0;
}

int main(int argc, char** argv)
{	
	int count = 0;
	signal(SIGINT, callback_handler);  /// Ctrl+C sinyalini yakala
	while(isrunning)
	{
		printf("\rCount: %d", count);
		count++;
	}
	
	return 0;
}
Kullanılabilir sinyal tanımları:
example.txt
SIGINT		# Interactive attention signal.
SIGILL		# Illegal instruction.
SIGABRT		# Abnormal termination.
SIGFPE		# Erroneous arithmetic operation.
SIGSEGV		# Invalid access to storage.
SIGTERM		# Termination request.
SIGHUP		# Hangup.
SIGQUIT		# Quit.
SIGTRAP		# Trace/breakpoint trap.
SIGKILL		# Killed.
SIGBUS		# Bus error.
SIGSYS		# Bad system call.
SIGPIPE		# Broken pipe.
SIGALRM		# Alarm clock.
SIGURG		# Urgent data is available at a socket.
SIGSTOP		# Stop, unblockable.
SIGTSTP		# Keyboard stop.
SIGCONT		# Continue.
SIGCHLD		# Child terminated or stopped.
SIGTTIN		# Background read from control terminal.
SIGTTOU		# Background write to control terminal.
SIGPOLL		# Pollable event occurred (System V).
SIGXCPU		# CPU time limit exceeded.
SIGXFSZ		# File size limit exceeded.
SIGVTALRM	# Virtual timer expired.
SIGPROF		# Profiling timer expired.
SIGUSR1		# User-defined signal 1.
SIGUSR2		# User-defined signal 2.
SIGWINCH	# Window size change (4.3 BSD, Sun).

sigismember

Her hangi bir sinyalin sigset_t içerisinde olup olmadığını kontrol eder. Başarılı ise 1 başarısız ise 0 değerini döner.

Syntax
int sigismember(const sigset_t* set, int signo); // linux systems

Params

  • set: sigset_t değeri alır.
  • signo: Sinyal tanımları alır.
example.cpp
#include <stdio.h>
#include <signal.h>

int main(int argc, char** argv)
{	
	sigset_t set;
    
	if(sigismember(&set, SIGINT))
		printf("Sinyal mevcut.");
	
	return 0;
}

sigfillset

Tüm sinyaleri sigset_t içerisine ekler. Başarılı ise 0 değerini döner.

Syntax
int sigfillset(sigset_t* set); // linux systems

Params

  • set: sigset_t değeri alır.
example.cpp
#include <stdio.h>
#include <signal.h>

int main(int argc, char** argv)
{	
	sigset_t set;
	
	sigfillset(&set);
	
	if(sigismember(&set, SIGINT))
		printf("Sinyal mevcut.");
	
	return 0;
}

sigemptyset

Tüm sinyaleri sigset_t içerisinden boşaltır. Başarılı ise 0 değerini döner.

Syntax
int sigemptyset(sigset_t* set); // linux systems

Params

  • set: sigset_t değeri alır.
example.cpp
#include <stdio.h>
#include <signal.h>

int main(int argc, char** argv)
{	
	sigset_t set;
	
	sigfillset(&set);	/// Önce doldur
	sigemptyset(&set);  /// Sonra boşalt
	
	if(sigismember(&set, SIGINT))	/// Kontrol et
		printf("Sinyal mevcut.");
	
	return 0;
}

sigaddset

Belirli bir sinyali sigset_t içerisine ekler. Başarılı ise 0 değerini döner.

Syntax
int sigaddset(sigset_t* set, int signo); // linux systems

Params

  • set: sigset_t değeri alır.
example.cpp
#include <stdio.h>
#include <signal.h>

int main(int argc, char** argv)
{	
	sigset_t set;
	
	sigemptyset(&set);        /// Önce boşalt
	sigaddset(&set, SIGINT);  /// Sonra ekle
	
	if(sigismember(&set, SIGINT))	/// Kontrol et
		printf("Sinyal mevcut.");
	
	return 0;
}

sigdelset

Belirli bir sinyali sigset_t içerisinden siler. Başarılı ise 0 değerini döner.

Syntax
int sigdelset(sigset_t* set, int signo); // linux systems

Params

  • set: sigset_t değeri alır.
example.cpp
#include <stdio.h>
#include <signal.h>

int main(int argc, char** argv)
{	
	sigset_t set;
	
	sigemptyset(&set);       /// Önce boşalt
	sigaddset(&set, SIGINT); /// Sonra ekle
	sigdelset(&set, SIGINT); /// Sonra sil
	
	if(sigismember(&set, SIGINT))	/// Kontrol et
		printf("Sinyal mevcut.");
	
	return 0;
}

sigprocmask

Belirli sinyallerin işlenmesini engellemek veya eski hale getirmek için kullanılır. Başarılı ise 0 değerini döner.

Syntax
int sigprocmask(int how, const sigset_t* set, sigset_t* oset); // linux systems

Params

  • how: Sinyal engel tanımları alır.
  • set: sigset_t değeri alır.
  • oset: sigset_t değeri alır.
example.cpp
#include <stdio.h>
#include <signal.h>

int main(int argc, char** argv)
{	
	sigset_t set;
	
	sigemptyset(&set);
	sigaddset(&set, SIGINT);
	
	// Sinyali engelle
	sigprocmask(SIG_BLOCK, &set, NULL);
	
	// Sinyal engelini kaldır.
	sigprocmask(SIG_UNBLOCK, &set, NULL);
	
	return 0;
}
Kullanılabilir sinyal engel tanımları:
example.txt
SIG_BLOCK    # Block signals.
SIG_UNBLOCK     # Unblock signals.
SIG_SETMASK     # Set the set of blocked signals.

sigaction

Sinyalere özel bir handler tanımlanır. Başarılı ise 0 değerini döner.

Syntax
int sigaction(int sig, const struct sigaction* act, struct sigaction* oact); // linux systems

Params

  • sig: Sinyal tanımları alır.
  • act: Sigaction struct alır.
  • oact: Sigaction struct alır.
example.cpp
#include <string.h>
#include <ctype.h>

int isrunning = 1;

void callback_handler(int sig)
{
	isrunning = 0;
}

int main(int argc, char** argv)
{	
	struct sigaction sa;
	
	sa.sa_handler = callback_handler;
	sigemptyset(&sa.sa_mask);
	sa.sa_flags = 0;
	
	int count = 0;
	printf("%d\n", sigaction(SIGINT, &sa, NULL)); /// Ctrl+C sinyalini yakala
	while(isrunning)
	{
		printf("\rCount: %d", count);
		count++;
	}
	
	return 0;
}

0 comments:

Yorum Gönder