gpt4 book ai didi

c - 使用多处理从c中的文本文件中逐行读取字符

转载 作者:行者123 更新时间:2023-11-30 17:57:28 24 4
gpt4 key购买 nike

您好,我在阅读并尝试在多进程程序中使用 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;
}

假设我在命令行中输入./sample 10,那么程序将在sample.txt中打印10个字符,然后将创建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 example.c -o example -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

最佳答案

看看这个 http://www.cs.nmsu.edu/~jcook/Tools/pthreads/pthreads.html

您可能知道 fork() 会生成调用进程的副本,并且该副本(几乎)与原始副本相同 - 它们的区别仅在于子进程中的 fork() = 1

尝试(并告诉我它是否有效,我无法测试它:)

            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:未找到进程

关于c - 使用多处理从c中的文本文件中逐行读取字符,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12807484/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com