Advertisement

03.09.2008 at 10:29AM PDT, ID: 23226789
[x]
Attachment Details
[x]
The Solution Rating System

With so many solutions, how can you tell which solutions are most likely to help you and which ones are not? To provide you with a tool to use, we rate our solutions based on various elements that most accurately determine if a solution is a quality solution. To explain what factors affect the solution rating, here are the elements we take into consideration when formulating our solution rating.

  • The Grade of the Solution
  • The Zone Rank of the Expert Providing the Solution
  • The Number of Author and Expert Comments
  • The Number of Experts Contributing
  • The Feedback of the Community

Your Input Matters
Because of the way the system is set up, the most important variable in this equation is you. As a member of Experts Exchange, you are able to cast your vote on the quality of the solutions in regard to how complete, accurate, helpful and easy to understand each solution is. When you provide your feedback, each rating is adjusted accordingly. So, if you see a solution that has a poor rating that you think is a good solution, let us know by rating it. As you do, the rating will be adjusted and will become more accurate for other members of our site.

If you have any suggestions that you would like to make for our rating system, please ask a question in the Suggestions Zone of Community Support.

Thank you!

Daemon behavior (detaching from tty)

This question relates to programming for Linux.  I understand that all programs which run under a bash terminal will exit when the terminal closes, unless they are run in the background by appending an '&' symbol at the command line.

But I assume most serious daemons are programmed to detach from the terminal automatically, i.e. this behavior is coded into the application itself.  When I look at the init.d scripts for many popular daemons, such as Apache for example, I do not see a '&' symbol after the start-stop-daemon command in the init.d script, so I assume these daemons are coded to detach from the terminal.

So I tried to write my application so that it automatically detaches from the terminal.  According to the linux man page, this can be done using ioctl.  As a small test, I tried:

      int fd = open("/dev/tty", O_RDWR);
      if (fd >= 0) {
            int ret = ioctl(fd, TIOCNOTTY, 0);
            if (ret == -1) perror("ioctl");
            close(fd);
      }
      else perror("open");

      // pretend we are a daemon...
      for (;;) sleep(10);

This seems to work, because when I view all running processes, a question mark appears under TTY.  But this still doesn't produce the behavior I would expect from a daemon.  When I execute the program from the bash prompt, it still hangs in the foreground, rather than returning me to the bash prompt.  Why does it do this, when it is no longer associated with the current terminal?
Start your free trial to view this solution
Question Stats
Zone: Programming
Question Asked By: chsalvia
Solution Provided By: ravenpl
Participating Experts: 5
Solution Grade: A
Views: 31
Translate:
Loading Advertisement...
03.09.2008 at 11:04AM PDT, ID: 21082092

Rank: Sage

All comments and solutions are available to Premium Service Members only.

Start your 7 day free trial and see for yourself why Experts Exchange is the easiest and most proven technology resource in the world. Get Started

Already a member? Login to view this solution.

 
03.09.2008 at 11:14AM PDT, ID: 21082123

Rank: Guru

All comments and solutions are available to Premium Service Members only.

Start your 7 day free trial and see for yourself why Experts Exchange is the easiest and most proven technology resource in the world. Get Started

Already a member? Login to view this solution.

 
03.09.2008 at 11:18AM PDT, ID: 21082132

Rank: Guru

All comments and solutions are available to Premium Service Members only.

Start your 7 day free trial and see for yourself why Experts Exchange is the easiest and most proven technology resource in the world. Get Started

Already a member? Login to view this solution.

 
03.09.2008 at 11:33AM PDT, ID: 21082187

Rank: Guru

All comments and solutions are available to Premium Service Members only.

Start your 7 day free trial and see for yourself why Experts Exchange is the easiest and most proven technology resource in the world. Get Started

Already a member? Login to view this solution.

 
03.09.2008 at 12:05PM PDT, ID: 21082277

Rank: Guru

All comments and solutions are available to Premium Service Members only.

Start your 7 day free trial and see for yourself why Experts Exchange is the easiest and most proven technology resource in the world. Get Started

Already a member? Login to view this solution.

 
03.09.2008 at 06:05PM PDT, ID: 21083480

Rank: Wizard

All comments and solutions are available to Premium Service Members only.

Start your 7 day free trial and see for yourself why Experts Exchange is the easiest and most proven technology resource in the world. Get Started

Already a member? Login to view this solution.

 
03.09.2008 at 08:16PM PDT, ID: 21083956

Rank: Guru

All comments and solutions are available to Premium Service Members only.

Start your 7 day free trial and see for yourself why Experts Exchange is the easiest and most proven technology resource in the world. Get Started

Already a member? Login to view this solution.

 
 
Loading Advertisement...
Microsoft
  • Internet Protocols
  • Applications
  • Development
  • OS
  • Hardware
  • Windows Security
Apple
  • Operating Systems
  • Hardware
  • Programming
  • Networking
  • Software
Internet
  • Search Engines
  • File Sharing
  • WebTrends / Stats
  • Spy / Ad Blockers
  • Web Browsers
  • New Net Users
  • Web Development
  • Chat / IM
  • Anti Spam
  • Web Servers
  • Anti-Virus
  • Email Clients
Gamers
  • Tips
  • Online / MMORPG
  • Puzzle
  • Emulators
  • Action / Adventure
  • Role Playing
  • Consoles
  • Game Programming
  • Strategy
  • Sports
  • Misc
  • Computer Games
Digital Living
  • Hardware
  • New Net Users
  • New Users
  • Software
  • Digital Music
  • Gaming World
  • Home Security
  • Apple
  • Networking Hardware
Virus & Spyware
  • Vulnerabilities
  • IDS
  • Encryption
  • Anti-Virus
  • Operating Systems Security
  • Software Firewalls
  • WebApplications
  • Cell Phones
  • Operating Systems
  • Internet
  • Hardware Firewalls
Hardware
  • Handhelds / PDAs
  • Displays / Monitors
  • Components
  • Networking Hardware
  • Peripherals
  • Laptops/Notebooks
  • Storage
  • Servers
  • Desktops
  • New Users
  • Misc
  • Apple
Software
  • System Utilities
  • Industry Specific
  • Network Management
  • Photos / Graphics
  • Page Layout
  • VMWare
  • Misc
  • Web Development
  • OS
  • CYGWIN
  • Voice Recognition
  • Message Queue
  • Quality Assurance
  • Security
  • Firewalls
  • MultiMedia Applications
  • Development
  • Database
  • Office / Productivity
  • Business Management
  • OS/2 Apps
  • Server Software
  • Internet / Email
ITPro
  • OS
  • Storage
  • Encryption
  • Operating Systems Security
  • Apple Hardware
  • Laptops & Notebooks
  • Servers
  • Networking Hardware
  • Peripherals
  • Devices
  • Displays / Monitors
  • WebTrends / Stats
  • Search Engines
  • Firewalls
  • WebApplications
  • IDS
  • Vulnerabilities
  • Email Clients
  • File Sharing
  • Spy / Ad Blockers
  • Web Browsers
  • Web Servers
  • Networking
  • Anti-Virus
  • Chat / IM
  • Anti Spam
Developer
  • Web Servers
  • Web Browsers
  • Game Programming
  • Dev Tools
  • Industry Specific
  • Office / Productivity
  • Database
  • CYGWIN
  • Web Development
  • Search Engines
  • File Sharing
  • WebTrends / Stats
  • Programming
  • Content Management
  • Application Servers
  • Protocols
Storage
  • Removable Backup Media
  • Storage Technology
  • Servers
  • Grid
  • Remote Access
  • Backup / Restore
  • Misc
  • Hard Drives
OS
  • Miscellaneous
  • Security
  • Development
  • Linux
  • VMWare
  • MainFrame OS
  • Unix
  • Apple
  • OS / 2
  • AS / 400
  • BeOS
  • Microsoft
  • VMS / OpenVMS
Database
  • Oracle
  • Miscellaneous
  • MySQL
  • Software
  • Sybase
  • Contact Management
  • PostgreSQL
  • Data Manipulation
  • Clarion
  • InterSystems Cache
  • Siebel
  • MUMPS
  • OLAP
  • SQLBase
  • SAS
  • GIS & GPS
  • 4GL
  • Berkeley DB
  • DB2
  • Informix
  • Interbase / Firebird
  • FoxPro
  • Reporting
  • LDAP
  • Filemaker Pro
  • MS SQL Server
  • dBase
  • MS Access
Security
  • Misc
  • Web Browsers
  • Software Firewalls
  • Operating Systems Security
  • File Sharing
  • Spy / Ad Blockers
  • Vulnerabilities
  • WebApplications
  • IDS
  • Anti-Virus
  • Encryption
  • Anti Spam
  • Email Clients
  • VPN
  • Chat / IM
Programming
  • Editors IDEs
  • Installation
  • Handhelds / PDAs
  • Multimedia Programming
  • System / Kernel
  • Algorithms
  • Game
  • Signal Processing
  • Project Management
  • Open Source
  • Database
  • Misc
  • Languages
  • Processor Platforms
  • Theory
Web Development
  • Scripting
  • Blogs
  • Web Servers
  • Software
  • Search Engines
  • Web Graphics
  • Images
  • Internet Marketing
  • Images and Photos
  • Components
  • Document Imaging
  • Web Languages/Standards
  • Illustration
  • WebApplications
  • Fonts
  • WebTrends / Stats
  • Authoring
  • Digital Camera Software
  • Miscellaneous
Networking
  • Protocols
  • Apple Networking
  • Network Management
  • Message Queue
  • Application Servers
  • Content Management
  • File Servers
  • Email Servers
  • Misc
  • Java Editors & IDEs
  • Wireless
  • Networking Hardware
  • Backup / Restore
  • System Utilities
  • ISPs & Hosting
  • Web Servers
  • Storage Technology
  • Removable Backup Media
  • Servers
  • Broadband
  • Grid
  • OS / 2
  • Novell Netware
  • Unix Networking
  • Windows Networking
  • Security
  • Telecommunications
  • Operating Systems
  • Linux Networking
Other
  • Community Advisor
  • Lounge
  • Community Support
  • New Net Users
  • Philosophy / Religion
  • Math / Science
  • Miscellaneous
  • URLs
  • Expert Lounge
  • Politics
  • Puzzles / Riddles
Community Support
  • Suggestions
  • New to EE
  • New Topics
  • Community Advisor
  • CleanUp
  • Announcements
  • General
  • Feedback
  • Input
  • EE Bugs
 
03.09.2008 at 11:04AM PDT, ID: 21082092

Rank: Sage

 
03.09.2008 at 11:14AM PDT, ID: 21082123

Rank: Guru

Please see:

http://www.hmug.org/man/2/setsid.php

You need to refer to a very good book by W. Richard Stevens "Unix Network Programming" 1st edition or his other book "Advanced Programming in the Unix Environment"

 
03.09.2008 at 11:18AM PDT, ID: 21082132
 
03.09.2008 at 11:33AM PDT, ID: 21082187
 
03.09.2008 at 12:05PM PDT, ID: 21082277

Rank: Guru

You can use fork() to start a child process running as a daemon. The parent then quits, leaving the child process running in the background. Very short example below.

Unix Daemon Server Programming
http://www.enderunix.org/documents/eng/daemon.php
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
16:
17:
18:
19:
20:
21:
22:
23:
24:
25:
26:
27:
#include <unistd.h>
#include <stdio.h>
 
int main()
{
        pid_t pid = fork();
 
        if(pid < 0)
        {
                // Oops, something wicked this way comes!
                puts("Error forking");
                perror(NULL);
        }
        else
        if(0 == pid)
        {
                setsid(); // Detatch from parent
                for(;;) sleep(0); // Keep child alive to prove it's daemonised
        }
        else
        {
                // Parent waits for child
                printf("Daemon started (%d)\n", pid);
        }
 
        return 0;
}
Open in New Window
Assisted Solution
 
03.09.2008 at 06:05PM PDT, ID: 21083480

Rank: Wizard

There is actually a function to do all the above - see "man -s 3 daemon"
 
03.09.2008 at 08:16PM PDT, ID: 21083956

Rank: Guru

All the posts above about using fork() are correct and I agree with all the experts.
But your question is not that simple as it seems :-)

> When I execute the program from the bash prompt, it still hangs in the foreground, rather than returning me to the bash prompt.  Why does it do this, when it is no longer associated with the current terminal?

Closing controlling terminal does not mean exiting from the process. Also there is no way to close login shell's tty from any child process.

You have closed the controlling terminal of your current process, but not of your parent shell (it still owns it) and shell knows nothing about your manipulation with tty device. Also your program never returns control to the parent shell and shell still waits until your program exits. That's a native behavior of your _shell_ to run any program and wait while it exits until & is used. And that's why all this these tricks with fork() (BTW ampersand in a shell also maps to the separate fork() syscall).

But I know many advanced sysadmins and programmers who think that 'fork' is the only way to create constantly running process in background. But that's not the absolute true :-)

That's not necessary to use fork(). You _may_ create a background process that never exits without using fork(), but you loose your login shell in that case and you should connect again (but now the program will be running in a background). Since we can't close the tty of parent one easy way to 'detach' is to kill() the parent. See two sample C programs in attachment. One with fork() the other with killing parent. I used this sample programs when leading Linux programming training some time ago, specially to clarify why fork() is not the only, but the only good way to daemonize.
When testing, daemon_bad kills your parent shell, so be prepared to disconnect and get new login: prompt, when running on local machine (the daemon still remains running). When running from ssh session, we have more than 1 parent to kill to completely close the session, so just close the session window and it still will be running.






1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
16:
17:
18:
19:
20:
21:
22:
23:
24:
/* demonstrate easy daemonization */
/* (c) 2005-2008, by Nopius */
#include <unistd.h>
#include <signal.h>
#include <stdlib.h>
int
main()
{
  struct sigaction act;
  /* some info about me */
  printf("Pid: %d, Ppid: %d, Pgrp: %d, Sid: %d\n", getpid(), getppid(), 
    getpgrp(), getsid(0));
 
  act.sa_handler=SIG_IGN;
  sigaction(SIGHUP, &act, NULL); /* ignore termilal disconnect */
 
  kill(getppid(), SIGKILL); /* kill the parrent */
  do 
  {
      printf("I'm a daemon\n");
      sleep(5);
    } while(1);
 
}
Open in New Window
 
Daemonization with fork() call
 
 
BAD daemonization without fork()
 
Assisted Solution
 
 
20080236-EE-VQP-29 / EE_QW_2_20070628