linux编程多进程和libnotify桌面通知
OS: ubuntu 12.04 x86_64
GCC: gcc 版本 4.6.3 (Ubuntu/Linaro 4.6.3-1ubuntu5)
#include <stdio.h> #include <stdlib.h> #include <getopt.h> #include <string.h> #include <unistd.h> #include <fcntl.h> #include <libnotify/notify.h> void usage(char *); int close_std(); char * const short_options = "hf:b:"; struct option long_options[] = { {"help", 2, NULL, 'h'}, {"file", 2, NULL, 'f'}, {"body", 2, NULL, 'b'}, {NULL, 0, NULL, 0}, }; char * player = "/usr/bin/mplayer"; char * music_file = "/usr/share/sounds/freedesktop/stereo/alarm-clock-elapsed.oga"; char * notify_body = "You have a new mail!"; void usage(char * program_name) { printf("%s -h [--help]\n" "-f [--file=filename] path to music file.\n" "-b [--body=content] the body of notify dialog.\n", program_name); exit(1); } int close_std() { if(close(STDIN_FILENO) == -1 || close(STDOUT_FILENO) ==-1 || close(STDERR_FILENO) == -1) { return -1; } return 0; } int main(int argc, char **argv) { int c, pid; char * program_name = argv[0]; while((c = getopt_long(argc, argv, short_options, long_options, NULL)) != -1) { switch(c) { case 'h': usage(program_name); case 'f': music_file = optarg; break; case 'b': notify_body = optarg; break; case '?': usage(program_name); default: usage(program_name); } } if((close_std() == -1)) { perror("close_std()"); exit(1); } //player music if((pid = fork()) < 0) { perror("fork()"); exit(1); } else if(pid == 0) { if(execlp(player, player, music_file, (char *)0) < 0) { perror("execlp()"); exit(1); } exit(0); } //send notify information to user if((pid = fork()) < 0) { perror("fork()"); } else if(pid == 0) { notify_init("Mail"); NotifyNotification * notify = notify_notification_new("Mail", notify_body, "Mail"); notify_notification_show(notify, NULL); exit(0); } exit(0); }
Makefile:
SRC_INCLUDE=-I/usr/include/glib-2.0 -I/usr/lib/x86_64-linux-gnu/glib-2.0/include -I/usr/include/gdk-pixbuf-2.0 CC=gcc MOD_CFLAGS=-fPIC CFLAGS=-g -O2 -DHAVE_CONFIG_H -DNSCORE LDFLAGS= LIBS=-lnotify DBG_FLAGS= -DDEBUG=1 OUT_PROGRAM= newmail_notify all: main main: $(CC) $(MOD_CFLAGS) $(CFLAGS) $(SRC_INCLUDE) -o $(OUT_PROGRAM) newmail_notify.c $(MOD_LDFLAGS) $(LDFLAGS) $(LIBS)