2012-04-12 9 views
0
char cmd[256]; 
memset(cmd,0,256); 
sprintf(cmd, "cp %s %s", "test1.txt", "test2.txt"); 
system(cmd); 
printf("cmd completed\n"); 

私は上記のコードを実行すると、私のアプリケーションは、システムコールでハングアップします。私は決してprintf行に行きません。私はGCCコンパイラを使ってLinux CentOSを走っています。system()を使ってファイルをコピーすると( "cp"で)返されることはありませんか?

何か助けていただければ幸いです。

上記のコードを別のアプリケーションで実行すると(メインのコピー貼り付け)。それは正常に動作します。

+3

私はgdbに接続し、プログラムがハングしている場所を見ることをお勧めします。 – dbeer

+4

あなたは 'BUFSIZ'の定義と#includesを含む完全なコンパイル可能な例を記述する必要があります。 –

+5

ユーザの入力を待っている可能性があります – m0skit0

答えて

7

完全なプログラムとして、以下のコードはほとんどの条件下でうまく動作します。

test1.txtが特殊ファイルタイプの場合、cpがハングアップする可能性があります。たとえばmkfifo test1.txtは面白い結果をもたらします。そして、面白い結果によって、私はあなたが

あなたの問題ではない、あなたが投稿したコードの中で最も可能性が高いなど、CTRL + Cでプログラムを殺す殺さなければならないわけ。健全性チェックとして

/* copy.c, 
    compile using the command "gcc -o copy copy.c" 
    run using "./copy" 
*/ 
#include <stdio.h> 
#include <stdlib.h> 
#include <string.h> 

#define CMD_SIZE 256 
char cmd[CMD_SIZE]; 

int main(int argc, char **argv) 
{ 
    memset(cmd, 0, CMD_SIZE); 
    sprintf(cmd, "cp %s %s", "test1.txt", "test2.txt"); 
    system(cmd); 
    printf("cmd complete\n"); 
} 

、コマンドが本当にあなたはそれが何をしたいのように見えることを確認するBUFSIZEprintf("%s\n", cmd)の値をチェックするprintf("%d\n", BUFSIZE)を追加してみてください。

+0

あなたは暗黙の 'memset()'呼び出しをする必要はありません。 'sprintf()'関数は、EOS文字列にnullバイトの '\ 0'を書いてフォーマットします。 – Jack

+0

@Jack、ええ、私は知っています。また、徹底的にするために、 'sprintf'は' snprintf'でなければなりません。そして、 'main'は何かを返すべきです。そして 'cmd'はグローバルであってはなりません。また、 'snprintf'と' system'の戻り値の両方をチェックする必要があります。目標は生産コードを書くことではなく、スタンドアロンプ​​ログラムでOPのコードを複製することでした。 –

関連する問題