Q:

getopt(3) On mac os and CentOS

I compile the same code by gcc on OSX and CentOS:
while (( opt = getopt (argc, argv, "hp:" )) ! = -1 )
    {
        fprintf (stderr,"+++++++++++ %d\n\n", opt );
        switch ( opt )
            {
            case 'h':
                    fprintf(stderr, "Help Page \n %s", help_str);
                    return 1;

            case 'p':
                    filename = optarg ;
                    fprintf(stderr,"================== %s\n",optarg);
                    break;

            case '?': 
                    printf("ZHZHZHZHZHUT\n");
                    return 3;

            default:
                break;
            }
    }

Then I try to run ./a.out -p ./file.txt ya.ru and ./a.out ya.ru -p ./file.txt
On CentOS 6.5 both variants work. 
But on MAC OS X(10.9) variant ./a.out ya.ru -p ./file.txt (free parameter before dependent parameter ) does not work.  
-p and /file.txt are used as simple arguments (not by getopt). 
Full code is here 
Thanks.  

A:

The documented behaviour of GNU getopt() is to stop at the first non-option argument only when in POSIX mode, which can be set via a + at the start of the option string or by setting the POSIXLY_CORRECT environment variable. 
In its default mode, GNU getopt() 'permutes the contents of argv as it scans, so eventually all the non-options are at the end.' 
You are hitting this difference in the behaviour — it is the difference between GNU getopt() and BSD getopt() behaviour, because the BSD getopt() has POSIX semantics.