## 2010-05-16

### ptrace 在 linux 和 freebsd 下的若干区别 | Several differences of ptrace between Linux and FreeBSD

Recently I've been porting a software from Linux to Debian-kfreebsd, but it's not as easy as I had expected. The problem is the interface of ptrace is not exactly the same between linux and kfreebsd.

The first is the names of the macros, which are PTRACE_* under linux and PT_* under freebsd.

Secondly the function ptrace' is not the same, the parameter value' is long' under Linux, but int' under freebsd, so it seems that there'll be a problem on 64 bit freebsd.

However, there's another operation called PT_IO under freebsd, using which we can specify the number of bytes we want to read or write.

The last and the most annoying one I've met, is the parameter addr' for the CONTINUE operations. Under linux this parameter is ignored, and the child process will continue at where it had been interrupted; but under freebsd, we can specify this location by setting this parameter, and we can also let it continue at where it had been interrupted but setting the value to 1.

Now that's all for my program, and it seems that the interface under freebsd is better than that under linux.

## 2010-05-03

### 并行运行多进程的Bash脚本 | A srcipt for running processes in parallel in Bash

#!/bin/bashNUM=0QUEUE=""MAX_NPROC=2 # defaultREPLACE_CMD=0 # no replacement by defaultUSAGE="A simple wrapper for running processes in parallel.Usage: basename $0 [-h] [-r] [-j nb_jobs] command arg_list -h Shows this help -r Replace asterix * in the command string with argument -j nb_jobs Set number of simultanious jobs [2] Examples: basename$0 somecommand arg1 arg2 arg3  basename $0 -j 3 \"somecommand -r -p\" arg1 arg2 arg3 basename$0 -j 6 -r \"convert -scale 50% * small/small_*\" *.jpg"function queue { QUEUE="$QUEUE$1" NUM=$(($NUM+1))}function regeneratequeue { OLDREQUEUE=$QUEUE QUEUE="" NUM=0 for PID in$OLDREQUEUE do  if [ -d /proc/$PID ] ; then QUEUE="$QUEUE $PID" NUM=$(($NUM+1)) fi done}function checkqueue { OLDCHQUEUE=$QUEUE for PID in $OLDCHQUEUE do if [ ! -d /proc/$PID ] ; then   regeneratequeue # at least one PID has finished   break  fi done}# parse command lineif [ $# -eq 0 ]; then # must be at least one arg echo "$USAGE" >&2 exit 1fiwhile getopts j:rh OPT; do # "j:" waits for an argument "h" doesnt    case $OPT in h) echo "$USAGE"  exit 0 ;; j) MAX_NPROC=$OPTARG ;; r) REPLACE_CMD=1 ;; \?) # getopts issues an error message echo "$USAGE" >&2  exit 1 ;;    esacdone# Main programecho Using $MAX_NPROC parallel threadsshift expr$OPTIND - 1 # shift input args, ignore processed argsCOMMAND=$1shiftfor INS in$* # for the rest of the argumentsdo # DEFINE COMMAND if [ $REPLACE_CMD -eq 1 ]; then CMD=${COMMAND//"*"/$INS} else CMD="$COMMAND $INS" #append args fi echo "Running$CMD"  $CMD & # DEFINE COMMAND END PID=$! queue $PID while [$NUM -ge \$MAX_NPROC ]; do  checkqueue  sleep 0.4 donedonewait # wait for all processes to finish before exit`

Original posted at: http://pebblesinthesand.wordpress.com/2008/05/22/a-srcipt-for-running-processes-in-parallel-in-bash/

This script will run multiple process in background concurrently, while the maximum number of running processed is under control. When there are already too many running processes, a new one will wait until one process finished.

I just need this trick in my project, so I copied it here.

(See codes above)