こんにちは、マルチプロセスプログラムで関数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