2011-12-04 9 views
-2

私は可変引数で呼び出されるCプログラムを持っています。このプログラムは、引数を使用してコマンドを作成し、次にフォークを使用して子プロセスを作成します。しかし、プログラムへの引数の数が多いほどfork()コマンドが失敗することがわかります。デーモンの作成中にforkが失敗する

これがどうして起こるのか?

int main(int argc, char *argv[]) 
{ 
    FILE *logfile; 
    int other=0; 
    int i, pid; 
    char *conn="conntrack -E"; 
    char *logger="logger -t log-conntrack -p daemon.notice"; 
    char *fother="grep -vE 'tcp|udp|icmp'"; 
    char cmd[1024]; 
    int length = 0; 
    char * temp_cmd = cmd; 

    for (i=1; i<argc; i++) { 
    printf("for loop\n"); 
     switch(argv[i][1]) { 
     case 'p': if (i+1 < argc && argv[i+1][0] != '-') { 
          if (strncmp(argv[i+1], "other", 
             strlen(argv[i+1])) == 0) { 
            other=1; 
            snprintf(cmd, sizeof (cmd), "%s", conn); 
            length = strlen (cmd); 
            temp_cmd = cmd + length; 
            i++; 
          } else if ((strncmp(argv[i+1], "tcp", 
              strlen(argv[i+1])) == 0) || 
             (strncmp(argv[i+1], "udp", 
              strlen(argv[i+1])) == 0) || 
             (strncmp(argv[i+1], "icmp", 
              strlen(argv[i+1])) == 0)) { 
            snprintf(cmd, sizeof (cmd), "%s%s%s", conn, " -p ", argv[i+1]); 
            other=0; 
            length = strlen (cmd); 
            temp_cmd = cmd + length; 
            i++; 
          } 
        } 
        break; 
case 'e': 
        if (i+1 < argc && argv[i+1][0] != '-') { 
          if ((strncmp(argv[i+1], "NEW", 
              strlen(argv[i+1])) == 0) || 
             (strncmp(argv[i+1], "UPDATES", 
              strlen(argv[i+1])) == 0) || 
             (strncmp(argv[i+1], "DESTROY", 
              strlen(argv[i+1])) == 0)) { 
            if (other == 1) { 
             snprintf(temp_cmd, sizeof (cmd) - length, "%s%s%s%s%s%s%s", " -e ", argv[i+1], " -o id", " | ", fother, " | ", logger); 
             cmds[pcounter] = malloc(strlen+1); 
             strcpy(cmds[pcounter],cmd); 
             pcounter++; 
            } else if ((strncmp(argv[i-1], "tcp",strlen(argv[i-1]))==0) && 
               (strncmp(argv[i+1], "UPDATES",strlen(argv[i+1])) == 0)){ 
             snprintf(temp_cmd, sizeof (cmd) - length, "%s%s", " -e ", argv[i+1]); 
            } else { 
             snprintf(temp_cmd, sizeof (cmd) - length, "%s%s%s%s%s", " -e ", argv[i+1], " -o id", " | ", logger); 
             cmds[pcounter] = malloc(strlen+1); 
             strcpy(cmds[pcounter],cmd); 
             pcounter++; 
            } 
            length = strlen (cmd); 
            temp_cmd = cmd + length; 
            i++; 
          } 
        } 
        break; 
     case 's': if (i+1 < argc && argv[i+1][0] != '-') { 
          if ((strncmp(argv[i+1], "SYN_RECV", 
              strlen(argv[i+1])) == 0) || 
             (strncmp(argv[i+1], "ESTABLISHED", 
              strlen(argv[i+1])) == 0) || 
             (strncmp(argv[i+1], "FIN_WAIT", 
              strlen(argv[i+1])) == 0) || 
             (strncmp(argv[i+1], "CLOSE_WAIT", 
              strlen(argv[i+1])) == 0) || 
             (strncmp(argv[i+1], "LAST_ACK", 
              strlen(argv[i+1])) == 0) || 
             (strncmp(argv[i+1], "TIME_WAIT", 
              strlen(argv[i+1])) == 0)) { 
            snprintf(temp_cmd, sizeof (cmd) - length, "%s%s%s%s%s", " --state ", argv[i+1], " -o id", " | ", logger); 
            cmds[pcounter] = malloc(strlen+1); 
            strcpy(cmds[pcounter],cmd); 
            pcounter++; 
            length = strlen (cmd); 
            temp_cmd = cmd + length; 
            i++; 
          } 
        } 
        break; 
    } 
    } 
    daemonize(); 
} 

のulimit -aの出力である -

ulimit -a 
core file size   (blocks, -c) 0 
data seg size   (kbytes, -d) unlimited 
scheduling priority    (-e) 0 
file size    (blocks, -f) unlimited 
pending signals     (-i) 16382 
max locked memory  (kbytes, -l) 64 
max memory size   (kbytes, -m) unlimited 
open files      (-n) 1024 
pipe size   (512 bytes, -p) 8 
POSIX message queues  (bytes, -q) 819200 
real-time priority    (-r) 0 
stack size    (kbytes, -s) 8192 
cpu time    (seconds, -t) unlimited 
max user processes    (-u) unlimited 
virtual memory   (kbytes, -v) unlimited 
file locks      (-x) unlimited 


free -m 
      total  used  free  shared buffers  cached 
Mem:   502  123  379   0   19   72 
-/+ buffers/cache:   31  471 
Swap:   0   0   0 
+1

このような質問に対する回答を得る最も良い方法は、いくつかのコード、できれば実行可能な例を表示することです。 – cnicutar

+1

コードを投稿してください。 100回のうち99回、これらの問題は、APIの機能のバグではなく実装バグによるものです。 – Polynomial

+0

最も明白なことは、リソースの制限があることです。しかし、(a)コードを投稿していないので、 (b)**失敗したフォーク**の後に 'errno' /' perror'を提供していなくても、多くの助けを与えるのは難しいです。 – derobert

答えて

0

ここでの問題は、フォークは子プロセスに割り当てるための十分なメモリを持っていなかったです。私はプログラムを実行していたVMのメモリを増やしていました。

関連する問題