zoukankan      html  css  js  c++  java
  • 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)
  • 相关阅读:
    DHCP服务器
    继承、抽象、多态
    范围随机数Random
    阿里、北理工、清华以及华为的镜像站
    创建kafka生产对象
    kafka消费者的配置
    Kafka 流数据 SQL 引擎 -- KSQL
    认证maven工程
    基础算法
    Java基础
  • 原文地址:https://www.cnblogs.com/huazi/p/2835758.html
Copyright © 2011-2022 走看看