<%@ page language="java" import="java.util.*, java.lang.management.*" pageEncoding="UTF-8"%>
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN"
"http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8" />
<title>系统参数输出</title>
<style type="text/css">
table
{
border-collapse:collapse;
}
td
{
border:1px solid #427BD6;
}
</style>
</head>
<body style="background-color:#f2f2f2;">
<h1>环境变量</h1>
<table>
<%
Map<String, String> map = System.getenv();
//RuntimeMXBean runtimeMxBean = ManagementFactory.getRuntimeMXBean();
//Map<String, String> map = runtimeMxBean.getSystemProperties();
for(String key : map.keySet())
{
out.println("<tr>");
out.println("<td>");
out.println(key);
out.println("</td>");
out.println("<td>");
out.println(map.get(key));
out.println("</td>");
out.println("</tr>");
}
%>
</table>
<h1>JVM参数</h1>
<table>
<%
RuntimeMXBean runtimeMxBean = ManagementFactory.getRuntimeMXBean();
out.println("<tr>");
out.println("<td>");
out.println(runtimeMxBean.getVmVendor()+" || "+runtimeMxBean.getVmName() +" || "+ runtimeMxBean.getVmVersion());
out.println("</td>");
out.println("</tr>");
out.println("<tr>");
out.println("<td>");
out.println(runtimeMxBean.getSpecVendor()+" || "+runtimeMxBean.getSpecName() +" || "+ runtimeMxBean.getSpecVersion());
out.println("</td>");
out.println("</tr>");
out.println("<tr>");
out.println("<td>");
out.println(runtimeMxBean.getName()+" || "+runtimeMxBean.getStartTime() +" || "+ runtimeMxBean.getUptime());
out.println("</td>");
out.println("</tr>");
out.println("<tr>");
out.println("<td>");
out.println("MaxMemory="+Runtime.getRuntime().maxMemory()/1024/1024 + "m ");
out.println("TotalMemory="+Runtime.getRuntime().totalMemory()/1024/1024 + "m ");
out.println("FreeMemory="+Runtime.getRuntime().freeMemory()/1024/1024 + "m ");
out.println("</td>");
out.println("</tr>");
List<MemoryPoolMXBean> memoryPoolMXBeans = ManagementFactory.getMemoryPoolMXBeans();
for (MemoryPoolMXBean bean : memoryPoolMXBeans)
{
out.println("<tr>");
out.println("<td>");
out.println(bean.getName()+" || "+bean.getType()+" || Init="+bean.getUsage().getInit()/1024/1024+
"m Max="+bean.getUsage().getMax()/1024/1024+"m Used="+bean.getUsage().getUsed()/1024/1024+
"m Committed="+bean.getUsage().getCommitted()/1024/1024+"m ");
out.println("</td>");
out.println("</tr>");
}
List<String> arguments = runtimeMxBean.getInputArguments();
for(String arg:arguments)
{
out.println("<tr>");
out.println("<td>");
out.println(arg);
out.println("</td>");
out.println("</tr>");
}
%>
</table>
<h1>系统参数</h1>
<table>
<%
Properties props = System.getProperties();
for(Object o:props.keySet())
{
out.println("<tr>");
out.println("<td>");
out.println(o);
out.println("</td>");
out.println("<td>");
out.println(props.get(o));
out.println("</td>");
out.println("</tr>");
}
%>
</table>
</body>
</html>
Category Archives: OS&Runtime
Java四种引用方式
最近写了个例子,说明了一下强引用、软引用、弱引用、虚引用的区别。
1、NString.java
package com.neohope.reference;
/**
* Created by Hansen
*/
public class NString {
private String name;
private String value;
public NString(String name, String value)
{
this.name = name;
this.value=value;
}
public NString(String name, StringBuilder builder)
{
this.name = name;
this.value=builder.toString();
}
public String Name()
{
return name;
}
public String Value()
{
return value;
}
@Override
protected void finalize()
{
System.out.println(">> "+Name()+" finalize called");
try {
super.finalize();
} catch (Throwable throwable) {
throwable.printStackTrace();
}
}
}
2、TestReferenceA.java
package com.neohope.reference;
import java.lang.ref.PhantomReference;
import java.lang.ref.ReferenceQueue;
import java.lang.ref.SoftReference;
import java.lang.ref.WeakReference;
import java.util.WeakHashMap;
/**
* Created by Hansen
* JVM参数:
* -XX:+PrintGCDetails
* -Xms6m -Xmx12m
*/
public class TestReferenceA {
public static void main(String[] args) {
//申请内存
Runtime rt=Runtime.getRuntime();
System.out.println("Total memory is "+rt.totalMemory());
int MemSize = 1024*1024*1;
StringBuilder builder = new StringBuilder(MemSize);
for (int i=0;i<MemSize/8;i++) {
builder.append("ABCDEFGH");
}
System.out.println("Total memory is "+rt.totalMemory());
//用s00与s01两个大字符串演示强引用与软引用的区别
NString s00 = new NString("s00",builder);
NString s01 = new NString("s01",builder);
//s02与s03演示WeakReference的两种用法
NString s02 = new NString("s02","s03");
String key03 = new String("k03");
NString s03 = new NString("s03","s03");
//s04演示PhantomReference
NString s04 = new NString("s04","s04");
System.out.println("Total memory is "+rt.totalMemory());
//第1类、强引用的对象,也最常用到的类型,内存不足时JVM将抛出异常也不要释放这些内存
NString strongRef = s00;
//第2类、只有软引用的数据,内存不足时JVM会回收这些内存
SoftReference<NString> softRef = new SoftReference<NString>(s01);
//第3类、只有弱引用的数据,无论内存是否充足JVM会回收这些内存,也就是弱引用不会影响对象的生命周期
WeakReference<NString> weakRef = new WeakReference<NString>(s02);
//WeakHashMap很有用,当key022为null时,s022也就会被GC咯
WeakHashMap weakHashMap = new WeakHashMap();
weakHashMap.put(key03,s03);
//第4类、只有虚引用的数据,一开始refQueue为空,被GC才会有值
ReferenceQueue refQueue = new ReferenceQueue<String>();
PhantomReference<NString> phantomRef = new PhantomReference<NString>(s04, refQueue);
//有强引用时,输出初始化情况
System.out.println("With strong ref strongRef is " + (strongRef==null?"null":"not null"));
System.out.println("With strong ref softRef is " + (softRef.get()==null?"null":"not null"));
System.out.println("With strong ref weakRef is " + (weakRef.get()==null?"null":"not null"));
System.out.println("With strong ref weakHashMap is " + (weakHashMap.isEmpty() ?"empty":"not empty"));
//这里为null,当对象被GC时,会得到虚引用对象
System.out.println("With strong ref refQueue has " + refQueue.poll());
System.out.println();
//去掉初始的强引用
s00 = null;
s01 = null;
s02 = null;
s03 = null;
s04 = null;
//多数情况下,没有来得及GC
System.out.println("Before gc strongRef is " + (strongRef==null?"null":"not null"));
System.out.println("Before gc softRef is " + (softRef.get()==null?"null":"not null"));
System.out.println("Before gc weakRef is " + (weakRef.get()==null?"null":"not null"));
System.out.println("Before gc weakHashMap is " + (weakHashMap.isEmpty() ?"empty":"not empty"));
//null,当对象被GC时,会得到虚引用对象
System.out.println("Before gc refQueue has " + refQueue.poll());
System.out.println();
//强制GC
System.gc();
System.out.println("After first gc strongRef is " + (strongRef==null?"null":"not null"));
System.out.println("After first gc softRef is " + (softRef.get()==null?"null":"not null"));
//null,weakRef已经被释放了
System.out.println("After first gc weakRef is " + (weakRef.get()==null?"null":"not null"));
System.out.println("After first gc weakHashMap is " + (weakHashMap.isEmpty() ?"empty":"not empty"));
//与运行环境及GC方法有关,会出现一次有值的情况,然后一直为null
System.out.println("After first gc refQueue has " + refQueue.poll());
System.out.println();
//将key03设为null,强制GC
key03 = null;
System.gc();
System.out.println("After second gc strongRef is " + (strongRef==null?"null":"not null"));
System.out.println("After second gc softRef is " + (softRef.get()==null?"null":"not null"));
//null
System.out.println("After second gc weakRef is " + (weakRef.get()==null?"null":"not null"));
//empty,由于key被设为空,则会释放掉弱引用对象了
System.out.println("After second gc weakHashMap is " + (weakHashMap.isEmpty() ?"empty":"not empty"));
//与运行环境及GC方法有关,会出现一次有值的情况,然后一直为null
System.out.println("After second gc refQueue has " + refQueue.poll());
System.out.println();
//Finalization
System.runFinalization();
System.out.println("After Finalization strongRef is " + (strongRef==null?"null":"not null"));
System.out.println("After Finalization softRef is " + (softRef.get()==null?"null":"not null"));
//null
System.out.println("After Finalization weakRef is " + (weakRef.get()==null?"null":"not null"));
//empty
System.out.println("After Finalization weakHashMap is " + (weakHashMap.isEmpty() ?"empty":"not empty"));
//与运行环境及GC方法有关,会出现一次有值的情况,然后一直为null
System.out.println("After Finalization refQueue has " + refQueue.poll());
System.out.println();
//申请内存,造成内存不足
System.out.println("Total memory is "+rt.totalMemory());
StringBuilder builder2 = new StringBuilder(MemSize);
for (int i=0;i<MemSize/8;i++) {
builder2.append("ABCDEFGH");
}
NString tmp0 = new NString("tmp0", builder2);
System.out.println("Total memory is "+rt.totalMemory());
System.out.println("When mem is low strongRef is " + (strongRef==null?"null":"not null"));
//null,内存不足时软引用会被释放
System.out.println("When mem is low softRef is " + (softRef.get()==null?"null":"not null"));
//null
System.out.println("When mem is low weakRef is " + (weakRef.get()==null?"null":"not null"));
//empty
System.out.println("When mem is low weakHashMap is " + (weakHashMap.isEmpty() ?"empty":"not empty"));
//与运行环境及GC方法有关,会出现一次有值的情况,然后一直为null
System.out.println("When mem is low refQueue has " + refQueue.poll());
System.out.println();
//再次申请内存,JMV会内存爆掉
NString tmp1 = null;
try
{
tmp1 = new NString("tmp1",builder2);
}
catch(OutOfMemoryError ex)
{
System.out.println("Not enough memory");
}
//null
System.out.println("tmp1 is " + (tmp1==null?"null":"not null"));
//就算是抛出OutOfMemoryError,仍然不会释放
System.out.println("When not enough memory strongRef is " + (strongRef==null?"null":"not null"));
//null
System.out.println("When not enough memory softRef is " + (softRef.get()==null?"null":"not null"));
//null
System.out.println("When not enough memory weakRef is " + (weakRef.get()==null?"null":"not null"));
//empty
System.out.println("When not enough memory weakHashMap is " + (weakHashMap.isEmpty() ?"empty":"not empty"));
//null
System.out.println("When not enough memory refQueue has " + refQueue.poll());
System.out.println();
}
}
3、输出
Total memory is 6094848 Total memory is 6094848 Total memory is 11390976 With strong ref strongRef is not null With strong ref softRef is not null With strong ref weakRef is not null With strong ref weakHashMap is not empty With strong ref refQueue has null Before gc strongRef is not null Before gc softRef is not null Before gc weakRef is not null Before gc weakHashMap is not empty Before gc refQueue has null After first gc strongRef is not null After first gc softRef is not null After first gc weakRef is null After first gc weakHashMap is not empty >> s04 finalize called After first gc refQueue has null >> s02 finalize called After second gc strongRef is not null After second gc softRef is not null After second gc weakRef is null After second gc weakHashMap is not empty After second gc refQueue has java.lang.ref.PhantomReference@15d63da After Finalization strongRef is not null After Finalization softRef is not null After Finalization weakRef is null After Finalization weakHashMap is not empty After Finalization refQueue has null Total memory is 14221312 Total memory is 14221312 When mem is low strongRef is not null When mem is low softRef is not null When mem is low weakRef is null When mem is low weakHashMap is not empty When mem is low refQueue has null >> s01 finalize called Not enough memory tmp1 is null When not enough memory strongRef is not null When not enough memory softRef is null When not enough memory weakRef is null When not enough memory weakHashMap is empty When not enough memory refQueue has null
制作Ubuntu安装U盘
本文以Ubuntu为例,讲解一下Linux安装U盘的制作方法。
首先,下载安装盘的ISO镜像。
http://releases.ubuntu.com/
然后要知道,自己的BIOS模式是什么,是Legecy还是UEFI。这个通过查看操作系统信息或BIOS设置就可以知道。
如果是Legecy模式:
1、下载工具universal usb installer
2、制作安装U盘。
3、重启,从U盘启动即可
如果是UEFI模式:
1、那只需要将盘格式化为FAT32模式,然后将64位的ISO镜像解压到盘的根目录就好了。
2、保证在盘的根目录可以开单到UEFI目录。
3、重启,关闭BIOS中的安全启动保护,从而可以用U盘启动
4、重启,从U盘启动即可
5、安装后,记得打开BIOS中安全安全启动保护
Windows创建符号连接
1、mklink
该命令可以创建符号链接、硬链接及快捷方式。
MKLINK [[/D] | [/H] | [/J]] Link Target
/D Creates a directory symbolic link. Default is a file
symbolic link.
/H Creates a hard link instead of a symbolic link.
/J Creates a Directory Junction.
Link specifies the new symbolic link name.
Target specifies the path (relative or absolute) that the new link
refers to.
2、fsutil hardlink
该命令可以创建硬链接。
create Create a hardlink list Enumerate hardlinks on a file
3、junction
该工具是SYSINTERNALS提供的,可以新增或删除符号链接。
The first usage is for displaying reparse point information, the
second usage is for creating a junction point, and the last for
deleting a junction point:
usage: junction.exe [-s] [-q] <file or directory>
-q Don't print error messages (quiet)
-s Recurse subdirectories
usage: junction.exe <junction directory> <junction target>
example: junction d:\link c:\windows
usage: junction.exe -d <junction directory>
DBUS发送接收数据(下)
1、编译后,由于没有进行配置,默认是无法运行的。
为了可以正常运行,增加或修改下面的配置文件即可。
/etc/dbus-1.0/system-local.conf
<!-- This configuration file controls the systemwide message bus.
Add a system-local.conf and edit that rather than changing this
file directly. -->
<!-- Note that there are any number of ways you can hose yourself
security-wise by screwing up this file; in particular, you
probably don't want to listen on any more addresses, add any more
auth mechanisms, run as a different user, etc. -->
<!DOCTYPE busconfig PUBLIC "-//freedesktop//DTD D-Bus Bus Configuration 1.0//EN"
"http://www.freedesktop.org/standards/dbus/1.0/busconfig.dtd">
<busconfig>
<!-- Our well-known bus type, do not change this -->
<type>system</type>
<!-- Run as special user -->
<user>messagebus</user>
<!-- Fork into daemon mode -->
<fork/>
<!-- We use system service launching using a helper -->
<standard_system_servicedirs/>
<!-- This is a setuid helper that is used to launch system services -->
<servicehelper>/usr/lib/dbus-1.0/dbus-daemon-launch-helper</servicehelper>
<!-- Write a pid file -->
<pidfile>/var/run/dbus/pid</pidfile>
<!-- Enable logging to syslog -->
<syslog/>
<!-- Only allow socket-credentials-based authentication -->
<auth>EXTERNAL</auth>
<!-- Only listen on a local socket. (abstract=/path/to/socket
means use abstract namespace, don't really create filesystem
file; only Linux supports this. Use path=/whatever on other
systems.) -->
<listen>unix:path=/var/run/dbus/system_bus_socket</listen>
<policy context="default">
<!-- All users can connect to system bus -->
<allow user="*"/>
<!-- Holes must be punched in service configuration files for
name ownership and sending method calls -->
<allow own="*"/>
<allow send_type="method_call"/>
<!-- Signals and reply messages (method returns, errors) are allowed
by default -->
<allow send_type="signal"/>
<allow send_requested_reply="true" send_type="method_return"/>
<allow send_requested_reply="true" send_type="error"/>
<!-- All messages may be received by default -->
<allow receive_type="method_call"/>
<allow receive_type="method_return"/>
<allow receive_type="error"/>
<allow receive_type="signal"/>
<!-- Allow anyone to talk to the message bus -->
<allow send_destination="org.freedesktop.DBus"/>
<!-- But disallow some specific bus services -->
<deny send_destination="org.freedesktop.DBus"
send_interface="org.freedesktop.DBus"
send_member="UpdateActivationEnvironment"/>
<deny send_destination="org.freedesktop.DBus"
send_interface="org.freedesktop.systemd1.Activator"/>
</policy>
<!-- Only systemd, which runs as root, may report activation failures. -->
<policy user="root">
<allow send_destination="org.freedesktop.DBus"
send_interface="org.freedesktop.systemd1.Activator"/>
</policy>
<!-- Config files are placed here that among other things, punch
holes in the above policy for specific services. -->
<includedir>system.d</includedir>
<include if_selinux_enabled="yes" selinux_root_relative="yes">contexts/dbus_contexts</include>
</busconfig>
2、测试消息发送
服务端:
$./testdbus_s.bin receive Listening for signals Match rule sent Got Signal with value: Hello Got Signal with value: Hi Bye......
客户端:
$./testdbus_s.bin send Hello Sending signal with value: Hello Signal Sent $./testdbus_s.bin send Hi Sending signal with value: Hi Signal Sent $./testdbus_s.bin send Bye Sending signal with value: Bye Signal Sent
3、测试方法调用
服务端:
$./testdbus_s.bin listen Listening for method calls Method Invoked with value: Hello Method Invoked with value: Hi Bye......
客户端:
$./testdbus_s.bin query Hello Calling remote method with Hello Request Sent Got Reply: 1, 21614 $./testdbus_s.bin query Hi Calling remote method with Hi Request Sent Got Reply: 1, 21614 $./testdbus_s.bin query Bye Calling remote method with Bye Request Sent Got Reply: 1, 21614
DBUS发送接收数据(上)
1、Server端
testdbus_s.c
#define DBUS_API_SUBJECT_TO_CHANGE
#include <dbus/dbus.h>
#include <stdbool.h>
#include <unistd.h>
#include <stdio.h>
#include <stdlib.h>
/**
* Wait for signals on the bus and reply
*/
void receive()
{
DBusMessage* msg;
DBusMessageIter args;
DBusConnection* conn;
DBusError err;
int ret;
char* sigvalue;
int loop=1;
printf("Listening for signals\n");
// initialise the errors
dbus_error_init(&err);
// connect to the bus and check for errors
conn = dbus_bus_get(DBUS_BUS_SYSTEM, &err);
if (dbus_error_is_set(&err)) {
fprintf(stderr, "Connection Error (%s)\n", err.message);
dbus_error_free(&err);
}
if (NULL == conn) {
exit(1);
}
// request our name on the bus and check for errors
ret = dbus_bus_request_name(conn, "neohope.dbus.signal.target", DBUS_NAME_FLAG_REPLACE_EXISTING , &err);
if (dbus_error_is_set(&err)) {
fprintf(stderr, "Name Error (%s)\n", err.message);
dbus_error_free(&err);
}
if (DBUS_REQUEST_NAME_REPLY_PRIMARY_OWNER != ret) {
exit(1);
}
// add a rule for which messages we want to see
dbus_bus_add_match(conn, "type='signal',interface='neohope.dbus.signal.Type'", &err); // see signals from the given interface
dbus_connection_flush(conn);
if (dbus_error_is_set(&err)) {
fprintf(stderr, "Match Error (%s)\n", err.message);
exit(1);
}
printf("Match rule sent\n");
// loop listening for signals being emmitted
while (loop) {
// non blocking read of the next available message
dbus_connection_read_write(conn, 0);
msg = dbus_connection_pop_message(conn);
// loop again if we haven't read a message
if (NULL == msg) {
sleep(1);
continue;
}
// check if the message is a signal from the correct interface and with the correct name
if (dbus_message_is_signal(msg, "neohope.dbus.signal.Type", "TestSignal")) {
// read the parameters
if (!dbus_message_iter_init(msg, &args))
fprintf(stderr, "Message Has No Parameters\n");
else if (DBUS_TYPE_STRING != dbus_message_iter_get_arg_type(&args))
fprintf(stderr, "Argument is not string!\n");
else
dbus_message_iter_get_basic(&args, &sigvalue);
if(strcmp("Bye",sigvalue)==0) {
loop = 0;
printf("Bye......\n");
}
else {
printf("Got Signal with value: %s\n", sigvalue);
}
}
// free the message
dbus_message_unref(msg);
}
// do not close the connection
// dbus_connection_close(conn);
}
/**
* Deal with remote method call
*/
int reply_to_method_call(DBusMessage* msg, DBusConnection* conn)
{
DBusMessage* reply;
DBusMessageIter args;
int stat = 1;
int ret = 1;
dbus_uint32_t level = 21614;
dbus_uint32_t serial = 0;
char* param = "";
// read the arguments
if (!dbus_message_iter_init(msg, &args))
fprintf(stderr, "Message has no arguments!\n");
else if (DBUS_TYPE_STRING != dbus_message_iter_get_arg_type(&args))
fprintf(stderr, "Argument is not string!\n");
else
dbus_message_iter_get_basic(&args, ¶m);
if(strcmp("Bye",param)==0){
ret = 0;
printf ("Bye......\n");
}
else {
printf("Method Invoked with value: %s\n", sigvalue);
}
// create a reply from the message
reply = dbus_message_new_method_return(msg);
// add the arguments to the reply
dbus_message_iter_init_append(reply, &args);
if (!dbus_message_iter_append_basic(&args, DBUS_TYPE_BOOLEAN, &stat)) {
fprintf(stderr, "Out Of Memory!\n");
exit(1);
}
if (!dbus_message_iter_append_basic(&args, DBUS_TYPE_UINT32, &level)) {
fprintf(stderr, "Out Of Memory!\n");
exit(1);
}
// send the reply && flush the connection
if (!dbus_connection_send(conn, reply, &serial)) {
fprintf(stderr, "Out Of Memory!\n");
exit(1);
}
dbus_connection_flush(conn);
// free the reply
dbus_message_unref(reply);
return ret;
}
/**
* Server that exposes a method call and waits for it to be called
*/
void listen()
{
DBusMessage* msg;
DBusMessage* reply;
DBusMessageIter args;
DBusConnection* conn;
DBusError err;
int loop = 1;
int ret;
char* param;
printf("Listening for method calls\n");
// initialise the error
dbus_error_init(&err);
// connect to the bus and check for errors
conn = dbus_bus_get(DBUS_BUS_SYSTEM, &err);
if (dbus_error_is_set(&err)) {
fprintf(stderr, "Connection Error (%s)\n", err.message);
dbus_error_free(&err);
}
if (NULL == conn) {
fprintf(stderr, "Connection Null\n");
exit(1);
}
// request our name on the bus and check for errors
ret = dbus_bus_request_name(conn, "neohope.dbus.method.provider", DBUS_NAME_FLAG_REPLACE_EXISTING , &err);
if (dbus_error_is_set(&err)) {
fprintf(stderr, "Name Error (%s)\n", err.message);
dbus_error_free(&err);
}
if (DBUS_REQUEST_NAME_REPLY_PRIMARY_OWNER != ret) {
fprintf(stderr, "Not Primary Owner (%d)\n", ret);
exit(1);
}
// loop, testing for new messages
while (loop) {
// non blocking read of the next available message
dbus_connection_read_write(conn, 0);
msg = dbus_connection_pop_message(conn);
// loop again if we haven't got a message
if (NULL == msg) {
sleep(1);
continue;
}
// check this is a method call for the right interface & method
if (dbus_message_is_method_call(msg, "neohope.dbus.method.Type", "TestMethod"))
loop = reply_to_method_call(msg, conn);
// free the message
dbus_message_unref(msg);
}
// do not close the connection
// dbus_connection_close(conn);
}
int main(int argc, char** argv)
{
if (2 > argc) {
printf ("Syntax: testdbus_s [receive|listen] [<param>]\n");
return 1;
}
char* param = "no param";
if (3 >= argc && NULL != argv[2]) param = argv[2];
if (0 == strcmp(argv[1], "receive"))
receive();
else if (0 == strcmp(argv[1], "listen"))
listen();
else {
printf ("Syntax: testdbus_s [receive|listen] [<param>]\n");
return 1;
}
return 0;
}
2、Client端
testdbus_c.c
#define DBUS_API_SUBJECT_TO_CHANGE
#include <dbus/dbus.h>
#include <stdbool.h>
#include <unistd.h>
#include <stdio.h>
#include <stdlib.h>
/**
* Connect to the DBUS bus and send a broadcast signal
*/
void sendsignal(char* sigvalue)
{
DBusMessage* msg;
DBusMessageIter args;
DBusConnection* conn;
DBusError err;
int ret;
dbus_uint32_t serial = 0;
printf("Sending signal with value: %s\n", sigvalue);
// initialise the error value
dbus_error_init(&err);
// connect to the DBUS system bus, and check for errors
conn = dbus_bus_get(DBUS_BUS_SYSTEM, &err);
if (dbus_error_is_set(&err)) {
fprintf(stderr, "Connection Error (%s)\n", err.message);
dbus_error_free(&err);
}
if (NULL == conn) {
exit(1);
}
// register our name on the bus, and check for errors
ret = dbus_bus_request_name(conn, "neohope.dbus.signal.source", DBUS_NAME_FLAG_REPLACE_EXISTING , &err);
if (dbus_error_is_set(&err)) {
fprintf(stderr, "Name Error (%s)\n", err.message);
dbus_error_free(&err);
}
if (DBUS_REQUEST_NAME_REPLY_PRIMARY_OWNER != ret) {
exit(1);
}
// create a signal & check for errors
msg = dbus_message_new_signal("/neohope/dbus/signal/Object", // object name of the signal
"neohope.dbus.signal.Type", // interface name of the signal
"TestSignal"); // name of the signal
if (NULL == msg)
{
fprintf(stderr, "Message Null\n");
exit(1);
}
// append arguments onto signal
dbus_message_iter_init_append(msg, &args);
if (!dbus_message_iter_append_basic(&args, DBUS_TYPE_STRING, &sigvalue)) {
fprintf(stderr, "Out Of Memory!\n");
exit(1);
}
// send the message and flush the connection
if (!dbus_connection_send(conn, msg, &serial)) {
fprintf(stderr, "Out Of Memory!\n");
exit(1);
}
dbus_connection_flush(conn);
printf("Signal Sent\n");
// free the message
dbus_message_unref(msg);
// do not close the connection
// dbus_connection_close(conn);
}
/**
* Call a method on a remote object
*/
void query(char* param)
{
DBusMessage* msg;
DBusMessageIter args;
DBusConnection* conn;
DBusError err;
DBusPendingCall* pending;
int ret;
int stat;
dbus_uint32_t level;
printf("Calling remote method with %s\n", param);
// initialiset the errors
dbus_error_init(&err);
// connect to the system bus and check for errors
conn = dbus_bus_get(DBUS_BUS_SYSTEM, &err);
if (dbus_error_is_set(&err)) {
fprintf(stderr, "Connection Error (%s)\n", err.message);
dbus_error_free(&err);
}
if (NULL == conn) {
exit(1);
}
// request our name on the bus
ret = dbus_bus_request_name(conn, "neohope.dbus.method.caller", DBUS_NAME_FLAG_REPLACE_EXISTING , &err);
if (dbus_error_is_set(&err)) {
fprintf(stderr, "Name Error (%s)\n", err.message);
dbus_error_free(&err);
}
if (DBUS_REQUEST_NAME_REPLY_PRIMARY_OWNER != ret) {
exit(1);
}
// create a new method call and check for errors
msg = dbus_message_new_method_call("neohope.dbus.method.provider", // target for the method call
"/neohope/dbus/method/Object", // object to call on
"neohope.dbus.method.Type", // interface to call on
"TestMethod"); // method name
if (NULL == msg) {
fprintf(stderr, "Message Null\n");
exit(1);
}
// append arguments
dbus_message_iter_init_append(msg, &args);
if (!dbus_message_iter_append_basic(&args, DBUS_TYPE_STRING, ¶m)) {
fprintf(stderr, "Out Of Memory!\n");
exit(1);
}
// send message and get a handle for a reply
if (!dbus_connection_send_with_reply (conn, msg, &pending, -1)) { // -1 is default timeout
fprintf(stderr, "Out Of Memory!\n");
exit(1);
}
if (NULL == pending) {
fprintf(stderr, "Pending Call Null\n");
exit(1);
}
dbus_connection_flush(conn);
printf("Request Sent\n");
// free message
dbus_message_unref(msg);
// block until we recieve a reply
dbus_pending_call_block(pending);
// get the reply message
msg = dbus_pending_call_steal_reply(pending);
if (NULL == msg) {
fprintf(stderr, "Reply Null\n");
exit(1);
}
// free the pending message handle
dbus_pending_call_unref(pending);
// read the parameters
if (!dbus_message_iter_init(msg, &args))
fprintf(stderr, "Message has no arguments!\n");
else if (DBUS_TYPE_BOOLEAN != dbus_message_iter_get_arg_type(&args))
fprintf(stderr, "Argument is not boolean!\n");
else
dbus_message_iter_get_basic(&args, &stat);
if (!dbus_message_iter_next(&args))
fprintf(stderr, "Message has too few arguments!\n");
else if (DBUS_TYPE_UINT32 != dbus_message_iter_get_arg_type(&args))
fprintf(stderr, "Argument is not int!\n");
else
dbus_message_iter_get_basic(&args, &level);
printf("Got Reply: %d, %d\n", stat, level);
// free reply and close connection
dbus_message_unref(msg);
//dbus_connection_close(conn);
}
int main(int argc, char** argv)
{
if (2 > argc) {
printf ("Syntax: testdbus_c [send|query] [<param>]\n");
return 1;
}
char* param = "no param";
if (3 >= argc && NULL != argv[2]) param = argv[2];
if (0 == strcmp(argv[1], "send"))
sendsignal(param);
else if (0 == strcmp(argv[1], "query"))
query(param);
else {
printf ("Syntax: testdbus_c [send|query] [<param>]\n");
return 1;
}
return 0;
}
3、Makefile
CC=gcc LDFLAGS+=-ldbus-1 CFLAGS+=-I/usr/include/dbus-1.0 -I/usr/lib/x86_64-linux-gnu/dbus-1.0/include/ all:testdbus_c.bin testdbus_s.bin testdbus_c.bin:testdbus_c.o $(CC) $(LDFLAGS) -o testdbus_c.bin testdbus_c.o testdbus_c.o:testdbus_c.c $(CC) $(CFLAGS) -c -o testdbus_c.o testdbus_c.c testdbus_s.bin:testdbus_s.o $(CC) $(LDFLAGS) -o testdbus_s.bin testdbus_s.o testdbus_s.o:testdbus_s.c $(CC) $(CFLAGS) -c -o testdbus_s.o testdbus_s.c clean: rm *.o *.bin
4、编译
make
CMD常用命令17常用软件注册为Widows服务
1、Apache注册为Widows服务
httpd -k install
2、MySQL注册为Widows服务
mysqld --install MySQL --defaults-file="D:\MySQL\MySQL Server 5.1\my.ini"
3、PostgreSQL注册为Widows服务
pg_ctl.exe register -N "postgresql-8.4" -D "D:/PostgreSQL/8.4/data" -w
4、SVN注册为Widows服务
sc create svnserve binPath= "\"D:\Subversion\bin\svnserve.exe\" --service -r \"D:\Subversion\repository\"" displayname= "Subversion Service" depend= Tcpip start= auto sc start svnserve sc stop svnserve sc delete svnserve
5、redis注册为Widows服务
#loglevel 分为debug, notice, warning三级 redis-server.exe --service-install D:\Database\Redis2.8\db\redis.windows.conf --loglevel notice redis-server --service-start redis-server --service-stop redis-server --service-uninstall
6、mongodb注册为Widows服务
mongod --dbpath=D:\Database\MongoDB3\db --logpath=D:\Database\MongoDB3\log\mongo.log --port 27027 --noauth --install -serviceName MongoDB01 --serviceDisplayName MongoDB01 net start MongoDB01
FreeBSD10安装开发环境
1、安装JDK
1.1、Oracle没有为FreeBSD提供JDK环境,自带版本也挺高,那就安装默认的咯
pkg install jdk8
*在windows下编译过,超级大,时间也很久,实在不想编译openjdk了。
1.2、修改/etc/fstab文件,增加下面两行,搞定
# Device Mountpoint FStype Options Dump Pass# /dev/ada0p2 / ufs rw 1 1 /dev/ada0p3 none swap sw 0 0 fdesc /dev/fd fdescfs rw 0 0 proc /proc procfs rw 0 0
2、自己编译Ruby,当然也可以用pkg安装
2.1、下载并编译源码
ruby-lang.org
./configure --prefix=usr/ruby/ruby_2.2.3 make make install
2.2、配置环境变量,默认为csh
编辑~/.cshrc
set RUBY_HOME=/usr/ruby/ruby_2.2.3 set path=($RUBY_HOME/bin $path)
重新登录一下。
2.3、切换为国内源
gem sources --add https://ruby.taobao.org/ gem sources --remove https://rubygems.org/ gem sources -l
2.4、安装gems
$ gem install rails $ gem install redis
3、自己编译redis,当然也可以用pkg安装
3.1、下载并编译源码
redis.io
pkg install gmake gmake gmake PREFIX=/usr/redis/redis_3.0.4 install
3.2、配置环境变量,默认为csh
编辑~/.cshrc
set REDIS_HOME=/usr/redis/redis_3.0.4 set path=($REDIS_HOME/bin $path)
重新登录一下。
4、安装mongodb
4.1、下载并编译源码
mongodb.org
pkg install gcc pkg install scons pkg install python pkg install libexecinfo scons all scons --prefix=/usr/mongodb/mongodb_3.0.7 install
*顺便说一下,这个编译后是18G,安装后为1.1G。。。
*如果你用的是3.0.7版本的源码,在FreeBSD下需要打补丁
github.com
4.2、配置环境变量,默认为csh
编辑~/.cshrc
set MONGODB_HOME=/usr/mongodb/mongodb_3.0.7 set path=($MONGODB_HOME/bin $path)
重新登录一下。
Virtualbox安装配置FreeBSD10
1、新建虚拟机,下载DVD镜像文件,安装虚拟机,整个过程比较简单:分区,选择需要的包,配置网络,配置用户
其中,我的虚拟机网卡配置为:
le0 是hostonly,用于与宿主机、其他虚拟机进行网络通许,要手工设置
le1 是nat,用于蹭网,设置为DHCP就好了
2、安装后重启,发现新用户不能su,将新用户添加到wheel组
#此命令一如既往的强大 bsdconfig
3、然后发现,le1发现可以连外网,但le0配置有些问题,编辑/etc/rc.conf
#network config hostname="freebsd10" ifconfig_le0="inet 172.16.172.5 netmask 255.255.0.0" ifconfig_le1="DHCP" ip6addrctl_enable="NO" defaultrouter="10.0.3.2" #static_routes="net1" #route_net1="-net 172.16.172.0/16 172.16.172.1"
重启网络,OK。
4、找了一下,VirtualBox自带的扩展插件是没有BSD系统支持的,那就安装开源的呗
首先尝试了bsdconfig进行安装,但系统提示找不到数据库
bsdconfig #选择Packages no pkg(8) database found.
4.1A网上找了下,从DVD安装可以这样处理:
mount -t cd9660 /dev/cd0 /dist env REPOS_DIR=/dist/packages/repos pkg search virtualbox env REPOS_DIR=/dist/packages/repos pkg install virtualbox-ose-additions
4.1B或者,直接采用网络安装可以这样处理:
pkg install virtualbox-ose-additions
4.2安装后,需要在/etc/rc.conf中增加
vboxguest_enable=“YES” vboxservice_enable=“YES”
重启
5、安装图形界面
从DVD安装可以这样处理:
5.1A
mount -t cd9660 /dev/cd0 /dist env REPOS_DIR=/dist/packages/repos pkg search xorg env REPOS_DIR=/dist/packages/repos pkg install xorg env REPOS_DIR=/dist/packages/repos pkg search gnome env REPOS_DIR=/dist/packages/repos pkg install gnome3
5.1B或者,直接采用网络安装可以这样处理:
pkg install xorg pkg install gnome3
5.2A安装完毕后,如果想重启后直接进入图形界面,需要在/etc/rc.conf中增加
gdm_enable="YES" gnome_enable="YES"
5.2B如果想重启后进入命令行界面,需要在/etc/rc.conf中增加
dbus_enable="YES"
然后,执行命令
echo exec gnome-session > ~/.xinitrc startx
6、发现命令行界面分辨率太低
6.1查看系统支持的分辨率
#列出所有支持的分辨率 vidcontrol -i mode #尝试1024x768x24 vidcontrol MODE_280
6.2在/etc/rc.conf中增加
allscreens_flags="MODE_280"
7、启动后,发现sendmail服务启动耗时很久,反正用不到,编辑/etc/rc.conf文件,禁用之
vi /etc/rc.conf sendmail_enable="NONE" sendmail_submit_enable="NO" sendmail_outbound_enable="NO" sendmail_msp_queue_enable="NO"
8、最终,我的/etc/rc.conf文件如下
#network config hostname="freebsd10" ifconfig_le0="inet 172.16.172.5 netmask 255.255.0.0" ifconfig_le1="DHCP" ip6addrctl_enable="NO" defaultrouter="10.0.3.2" #static_routes="net1" #route_net1="-net 172.16.172.0/16 172.16.172.1" #display config vboxguest_enable="YES" vboxservice_enable="YES" allscreens_flags="MODE_280" #gdm_enable="YES" #gnome_enable="YES" #other service config sshd_enable="YES" powerd_enable="YES" moused_enable="YES" dbus_enable="YES" #"AUTO" to enable crash dumps, "NO" to disable crash dumps dumpdev="AUTO" #disapbled service zfs_enable="NO" sendmail_enable="NONE" sendmail_outbound_enbale="NO" sendmail_msp_queue_enable="NO" sendmail_submit_enable="NO"
Debian8 Jessie修改Terminal分辨率
昨天安装了Debian8 Jessie,禁用了gdb以后,发现Terminal分辨率变的超级低。
用以前的方法调整了一下,发现搞不定了,搞了大半天,终于找到了靠谱的方案:
1、修改/etc/default/grub
找到
#GRUB_GFXMODE=XXXXXX
修改该行,并新增一行,最后效果为
GRUB_GFXMODE=1024x768x24 GRUB_GFXPAYLOAD_LINUX=1024x768x24
2、修改/etc/grub.d/00_header
找到
if [ "x${GRUB_GFXMODE}" = "x" ] ; then auto ; fi,
修改该行,并新增一行,最后效果为
if [ "x${GRUB_GFXMODE}" = "x" ] ; then GRUB_GFXMODE=1024x768x24 ; fi
if [ "x${GRUB_GFXPAYLOAD}" = "x" ] ; then GRUB_GFXPAYLOAD=1024x768x24 ; fi
3、仍然是etc/grub.d/00_header
找到
set gfxmode=${GRUB_GFXMODE}
在其后新增一行,最后效果为
set gfxmode=${GRUB_GFXMODE}
set gfxpayload=${GRUB_GFXPAYLOAD}
4、更新grub并重启,搞定
update-grub2 reboot
5、感觉Debian8 Jessie的配置改变了好多。。。