Hi guys.
So basically my program is doing the following:
The parent: recver process is going to spawn 1 thread to read a file the child process is sending. The child process is writing a file to a message queue (IPC) and the parent process is spawning a thread and reading the message queue and will then also write the new file.
Before I tried to throw threads in this program, it was working fine with just 2 processes, 1 process writing to the message queue the other process reading and wrtiing a new file. So the message queue system isn't the issue it is the threading issue.
Code:
/* Functions */
int main( int argc, char **argv )
{
int pid;
int read_index = 0, write_index = 0, new_index = 0;
int err;
FILE *fp;
/* Check for arguments */
if ( argc < 3 )
{
/* Complain, explain, and exit */
fprintf( stderr, "missing or bad command line arguments\n" );
fprintf( stderr, CLIENT_USAGE );
exit( -1 );
}
/* get the index for the IPC object */
err = create_ipc( &read_index, &write_index );
if ( err ) {
fprintf( stderr, "create ipc error\n" );
exit(-1);
}
/* create receiver process */
if (( pid = fork() != 0 )) {
/* parent: recver */
/* setup the IPC channel */
err = setup_ipc_parent( read_index, write_index, &new_index );
if ( err ) {
fprintf( stderr, "rcver: error in ipc setup\n" );
exit(-1);
}
/* open the output file and return the file descriptor */
if (( fp = fopen( argv[2], "w+" )) < 0 ) {
fprintf( stderr, "rcver: file open failure\n" );
return -1;
}
/* create threads to receive the file contents */
run_pool_threads( fp, new_index, rcv_file );
//fclose( fp );
/* dump the file contents */
//rcv_file( argv[2], new_index );
fprintf( stderr, "rcver: finished\n" );
}
else {
/* childd */
/* setup the IPC channel */
err = setup_ipc_child( read_index, write_index, &new_index );
if ( err ) {
fprintf( stderr, "sender: error in ipc setup\n" );
exit(-1);
}
//added
/* open the input file and return the file descriptor */
if (( fp = fopen( argv[1], "r" )) < 0 ) {
fprintf( stderr, "sender: file open failure\n" );
return -1;
}
/* send the file contents */
//send_file( argv[1], new_index );
send_file(fp,new_index);
fprintf( stderr, "sender: finished\n" );
}
exit( 0 );
}
Here is the code that creates the thread, notice I'm using a structure becuase I need to pass in 2 parameters to the processes, a file descriptor and a file pointer.
Code:
int run_pool_threads( FILE *fp, int fd, void *(*threadfn)(void *))
{
/* build, run, and manage all the sorting threads -- run rcv_file for each */
//for now there will be only 1 thread.
pthread_t thread_id;
//We must create a structure to pass multiple arguments to the thread, such as fp and index
thread_work_t * work_t = malloc(sizeof(thread_work_t));
work_t->fp = fp;
work_t->fd = fd;
//creating the new thread and passing the thread_work_t structure
pthread_create( &thread_id, NULL, threadfn, work_t);
return 0;
}
Here is the function I'm passing to the thread, I don't beleive this ever gets ran because when I look at the output it never prints "Thread number: ". And the parent process just ends.
Code:
void *rcv_file( void *arg )
{
printf("Thread number %ld\n", pthread_self());
//you must cast the arg to the correct data type to access its data members
thread_work_t *work_t;
work_t = (struct thread_work *) arg;
//create a struct to hold the msg type and message
struct msgbuf_t msg;
int cmd = IPC_STAT;
int rtrn = msgctl(work_t->fd, cmd, &BUFF);
if (rtrn == -1)
{
perror("msgctl: msgctl failed");
return EXIT_FAILURE;
}
printf("msg_qnum: %d\n",BUFF.msg_qnum);
for(;;)
{
if(BUFF.msg_qnum == 0) //there is no messages to read! so wait.
{
sched_yield();
}
//if (msgrcv(index, &msg, MSGBUF_SIZE, 0, 0) == -1) {
if (msgrcv(work_t->fd, &msg, MSGBUF_SIZE, 0, 0) == -1) {
perror("msgrcv");
exit(1);
}
if(msg.type == MEND)
{
printf("Got MEND from sender, exit\n");
// fclose(fp);
fclose(work_t->fp);
break;
}
else if(msg.type == MTYPE)
{
printf("rev: %s", msg.text);
//fprintf(fp,"%s",msg.text);
fprintf(work_t->fp,"%s",msg.text);
}
else
{
printf("WE GOT SOMTHING ELSE! LOL\n");
}
}
return 0;
HEre is the output:
Code:
#
cory@ubuntu:~/Documents/Operating Systems/p2$ ./p2 test2/ltest ltestOUT
KEY generated: 1090584577
read and write id's: 32769
sent: 3 help me, mr wizard!
sent: 7 help me, mr wizard!
sent: 6 help me, mr dude!
sent: Found EOF
sender: finished
rcver: finished
As you can see its sending fine, but it never reads from the message queue, the thread I don't believe is ever getting ran and Im' not sure why.
ANy help would be great!