-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
このような質問に対する回答を得る最も良い方法は、いくつかのコード、できれば実行可能な例を表示することです。 – cnicutar
コードを投稿してください。 100回のうち99回、これらの問題は、APIの機能のバグではなく実装バグによるものです。 – Polynomial
最も明白なことは、リソースの制限があることです。しかし、(a)コードを投稿していないので、 (b)**失敗したフォーク**の後に 'errno' /' perror'を提供していなくても、多くの助けを与えるのは難しいです。 – derobert