473,738 Members | 10,068 Online
Bytes | Software Development & Data Engineering Community
+ Post

Home Posts Topics Members FAQ

<signal.h> - question about signals

Hi everyone,
I'd like to know when and how signals are used (e.g. SIGFPE, SIGABRT,
SIGTERM, SIGSEGV, SIGINT)? Thank you so much.
Nov 14 '05 #1
11 2971
"Jackie" <Ja**********@e arthlink.net> wrote in message news:<l_******* *******@newsrea d2.news.pas.ear thlink.net>...
Hi everyone,
Hello!
I'd like to know when and how signals are used (e.g. SIGFPE, SIGABRT,
SIGTERM, SIGSEGV, SIGINT)? Thank you so much.


Signals provide a way to handle asynchronous (and unexpected) events.
A signal (number) is associated with an event. Like:

SIGFPE: associated with the event "Floating Point Error (FPE)". For
example: This occurs when the process tries to divide a number by zero
as in p=5/0.

SIGSEGV: associated with the event "Segment Violation". Is generated
when the process tries to access an illegal memory segment (this is a
common error with pointers).

SIGINT: This is generated by the terminal (console) when the terminals
interrupt key (usually Ctrl+C) is pressed.

Every signal has an associated default action, that takes place when
the signal is generated. But this can be changed using one of the
signal functions (like signal(), sigaction()). These functions allow
us to specify a user defined action (function) for handling a signal.
Now after installing our own handler, if the signal occurs.. This time
the user specified action will be taken to handle that signal.

However there are some signals which cannot be caught and handled...
Like: SIGKILL, SIGSTOP.

Plzz refer to ur systems manual for more information...

- Gana
Nov 14 '05 #2
Signals provide a way to handle asynchronous (and unexpected) events.
A signal (number) is associated with an event. Like:

SIGFPE: associated with the event "Floating Point Error (FPE)". For
example: This occurs when the process tries to divide a number by zero
as in p=5/0.


Thank you so much for replying. Can you give me a code example that shows
how one may be able to use the signals in <signal.h> to handle asynchronous
(and unexpected) events? Should I call this function: "int raise(int sig)"?
I very much like to know how to use signals in a c code since the signals
are mentioned in the standard library.
Nov 14 '05 #3
kal
"Jackie" <ja**********@e arthlink.net> wrote in message news:<to******* ********@newsre ad2.news.pas.ea rthlink.net>...
Thank you so much for replying. Can you give me a code example that shows
how one may be able to use the signals in <signal.h> to handle asynchronous
(and unexpected) events? Should I call this function: "int raise(int sig)"?
I very much like to know how to use signals in a c code since the signals
are mentioned in the standard library.


That confuses me a lot too. Even the function prototype
takes a while to figure out.

Let us see now.

void (*signal(int sig, void (*func)(int)))( int);

singal is a function taking two parameters and teturning
a pointer to a function.

The paramters are (1) an int, and (2) a pointer to a
function taking an int and returning nothing.

The return value is a pointer to a function taking an int
and returning nothing.

Does this seem ok?

Now, how do I declare a pointer to this signal function?
Nov 14 '05 #4
In article <l_************ **@newsread2.ne ws.pas.earthlin k.net>,
Jackie <Ja**********@e arthlink.net> wrote:
Hi everyone,
I'd like to know when and how signals are used (e.g. SIGFPE, SIGABRT,
SIGTERM, SIGSEGV, SIGINT)? Thank you so much.


They're typically raised by the system to indicate asynchronous events
that your program might be interested in. (You can also raise them
synchronously by calling raise(), which has the effect of invoking the
appropriate signal handler for the signal number you give it.)

When a signal is raised, the handler for that signal gets invoked; you
can install a signal handler to do something you want done when a signal
is raised. There's not much that you can depend on being able to do
in a signal handler, so usually the best way to do things is to set a
flag that your program checks occasionally and does appropriate things
(and then clears it) if it finds that it's set.

SIGFPE, SIGSEGV, and SIGILL are only raised after your program has somehow
invoked undefined behavior, so if your system supports it you can catch
these and your signal handler can find and attempt to fix the source of
the problem.

SIGABRT indicates an abnormal termination. (This is raised by calling
abort(), which fgets called for assert failures.) Trapping this would
be useful for, f'rexample, dumping post-mortem debugging information if
you run into an internal error.
(If it's raised as a result of calling abort(), it's considered a
synchronous signal, so you can call any library function other than
raise(). It's not immediately clear to me whether you're allowed to call
abort() again (which would apparently call raise() again), but it's also
not clear why you would want to.)

That leaves SIGINT and SIGTERM, for interactive attention requests and
termination requests, as the only ones that are really portably useful
in a working program[1]. Typically, if you're doing a long-running
computation that you want to be able to interrupt (to change the
parameters or provide additional input - if you want the program to be
able to run when the user doesn't have anything to say, this is a good way
to work around the fact that any stdio input will wait until there's input
there) or that needs to be able to be shut down cleanly in the middle of
a run, you'd install handlers that set an appropriate flag, and check the
flags and act appropriately at some appropriate point in your computation.
Here's an (oversimplified ) example program of how you might want to
use them:
--------
/*Example of using SIGINT and SIGTERM in a program with a long-running
computation
Not compiled or tested, for instructional use only, standard disclaimers
apply
Written by Dave Vandervies 2004-07-28 to be used, abused, bent, folded,
or mutilated as appropriate.
*/

/*Alphabetical: the One True Order for #including standard headers.*/
#include <errno.h>
#include <limits.h>
#include <signal.h>
#include <stdio.h>
#include <stdlib.h>

volatile sig_atomic_t stop;
volatile sig_atomic_t interrupt;

void sighandler(int signum)
{
if(signum==SIGI NT)
interrupt=1;
if(signum==SIGT ERM)
stop=1;

/*Calling signal like this is specifically permitted (N869 7.14.1.1#5,
see also #4); whether it's needed is implementation-defined (N869
7.14.1.1#3).
*/
signal(signum,s ighandler);
}

int do_long_computa tion(void)
{
unsigned long i,j;
for(i=0;i<ULONG _MAX;i++)
{
for(j=0;j<ULONG _MAX;j++)
{
if(stop)
{
printf("Termina tion request received, exiting (i=%lu, j=%lu)\n",i,j);
/*If we have any cleanup to do (saving a checkpoint file,
perhaps), we do it here
*/
return 1;
}
if(interrupt)
{
char buf[64];
unsigned long new_val;

printf("i=%lu, j=%lu\n",i,j);
fputs("You wanted a new value for i? Enter it now: ",stdout)
fflush(stdout);
fgets(buf,sizeo f buf,stdin);
errno=0;
new_val=strtol( buf,NULL,0);
if(new_val==ULO NG_MAX && errno==ERANGE)
puts("Invalid value, using old value");
else
i=new_val;

interrupt=0;
}

/*Do a part of the long computation here*/

}
}

return 0;
}

int main(void)
{
/*Pointer to function of the appropriate type for a signal handler.
We use this to check the return value of signal() against multiple
possible returns.
*/
void (*oldhandler)(i nt);

/*Start by installing the appropriate signal handlers (we want to do
this before we get into anything nontrivial; if we had enough setup
to justify a separate "initialize " function this would go there)
*/

/*This is, I'm told, the safe way to install a SIGINT handler on unix-
like systems (so that an interrupt from the terminal interrupts the
foreground program as the user expects and not something running in
the background), and does no harm elsewhere.
*/
/*signal() returns the old handler for this signal, or SIG_ERR on
failure.
*/
oldhandler=sign al(SIGINT,sigha ndler);
if(oldhandler== SIG_IGN)
{
puts("SIGINT was ignored (perhaps we're in the background?), re-ignoring\n");
signal(SIGINT,S IG_IGN);
}
else if(oldhandler== SIG_ERR)
{
fputs("Unable to install handler for SIGINT, running in uninterruptible mode\n",stderr) ;
}

/*Since we're only checking against SIG_ERR here, we can use the return
value of signal() directly
*/
if(signal(SIGTE RM,sighandler)= =SIG_ERR)
{
fputs("Unable to install handler for SIGTERM, left with system default\n (this may cause an unclean shutdown)\n",st derr);
}
/*Now that we've got our signal handlers installed, we can start our
long computation secure in the knowledge that the user can cleanly
interrupt it (usually ^C on commonly used interactive platforms) or
terminate it (in a system-dependent manner), or at least has been
warned that attempting to do so won't work.
*/
if(do_long_comp utation())
{
/*Nonzero return indicates early interruption, so indicate that with
exit status
*/
return EXIT_FAILURE;
}

return EXIT_SUCCESS;
}
--------
dave

[1] This is actually a slight stretch, since an implementation that isn't
attempting to provide nonzero QOI can legally implement the signal
handling code as:
--------
void SIG_DFL(int i) {}
void SIG_IGN(int i) {}
void SIG_ERR(int i) {}

void (*signal(int signum,void (*handler)(int) ))(int)
{
/*SIG_IGN is the only signal handler we can install without an error*/
if(handler!=SIG _IGN)
return SIG_ERR;
else
/*We know the previous handler was SIG_IGN*/
return SIG_IGN;
}

int raise(int signum)
{
/*We know the handler is SIG_IGN, so the as-if rule says we can
get away with doing nothing here.
Return value of 0 means we successfully did nothing.
*/
return 0;
}
--------
But you're not likely to encounter implementations that attempt to be
useful and don't support signals, unless the underlying system doesn't
provide a way to implement them or makes it pathologically difficult.

--
Dave Vandervies dj******@csclub .uwaterloo.ca
I'm not sure how I can describe it so as to be free from the possibility of
perverse interpretation; ultimately, communication can only occur between
people who want to communicate. --Anton van Straaten in comp.lang.schem e
Nov 14 '05 #5
In article <a5************ **************@ posting.google. com>,
kal <k_*****@yahoo. com> wrote:
"Jackie" <ja**********@e arthlink.net> wrote in message
news:<to****** *********@newsr ead2.news.pas.e arthlink.net>.. .
Thank you so much for replying. Can you give me a code example that shows
how one may be able to use the signals in <signal.h> to handle asynchronous
(and unexpected) events? Should I call this function: "int raise(int sig)"?
raise() lets you synchronously raise a signal within your program, and
is approximately equivalent to calling the appropriate function directly
(but knowing what the currently installed handler for the signal is
may be nontrivial). It's not needed if you're receiving asynchronous
signals generated outside your program.
I very much like to know how to use signals in a c code since the signals
are mentioned in the standard library.
That confuses me a lot too. Even the function prototype
takes a while to figure out.

Let us see now.

void (*signal(int sig, void (*func)(int)))( int);

singal is a function taking two parameters and teturning
a pointer to a function.

The paramters are (1) an int, and (2) a pointer to a
function taking an int and returning nothing.

The return value is a pointer to a function taking an int
and returning nothing.

Does this seem ok?


Yep. The "function taking an int and returning nothing" part is the
signal handler type; you give it a pointer to the new signal handler,
and it returns a pointer to the old signal handler (or SIG_ERR, a special
value of the appropriate type that indicates a failure).

Now, how do I declare a pointer to this signal function?


Use typedef.

typedef void (*sighandler_t) (int);
sighandler_t (*pointer_to_si gnal_function)( int,sighandler_ t) = signal;

(But why would you want to, unless you're trying to wrap your brain
around function pointers?)
dave

--
Dave Vandervies dj******@csclub .uwaterloo.ca
I'm not sure how I can describe it so as to be free from the possibility of
perverse interpretation; ultimately, communication can only occur between
people who want to communicate. --Anton van Straaten in comp.lang.schem e
Nov 14 '05 #6
"Jackie" <ja**********@e arthlink.net> wrote in message news:<to******* ********@newsre ad2.news.pas.ea rthlink.net>...
Signals provide a way to handle asynchronous (and unexpected) events.
A signal (number) is associated with an event. Like:

SIGFPE: associated with the event "Floating Point Error (FPE)". For
example: This occurs when the process tries to divide a number by zero
as in p=5/0.


Thank you so much for replying. Can you give me a code example that shows
how one may be able to use the signals in <signal.h> to handle asynchronous
(and unexpected) events? Should I call this function: "int raise(int sig)"?
I very much like to know how to use signals in a c code since the signals
are mentioned in the standard library.

/*----------------8<------------------------------------->8------------------*/

/* A simple code example to demonstrate the use of signal() function*/

#include<stdio. h>
#include<signal .h>

void sighandler(int signum);

void sighandler(int signum)
{
static count=0;

if (signum == SIGINT) /* Since the same handler(functio n)
can be installed to handle more than one signal, the 2nd argument <int
signum> provides a way to know which signal has invoked this handler
at that time */
{
printf("Caught SIGINT signal...\n");
count++;
}

else printf("This will never get printed here...\n");

/* exit after catching the SIGINT 3 times */
if (count == 3) exit(0);
}

main()
{
signal(SIGINT, sighandler); /* This function installs
"sighandler " to handle the SIGINT and returns a pointer to the
previously installed handler for this signal (which is the default
handler SIG_DFL initially). If we try to install another handler to
handle SIGINT at some other time... Then the new handler replaces this
current one and returns a pointer to this handler. */

/* Now pressing the terminals interrupt key (usually Ctrl+C) will
generate the SIGINT signal. */

for(;/* wait for the signal */;) {}
}

/*----------------8<------------------------------------->8------------------*/
- Gana
Nov 14 '05 #7
ga******@gmail. com (Ganesh) wrote in message news:<e3******* *************** ****@posting.go ogle.com>...
"Jackie" <ja**********@e arthlink.net> wrote in message news:<to******* ********@newsre ad2.news.pas.ea rthlink.net>...
Signals provide a way to handle asynchronous (and unexpected) events.
A signal (number) is associated with an event. Like:

SIGFPE: associated with the event "Floating Point Error (FPE)". For
example: This occurs when the process tries to divide a number by zero
as in p=5/0.
Thank you so much for replying. Can you give me a code example that shows
how one may be able to use the signals in <signal.h> to handle asynchronous
(and unexpected) events? Should I call this function: "int raise(int sig)"?
I very much like to know how to use signals in a c code since the signals
are mentioned in the standard library.

/*----------------8<------------------------------------->8------------------*/

/* A simple code example to demonstrate the use of signal() function*/

#include<stdio. h>
#include<signal .h>

void sighandler(int signum);

void sighandler(int signum)
{
static count=0;


static sig_atomic_t count=0;
if (signum == SIGINT) /* Since the same handler(functio n)
can be installed to handle more than one signal, the 2nd argument <int
signum> provides a way to know which signal has invoked this handler
at that time */
{
printf("Caught SIGINT signal...\n");
dangerous calling printf ni a signal handler, no?
count++;
}

else printf("This will never get printed here...\n");

/* exit after catching the SIGINT 3 times */
if (count == 3) exit(0);
}

main()
int main (void)
{
signal(SIGINT, sighandler); /* This function installs
"sighandler " to handle the SIGINT and returns a pointer to the
previously installed handler for this signal (which is the default
handler SIG_DFL initially). If we try to install another handler to
handle SIGINT at some other time... Then the new handler replaces this
current one and returns a pointer to this handler. */

/* Now pressing the terminals interrupt key (usually Ctrl+C) will
generate the SIGINT signal. */

for(;/* wait for the signal */;) {}
}


dont you think it might be better for the loop in main to check the
static variable and end when the condition is met? this will allow
you to release all resources before exiting (not that there are
any in this trivial program, but one never knows what maintenance
programmer will come along and turn this into a non-trivial application).

Its also neater to have an easily findable exit from main.

goose,
Nov 14 '05 #8
In article <ff************ **************@ posting.google. com>,
goose <ru**@webmail.c o.za> wrote:
ga******@gmail .com (Ganesh) wrote in message
news:<e3****** *************** *****@posting.g oogle.com>... /*----------------8<------------------------------------->8------------------*/

/* A simple code example to demonstrate the use of signal() function*/

#include<stdio. h>
#include<signal .h>

void sighandler(int signum);

void sighandler(int signum)
{
static count=0;


static sig_atomic_t count=0;


Even this isn't enough for what he's doing; this makes it valid to store
a value in count, but he's also accessing it to get the previous value
with the increment.

Quoth N869 (7.14.1.1):
# [#5] If the signal occurs other than as the result of
# calling the abort or raise function, the behavior is
# undefined if the signal handler refers to any object with
^^^^^^^^^^^^^^^ ^^^^^^^^^^
# static storage duration other than by assigning a value to
^^^^^^^^^^^^^^^ ^^^^^^^^^^^^^^^ ^^^^^^^^^^^^^^^ ^^^^^^^^^^^^^^^
# an object declared as volatile sig_atomic_t, or the signal
^^^^^^^^^^^^^^^ ^^^^^^^^^^^^^^^ ^^^^^^^^^^^^^^^
# handler calls any function in the standard library other
^^^^^^^^^^^^^^^ ^^^^^^^^^^^^^^^ ^^^^^^^^^^^^^^^ ^^^^^^^
# than the abort function or the signal function with the
^^^^
# first argument equal to the signal number corresponding to
# the signal that caused the invocation of the handler.
# Furthermore, if such a call to the signal function results
# in a SIG_ERR return, the value of errno is
# indeterminate.1 98)

if (signum == SIGINT) /* Since the same handler(functio n)
can be installed to handle more than one signal, the 2nd argument <int
signum> provides a way to know which signal has invoked this handler
at that time */
{
printf("Caught SIGINT signal...\n");


dangerous calling printf ni a signal handler, no?


'Tis. See the second marked part of the quote from n869 above.

count++;
}

else printf("This will never get printed here...\n");
Unless somebody installs the handler for something other than SIGINT...

/* exit after catching the SIGINT 3 times */
if (count == 3) exit(0);
What happens if the implementation resets the signal handler to SIG_DFL
when the signal is raised? (Whether it does this is implementation-
defined, see N869 7.14.1.1#3.)
}

main()


int main (void)


This is good form, but it's not the same importance as your other
corrections. (`int main()' is the minimal form required by C99, but for
C90 `main()' is treated by the compiler the same way as `int main(void)',
the latter is merely generally accepted to be better style.)
{
signal(SIGINT, sighandler); /* This function installs
"sighandler " to handle the SIGINT and returns a pointer to the
previously installed handler for this signal (which is the default
handler SIG_DFL initially). If we try to install another handler to
handle SIGINT at some other time... Then the new handler replaces this
current one and returns a pointer to this handler. */
What happens if signal() fails here?

/* Now pressing the terminals interrupt key (usually Ctrl+C) will
generate the SIGINT signal. */

for(;/* wait for the signal */;) {}
}


dont you think it might be better for the loop in main to check the
static variable and end when the condition is met? this will allow
you to release all resources before exiting (not that there are
any in this trivial program, but one never knows what maintenance
programmer will come along and turn this into a non-trivial application).

Its also neater to have an easily findable exit from main.


It also makes it possible to write the signal handler without invoking
undefined behavior.
Better would be to have a sig_atomic_t used as an "interrupt happened"
flag at file scope that the signal handler simply sets:
--------
static volatile sig_atomic_t interrupted;
void sighandler(int signum)
{
/*This calls abort() if we get a signal other than SIGINT; this
is one of the few things that's guaranteed to be valid inside
a signal handler (N869 7.14.1.1#4, #5)
*/
assert(signum== SIGINT);
interrupted=1;
signal(signum,s ighandler);
}
--------

Then write the loop in main to check this flag and do "we've been
interrupted" stuff when the flag is set:
--------
while(1)
{
static int count=0;

/*Normally we'd want to be doing something useful inside this loop*/
while(!interrup ted)
;

printf("Caught SIGINT signal...\n");
if(++count>=3)
break;

interrupted=0;
}
--------
dave

--
Dave Vandervies dj******@csclub .uwaterloo.ca
We also should expect to learn much of value from nonbelievers in the
process. They too, it is rumored, are made in the image of God.
--Daniel Taylor, _The Myth of Certainty_
Nov 14 '05 #9
On Thu, 29 Jul 2004 16:54:43 +0000 (UTC),
Dave Vandervies <dj******@csclu b.uwaterloo.ca> wrote:


It also makes it possible to write the signal handler without invoking
undefined behavior.
You still have behaviour which isn't well defined. If a new signal is
reaised after sighandler has been entered but before it has called signal
to reinstall the handler you don't know what would happen, unless the
implementation defines what would happen. Also, the side effect on
a pending input operation isn't specified. On some systems the io
operation might terminate with an error, while one some other system it
won't. If the io operation doesn't terminate then the program won't
come around to test the "interrupte d" variable until the io operation
terminates for other reasons. In my opinion, signal is a minefield of
undefined and implementation defined behaviour.

Better would be to have a sig_atomic_t used as an "interrupt happened"
flag at file scope that the signal handler simply sets:
--------
static volatile sig_atomic_t interrupted;
void sighandler(int signum)
{
/*This calls abort() if we get a signal other than SIGINT; this
is one of the few things that's guaranteed to be valid inside
a signal handler (N869 7.14.1.1#4, #5)
*/
assert(signum== SIGINT);
interrupted=1;
signal(signum,s ighandler);
}
--------

Then write the loop in main to check this flag and do "we've been
interrupted" stuff when the flag is set:
--------
while(1)
{
static int count=0;

/*Normally we'd want to be doing something useful inside this loop*/
while(!interrup ted)
;

printf("Caught SIGINT signal...\n");
if(++count>=3)
break;

interrupted=0;
}
--------


Villy
Nov 14 '05 #10

This thread has been closed and replies have been disabled. Please start a new discussion.

Similar topics

11
3179
by: Dan | last post by:
Workshop {Flash <-> PHP <-> MYSQL} 1-4 December 2003 in Milan (Italy) 4 full immersion days in a Flash/php/MySQL project start-up. The workshop is a unique opportunity for partecipants to increase their experience in interactions between visual creativity and dynamic applications. It's a study and research about interaction between visual creativity and dynamic applications, trought a real web project developement.
2
3224
by: Eshrath | last post by:
Hi, What I am trying to do: ======================= I need to form a table in html using the xsl but the table that is formed is quite long and cannot be viewed in our application. So we are writing one object in C# which will take the entire table tag contents and renders. Ie., we need to pass "<table>………… <thead>……</thead>. <tr>.<td> <td>..<tr>.<td> <td> </table>" content to
2
10564
by: Donald Firesmith | last post by:
I am having trouble having Google Adsense code stored in XSL converted properly into HTML. The <> unfortunately become &lt; and &gt; and then no longer work. XSL code is: <script type="text/javascript"> <!]> </script> <script type="text/javascript"
11
5148
by: Scott Brady Drummonds | last post by:
Hi, everyone, I've checked a couple of on-line resources and am unable to determine how reinterpret_cast<> is different from static_cast<>. They both seem to perform a compile-time casting of one type to another. However, I'm certain that there is something else that is happening. Can someone explain the difference or recommend an online site that can explain it to me?
4
52991
by: matty.hall | last post by:
I have two classes: a base class (BaseClass) and a class deriving from it (DerivedClass). I have a List<DerivedClass> that for various reasons needs to be of that type, and not a List<BaseClass>. However, I need to cast that list to a List<BaseClass> and it is not working. The code is below. I get the following exception: "Unable to cast object of type 'System.Collections.Generic.List`1' to type 'System.Collections.Generic.List`1'." ...
8
1364
by: active | last post by:
I use quickwatch on (astrThisOne <> "") and it reports: False as it should because astrThisOne reports: "" Yet If (astrThisOne <> "") Then executes the Then clause
6
2147
by: antoniosk | last post by:
hi, when I start a compiled program in C (ex: ./program) it generates a process which "dies" at some time. this is declared on my system with + 180 exit how can I make a program which will read this exiting signal and do something else after that? thank you all in advance
3
3378
by: ajay2552 | last post by:
Hi, I have a query. All html tags start with < and end with >. Suppose i want to display either '<' or '>' or say some text like '<Company>' in html how do i do it? One method is to use &lt, &gt ,&ltCompany&gt to display '<', '>' and '<Company>' respectively. But is there any freeware code available which could implement the above functionality without having to use &gt,&lt and such stuff???
14
3158
by: Michael | last post by:
Since the include function is called from within a PHP script, why does the included file have to identify itself as a PHP again by enclosing its code in <?php... <?> One would assume that the PHP interpreter works like any other, that is, it first expands all the include files, and then parses the resulting text. Can anyone help with an explanation? Thanks, M. McDonnell
0
9476
Oralloy
by: Oralloy | last post by:
Hello folks, I am unable to find appropriate documentation on the type promotion of bit-fields when using the generalised comparison operator "<=>". The problem is that using the GNU compilers, it seems that the internal comparison operator "<=>" tries to promote arguments from unsigned to signed. This is as boiled down as I can make it. Here is my compilation command: g++-12 -std=c++20 -Wnarrowing bit_field.cpp Here is the code in...
0
9335
jinu1996
by: jinu1996 | last post by:
In today's digital age, having a compelling online presence is paramount for businesses aiming to thrive in a competitive landscape. At the heart of this digital strategy lies an intricately woven tapestry of website design and digital marketing. It's not merely about having a website; it's about crafting an immersive digital experience that captivates audiences and drives business growth. The Art of Business Website Design Your website is...
0
9208
tracyyun
by: tracyyun | last post by:
Dear forum friends, With the development of smart home technology, a variety of wireless communication protocols have appeared on the market, such as Zigbee, Z-Wave, Wi-Fi, Bluetooth, etc. Each protocol has its own unique characteristics and advantages, but as a user who is planning to build a smart home system, I am a bit confused by the choice of these technologies. I'm particularly interested in Zigbee because I've heard it does some...
1
6751
isladogs
by: isladogs | last post by:
The next Access Europe User Group meeting will be on Wednesday 1 May 2024 starting at 18:00 UK time (6PM UTC+1) and finishing by 19:30 (7.30PM). In this session, we are pleased to welcome a new presenter, Adolph Dupré who will be discussing some powerful techniques for using class modules. He will explain when you may want to use classes instead of User Defined Types (UDT). For example, to manage the data in unbound forms. Adolph will...
0
6053
by: conductexam | last post by:
I have .net C# application in which I am extracting data from word file and save it in database particularly. To store word all data as it is I am converting the whole word file firstly in HTML and then checking html paragraph one by one. At the time of converting from word file to html my equations which are in the word document file was convert into image. Globals.ThisAddIn.Application.ActiveDocument.Select();...
0
4570
by: TSSRALBI | last post by:
Hello I'm a network technician in training and I need your help. I am currently learning how to create and manage the different types of VPNs and I have a question about LAN-to-LAN VPNs. The last exercise I practiced was to create a LAN-to-LAN VPN between two Pfsense firewalls, by using IPSEC protocols. I succeeded, with both firewalls in the same network. But I'm wondering if it's possible to do the same thing, with 2 Pfsense firewalls...
0
4825
by: adsilva | last post by:
A Windows Forms form does not have the event Unload, like VB6. What one acts like?
1
3279
by: 6302768590 | last post by:
Hai team i want code for transfer the data from one system to another through IP address by using C# our system has to for every 5mins then we have to update the data what the data is updated we have to send another system
3
2193
bsmnconsultancy
by: bsmnconsultancy | last post by:
In today's digital era, a well-designed website is crucial for businesses looking to succeed. Whether you're a small business owner or a large corporation in Toronto, having a strong online presence can significantly impact your brand's success. BSMN Consultancy, a leader in Website Development in Toronto offers valuable insights into creating effective websites that not only look great but also perform exceptionally well. In this comprehensive...

By using Bytes.com and it's services, you agree to our Privacy Policy and Terms of Use.

To disable or enable advertisements and analytics tracking please visit the manage ads & tracking page.