使用多处理从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 */