/* main.cc * */ #include #include #include #include #include void usage() { printf("Usage:\n"); printf("-p - use program instead of /bin/ls \n"); exit(1); } void * forkit2me(void *data) { pid_t pid; printf("forking\n"); if ((pid = fork()) < 0 ) { printf("Unable to fork\n"); } else if (pid == 0 ) { printf ("child\n"); execve((char *)data,NULL,NULL); exit(-1); } else { printf ("parent\n"); } printf ("done here\n"); } int main(int argc, char * argv[]) { int quit=0; char * prog2run = "/bin/ls"; if (argc > 0) { for (int i=1; i < argc; i++) { if ( argv[i][0]== '-' ) { switch (argv[i][1]) { case 'p': if ( i+1 < argc ) { prog2run=argv[i+1]; i++; } break; default: usage(); } } } } fcntl( fileno( stdout ), F_SETFD, 1 ); fcntl( fileno( stderr ), F_SETFD, 1 ); int rc; pthread_attr_t ta; pthread_t threadId; while (!quit) { printf("here we go\n"); rc=pthread_attr_init(&ta); if (rc) { printf("pthread_attr_init failed: rc (%d)\n",rc); break; } rc=pthread_attr_setdetachstate(&ta,PTHREAD_CREATE_DETACHED); if (rc) { printf("pthread_attr_setdetachstate failed: rc (%d)\n",rc); break; } #ifdef PRFAIL printf("creating thread\n"); #endif rc=pthread_create(&threadId, &ta, forkit2me, prog2run); if (rc) { printf("pthread_create failed: rc (%d)\n",rc); break; } #ifdef PRFAIL printf("created\n"); #endif pthread_attr_destroy(&ta); #ifdef PRFAIL printf("destory\n"); #endif } return 0; }