使用多处理从c中的文本文件逐行读取字符
您好,在多进程程序中使用使用多处理从c中的文本文件逐行读取字符,c,file-io,multiprocessing,fseek,C,File Io,Multiprocessing,Fseek,您好,在多进程程序中使用fseek()函数读取并尝试打印文件的字符时,我遇到了null字符问题。这是我的简单代码 #include <stdio.h> /* basic I/O routines. */ #include <unistd.h> /* define fork(), etc. */ #include <sys/types.h> /* define pid_t, etc. */ #include <sys/wait.
fseek()
函数读取并尝试打印文件的字符时,我遇到了null
字符问题。这是我的简单代码
#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;
}
txt文件是这样的
G
A
A
T
G
C
C
A
A
T
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
如果你能帮助我,我将不胜感激
编辑:我意识到我像$gcc sample.c-o sample-lpthread那样编译,它输出空值。另一方面,我编译它时没有使用-lpthread
它打印字符,但不正确,例如,这是文本文件
T
G
G
T
G
终端给出如下输出
G
A
A
T
G
C
C
A
A
T
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
看看这个
您可能知道fork()生成调用进程的一个副本,并且该副本(几乎)与原始副本相同-它们只是在child=1中的fork()不同
试试看(告诉我它是否有效,我无法测试:)
它不能正常工作(我很确定当pthread同时从文件中读取时会发生某种冲突),但至少您可以继续使用它
我得到了这个输出:
A
T
A
T
某物
某物
某物
某物
进程编号4,字符=A
进程编号3,字符=A
进程编号2,字符=T
进程编号1,字符=T
尾部:未找到进程您没有在打印屏幕中为str分配任何内存。fscanf要求这样做
尝试一种类似于:
void print_screen(int i){
char str[256]; /* plenty large enough for this example */
它对我不起作用,实际上它在死循环中阻塞,因为条件实际上永远不会是“1”。我猜这是一个错误的情况,因为child\u pid
在子进程中返回0
,并且父进程应该默认值:
?当我将其更改为默认值并将子项的条件设置为0时,它工作正常,但不正常。它打印错误的字符。是的,这就是我的意思!。它打印错误的字符序列。正如我所说,这是因为分叉过程都是独立的,并且没有任何东西可以控制它们打印出读取的字符的时间点。例如:p1读取A,p2读取B,p3读取C,p2打印B,p1打印A,p3打印C->文件是“AB C”,但输出是“B A C”,如果这样工作,则不会有任何问题。但问题是字符的数量并不相等。例如,当我运行您的代码时,我得到以下输入:A G T C
和进程号5,Character=C进程号3,Character=T进程号2,Character=G进程号1,Character=G进程号4,Character=T
,因此没有处理打印输出的“A”字符
void print_screen(int i){
char str[256]; /* plenty large enough for this example */