diff --git a/dwmblocks.c b/dwmblocks.c
index 7d7a564..e2c5dd0 100644
--- a/dwmblocks.c
+++ b/dwmblocks.c
@@ -34,8 +34,6 @@ static int screen;
 static Window root;
 static char statusbar[LENGTH(blocks)][CMDLENGTH] = {0};
 static char statusstr[2][256];
-static char exportstring[CMDLENGTH + 22] = "export BLOCK_BUTTON=-;";
-static int button = 0;
 static int statusContinue = 1;
 static void (*writestatus) () = setroot;
 
@@ -55,21 +53,8 @@ void getcmd(const Block *block, char *output)
 		output[0] = block->signal;
 		output++;
 	}
-	char* cmd;
-	FILE *cmdf;
-	if (button)
-	{
-		cmd = strcat(exportstring, block->command);
-		cmd[20] = '0' + button;
-		button = 0;
-		cmdf = popen(cmd,"r");
-		cmd[22] = '\0';
-	}
-	else
-	{
-		cmd = block->command;
-		cmdf = popen(cmd,"r");
-	}
+	char *cmd = block->command;
+	FILE *cmdf = popen(cmd,"r");
 	if (!cmdf)
 		return;
 	fgets(output, CMDLENGTH, cmdf);
@@ -117,6 +102,7 @@ void setupsignals()
 	sa.sa_sigaction = buttonhandler;
 	sa.sa_flags = SA_SIGINFO;
 	sigaction(SIGUSR1, &sa, NULL);
+	signal(SIGCHLD, SIG_IGN);
 
 }
 #endif
@@ -179,9 +165,29 @@ void sighandler(int signum)
 
 void buttonhandler(int sig, siginfo_t *si, void *ucontext)
 {
-	button = si->si_value.sival_int & 0xff;
-	getsigcmds(si->si_value.sival_int >> 8);
+	int button = si->si_value.sival_int & 0xff;
+	sig = si->si_value.sival_int >> 8;
+	getsigcmds(sig);
 	writestatus();
+	if (fork() == 0)
+	{
+		static char exportstring[CMDLENGTH + 22] = "export BLOCK_BUTTON=-;";
+		const Block *current;
+		int i;
+		for (i = 0; i < LENGTH(blocks); i++)
+		{
+			current = blocks + i;
+			if (current->signal == sig)
+				break;
+		}
+		char *cmd = strcat(exportstring, blocks[i].command);
+		cmd[20] = '0' + button;
+		char *command[] = { "/bin/sh", "-c", cmd, NULL };
+		setsid();
+		execvp(command[0], command);
+		exit(EXIT_SUCCESS);
+		cmd[22] = '\0';
+	}
 }
 
 #endif
