40 lines
		
	
	
	
		
			775 B
		
	
	
	
		
			C
		
	
	
	
	
	
			
		
		
	
	
			40 lines
		
	
	
	
		
			775 B
		
	
	
	
		
			C
		
	
	
	
	
	
| #include <stdint.h>
 | |
| #include <stdio.h>
 | |
| #include <sys/types.h>
 | |
| #include <unistd.h>
 | |
| #include <unistd.h>
 | |
| 
 | |
| int main(int argc, char **argv) {
 | |
| 	if(argc < 3) {
 | |
| 		fprintf(stderr, "Usage: %s pidfile command [arguments]\n", argv[0]);
 | |
| 		return 1;
 | |
| 	}
 | |
| 
 | |
| 	const char *pidfilename = argv[1];
 | |
| 	FILE *pidfile = fopen(pidfilename, "w");
 | |
| 	if(pidfile == NULL) {
 | |
| 		perror("fopen (opening pidfile)");
 | |
| 		return 1;
 | |
| 	}
 | |
| 
 | |
| 	pid_t own_pid = getpid();
 | |
| 	
 | |
| 	if(fprintf(pidfile, "%ji\n", (intmax_t) own_pid) < 0) {
 | |
| 		perror("fprintf (printing pid)");
 | |
| 		fclose(pidfile);
 | |
| 		return 1;
 | |
| 	}
 | |
| 
 | |
| 	if(fclose(pidfile) != 0) {
 | |
| 		perror("fclose (pidfile)");
 | |
| 		return 1;
 | |
| 	}
 | |
| 
 | |
| 	char **daemon_argv = &argv[2];
 | |
| 	const char *daemon_command = daemon_argv[0];
 | |
| 
 | |
| 	execvp(daemon_command, daemon_argv);
 | |
| 
 | |
| 	perror("execvp");
 | |
| 	return 1;
 | |
| }
 |