Step 1, work on the indentation. Consistent and clear indentation will save you from an awful lot of mistakes, and make it much easier for anyone reading your code.

Eg.
Code:
#include<stdio.h>
#include<stdlib.h>
#include<string.h>

char function1(FILE * fp, char *str);
char function2(char, char *);

int main(int argc, char *argv[])
{
    FILE *fp;
    char *str, *str1;                       /*!! these don't point anywhere */
    char ch;                                /*!! should be declared int, not char */

    if (argc < 4) {
        printf("Inadequate number of inputs");
    } else {
        while (((ch = fgetc(fp)) != EOF)) { /*!! you don't open the file */
            if (ch == '[')
                function1(fp, str);
            printf("hhhh");
            break;                          /*!! the loop exits after just ONE character */
        }
    }

}

char function1(FILE * fp, char *str)
{
    int a, i;
    char ch;
    char arr[20];

    while (((ch = fgetc(fp)) != EOF)) {
        /* if(ch!=']'||ch!='[') */
        if (strcmp(fp, str) == 0) {     /*!! see above, str isn't pointing anywere */
                                        /*!! in addition, fp is totally the wrong type */
            for (i = 0; i < 20; i++) {  /*!! why fill the array with the same char? */
                arr[i] = ch;
                printf("%c", arr[i]);
            }
            function2(arr, str);        /*!! was *str2, an undeclared variable */
        } else
            return;
    }
}

char function2(char arr, char *str1)    /*!! fix spelling of function name */
{                               
    int b;

    if (arr != ']' || arr != '[')
        b = strcmp(arr, str1);
    if (b != 1)
        printf("%s", str1);
}
All the !! comments are something you need to think about.

For what it's worth, I got these warnings, after fixing some things.
Code:
$ gcc -W -Wall -ansi -pedantic -O2 foo.c
foo.c: In function `main':
foo.c:11: warning: unused variable `str1'
foo.c: In function `function1':
foo.c:35: warning: passing arg 1 of `strcmp' from incompatible pointer type
foo.c:41: warning: passing arg 1 of `function2' makes integer from pointer without a cast
foo.c:43: warning: `return' with no value, in function returning non-void
foo.c:29: warning: unused variable `a'
foo.c: In function `function2':
foo.c:52: warning: passing arg 1 of `strcmp' makes pointer from integer without a cast
foo.c: At top level:
foo.c:8: warning: unused parameter 'argv'
foo.c: In function `function2':
foo.c:55: warning: control reaches end of non-void function
foo.c: In function `function1':
foo.c:45: warning: control reaches end of non-void function
foo.c: In function `main':
foo.c:25: warning: control reaches end of non-void function
foo.c:10: warning: 'fp' might be used uninitialized in this function
foo.c:11: warning: 'str' might be used uninitialized in this function
Yes it is hard work to make your code compile clean (compared to what some other compilers' will let you get away with), but for the vast majority of the time, they tell you something you need to take care of. For example, using an uninitialised value would be very bad.

2. Use much better names than function1() and function2(). That tells me nothing about what is going on.

Personally, I would suggest you begin by reading each line of the file using fgets(), then use another function to look for say '[' in that line.