0

こんにちは、マルチプロセスプログラムで関数nullを使用してファイルの文字を読んで印刷しようとしているときに、文字の問題に直面しています。fseek()ここに私の簡単なコードがあります、

#include <stdio.h>     /* basic I/O routines.   */
#include <unistd.h>    /* define fork(), etc.   */
#include <sys/types.h> /* define pid_t, etc.    */
#include <sys/wait.h>  /* define wait(), etc.   */
#include <signal.h>    /* define signal(), etc. */
#include <pthread.h>
#include <time.h>

void print_screen(int i);
int counter=0;

int main(int argc, char* argv[]) {

    FILE* fptr;
    fptr = fopen("sample.txt","w");

    int counter = atoi(argv[1]);
    int i,k;
    int temp;
    pid_t child_pid;
    int child_status;
    char array[counter];

    srand ( time(NULL) );

    for(i=0; i<counter; i++){
        temp = rand()%4;

        if( temp==0 ) {

            fprintf(fptr,"A\n");
            array[i]='A';
            }
        else if( temp==1 ) {

            fprintf(fptr,"C\n");
            array[i]='C';
            }
        else if( temp==2 ) {

            fprintf(fptr,"G\n");
            array[i]='G';
            }
        else if( temp==3 ) {

            fprintf(fptr,"T\n");
            array[i]='T';
            }
    }
    fclose(fptr);

                for(i=1; i<=counter; i++){

                    child_pid = fork();

                       switch(child_pid) {

                        case -1:
                            printf("Error occured with fork()\n");
                            exit(1);

                        case 0: 
                            print_screen(i); /* Child Process */
                            exit(0);
                             }
            }

    wait(&child_status);
    execl("/usr/bin/killall","killall","tail",(char *) 0);
    return 0;
}

void print_screen(int i){

    char* str;
    FILE* fptr;
    fptr=fopen("sample.txt","r");

        fseek(fptr,i,SEEK_SET);
        fscanf(fptr,"%s",str);
        printf("Process Number %d, Character = %s\n",i,str);
        sleep(1);

    fclose(fptr);
    return;
    }

コマンドラインに入力すると./sample 10、プログラムが10文字をsample.txtに出力し、10個の子プロセスが作成され、それぞれが文字を選択して画面に出力しようとしますi。オフセットを設定するパラメーターですが、前述のようにnullを出力します。これがプログラムの見通しです。

Process Number 7, Character = (null)
Process Number 6, Character = (null)
Process Number 5, Character = (null)
Process Number 3, Character = (null)
Process Number 8, Character = (null)
Process Number 4, Character = (null)
Process Number 9, Character = (null)
Process Number 10, Character = (null)
Process Number 2, Character = (null)
Process Number 1, Character = (null)

txtファイルはこのようなものでした。

G
A
A
T
G
C
C
A
A
T

とにかく助けていただければ幸いです。

$ gcc sample.c -o sample -lpthread編集: nullを出力するようにコンパイルすることに気付きました。一方、-lpthread文字を印刷せずにコンパイルしますが、たとえば、これはテキストファイルのように適切ではありません。

T
G
G
T
G

ターミナルはこのような出力を提供します。

Process Number 1, Character = G
Process Number 2, Character = G
Process Number 3, Character = G
Process Number 4, Character = G
Process Number 5, Character = T
4

2 に答える 2

0

これを見てください http://www.cs.nmsu.edu/~jcook/Tools/pthreads/pthreads.html

おそらく、fork() が呼び出しプロセスのコピーを生成し、このコピーが元のプロセスと (ほぼ) 同じであることを知っているでしょう。

試してください(そして、それが機能しているかどうか教えてください、私はそれをテストできませんでした:)

            for(i=1; i<=counter; i++){

                child_pid = fork();

                   switch(child_pid) {

                    case -1:
                        printf("Error occured with fork()\n");
                        exit(1);
                    case 0: 
                        print_screen(i); /* Child Process */
                        exit(0);
                    default: 
                        printf("...\n");
                         }
        }

編集:私のために働く

編集:わかりました、いくつかのテストを行いましたが、if代わりに使用する必要caseがあります(ファイルコンテンツの直接出力も追加されました-ファイルサイズが大きくなった場合は削除する必要があります); 今、私はコードとして持っていたものです:

#include <stdio.h>     /* basic I/O routines.   */
#include <unistd.h>    /* define fork(), etc.   */
#include <sys/types.h> /* define pid_t, etc.    */
#include <sys/wait.h>  /* define wait(), etc.   */
#include <signal.h>    /* define signal(), etc. */
#include <pthread.h>
#include <time.h>

void print_screen(int i);
int counter=0;

int main(int argc, char* argv[]) {

FILE* fptr;
fptr = fopen("sample.txt","w");

int counter = atoi(argv[1]);
int i,k;
int temp;
pid_t child_pid;
int child_status;
char array[counter];

srand ( time(NULL) );

for(i=0; i<counter; i++){
    temp = rand()%4;

    if( temp==0 ) {

        fprintf(fptr,"A\n");
        printf("A\n");
        array[i]='A';
        }
    else if( temp==1 ) {

        fprintf(fptr,"C\n");
        printf("C\n");
        array[i]='C';
        }
    else if( temp==2 ) {
        fprintf(fptr,"G\n");
        printf("G\n");
        array[i]='G';
        }
    else if( temp==3 ) {
        fprintf(fptr,"T\n");
        printf("T\n");
        array[i]='T';
        }
}
fclose(fptr);
            for(i=1; i<=counter; i++){

                child_pid = fork();

                    if (child_pid == -1){
                        printf("Error occured with fork()\n"); exit(-1);
                    }
                    else if (child_pid == 0){
                         print_screen(i); exit(0);
                    }
                    else{ printf("something \n"); }
        }

wait(&child_status);
execl("/usr/bin/killall","killall","tail",(char *) 0);
return 0;
}

void print_screen(int i){

char* str;
FILE* fptr;
fptr=fopen("sample.txt","r");

    fseek(fptr,i,SEEK_SET);
    fscanf(fptr,"%s",str);
    printf("Process Number %d, Character = %s\n",i,str);
    sleep(1);

fclose(fptr);
return;
}

それは正しく動作しません (pthreads が同時にファイルから読み取っているときに何らかの衝突があると確信しています) が、少なくとも作業を続行するものがあります。

私はこの出力を得ました:

T

T

なにか

なにか

なにか

なにか

プロセス番号 4、文字 = A

プロセス番号 3、文字 = A

プロセス番号 2、文字 = T

プロセス番号 1、文字 = T

tail: プロセスが見つかりません

于 2012-10-09T20:14:39.850 に答える
0

print_screen の str にメモリを割り当てていません。fscanf にはそれが必要です。

次のようなハックを試してください:

void print_screen(int i){

char str[256];  /* plenty large enough for this example */
于 2012-10-10T01:07:42.690 に答える