0

グローバルに定義されたファイル変数を使用して作成しているプログラムがあり、子を分岐した後に親がアクセスしようとしています。ただし、ファイルに書き込んでいるのは子であるため、親として読み込もうとするとError: No such file or directory. エラーとしてスローされないだけで、tmpFP ファイルに格納されます。これを回避する方法がわかりません。

読みやすくするために一部のコードを省略しました。ソケットへの参照はカスタム ライブラリからのものであり、動作すると仮定します。関連するコメントはすべて大文字にする必要があります。それらは、問題が発生したと思われる場所を示しています。

#include <stdlib.h>
#include <stdio.h>
#include <stdarg.h>
#include <string.h>
#include <ctype.h>
#include <stdbool.h>
#include <sys/types.h>
#include <sys/wait.h>
#include <errno.h>
#include <unistd.h>
#include <stdarg.h>

#include "Socket.h"
#include "ToUpper.h" /* definitions shared by client and server */

#define LINE_SIZE 50
#define MAX_WORDS 10
#define MAX_LINE 1024
#define MAX_TMP 100
#define MAX_ARGS 4  /* allows program name + 3 positional parameters */
#define MIN_ARGS 2  /* must have at least 1 positional parameter */
#define NUM_PARMS 4  /* allows program name + 2 parameters + NULL */
#define ERR_RETURN -1

/* variables to hold socket descriptors */
ServerSocket welcome_socket;
Socket connect_socket;
char new_line[MAX_LINE];
char tmp_name[MAX_TMP]; //DECLARING FILENAME
char id_str[MAX_TMP];
char arr[LINE_SIZE]={0};
int id;
FILE *fp; //FILE USED IN CHILD PROCESS
void toupper_service(void);

int main(int argc, char* argv[])
{
    FILE *tmpFP; //FILE USED IN PARENT PROCESS

    pid_t spid; /* pid_t is typedef for Linux process ID */
    int c=0,index=0;
    id = (int) getpid();
    sprintf(id_str, "%d", id);
    strcpy(tmp_name,"tmp");
    strcat(tmp_name, id_str);
    if (argc < 2)
    {
        printf("No port specified\n");
        return (-1);
    }

    welcome_socket = ServerSocket_new(atoi(argv[1]));

    connect_socket = ServerSocket_accept(welcome_socket);
    Socket_close(welcome_socket);

    while (c!=EOF)
    {
        while((c=Socket_getc(connect_socket))!='\n')
        {
            arr[index]=c;
            index++;
        }
        arr[index]='\0';
        /* accept an incoming client connection; blocks the
         * process until a connection attempt by a client.
         * creates a new data transfer socket.
         */

        spid = fork();  /* create child == service process */
        if (spid == -1)
        {
            perror("fork");
            exit (-1);
        }
        if (spid == 0)
        {/* code for the service process */
            toupper_service();
            Socket_close(connect_socket);
            exit (0);
        } /* end service process */
        else /* daemon process closes its connect socket */
        {
            waitpid(spid,NULL,0); 

            //PASSES THIS TEST SOMEHOW 
            if((tmpFP = fopen (tmp_name, "r")) == NULL) 
            { 
                fprintf(stderr, "%s\n",tmp_name);
                fprintf (stderr, "error opening tmp file\n");
                exit (-1);
            }
            while((c=fgetc(tmpFP))!=EOF)
            {
                //PRINTS OUT ERROR HERE A LETTER AT A TIME 
                fprintf(stderr, "c: %d %c\n", c, (char)c); 
                Socket_putc(c, connect_socket);
            }
            remove(tmp_name);
            Socket_putc('\0', connect_socket);

            Socket_close(connect_socket);
            /* reap a zombie every time through the loop, avoid blocking*/
        }
    }/* end of infinite loop for daemon process */
    fprintf(stderr, "C: %d\n",c);
}
void toupper_service(void)
{
    int i=0, c, pointer,num_words=0,index=0;
    int too_many_words=0;
    char *word[MAX_WORDS]={NULL};

    //THIS IS THE OTHER PLACE TMP_NAME IS USED
    fp = freopen(tmp_name, "w", stdout); 

    while ((c=arr[index])!='\0')  
    {
        if(c==' '||c=='\t'||c=='\n') //word encountered
        {
            if(num_words>=MAX_WORDS-1)
            {
                printf("Too many commands passed\n");
                too_many_words=1;
                exit(0);
                break;
            }
            arr[index]='\0';
            word[num_words]=&arr[pointer];
            pointer=i+1;
            num_words++;
        }
        index++;
    }
    word[num_words]=NULL; 
    if(too_many_words==0)
    {
        c=0;
        int error=execvp(word[0],word);
    }
    return;
}
4

0 に答える 0