Skip to content

Instantly share code, notes, and snippets.

@siviae
Created April 10, 2014 19:32
Show Gist options
  • Save siviae/10415037 to your computer and use it in GitHub Desktop.
Save siviae/10415037 to your computer and use it in GitHub Desktop.
OS_homework1
#include <iostream>
#include <fstream>
#include <unistd.h>
#include <sys/stat.h>
#include <fcntl.h>
#include <stdlib.h>
#include <stdio.h>
#include <sys/wait.h>
int const MAX_FD_LENGTH = 10;
using namespace std;
int main(int argc, char *argv[])
{
int fds[argc];
char* argv_new[argc];
for(int i=1;i<argc;i++){
// cout<<argv[i]<<endl;
// cout<<"arg is "<< argv[i]<<endl;
if(i<=2 && i>0){
argv_new[i-1] = argv[i];
} else {
fds[i-2] = open(argv[i],O_RDONLY);
if(fds[i-2]==-1) exit(EXIT_FAILURE);
char* tmp= (char*) malloc(MAX_FD_LENGTH*sizeof(char));
if(tmp==0){
perror("Cannot allocate memory: ");
exit(EXIT_FAILURE);
}
sprintf(tmp, "%d", fds[i-2]);
argv_new[i-1]=tmp;
}
// cout<<"new arg is "<<argv_new[i-1]<<endl;
}
argv_new[argc-1]=0;
int pid = fork();
if(pid==0)
{
int result = execv(argv[1],argv_new);
//we must not be here
cout<<"Sorry, cannot execute "<<argv[1]<<" ,execv returned"<<result<<endl;
cout<<"Arguments are "<<endl;
// for(int i=0;i<argc-2;i++){
// cout<<argv_new[i]<<";"<<endl;
//}
} else
{
int status;
wait(&status);
// cout<<"Process is finished"<<endl;
}
//cin.get();
}
#include <iostream>
#include <stdlib.h>
#include <unistd.h>
#include <string.h>
#include <stdio.h>
using namespace std;
int BUFFER_SIZE = 512;
char* buffer = (char*) malloc(BUFFER_SIZE);
char* delim;
int delim_size;
int main(int argc, char *argv[])
{
// cout<<"Delim is "<<delim<<"."<<endl;
// cout<<"Size of delim is "<< delim_size<<endl;
delim_size = strlen(argv[1]);
delim = argv[1];
for(int i=2;i<argc;i++){
int fd = atoi(argv[i]);
int size=0;
int d_size = delim_size;
do{
size = read(fd,buffer,BUFFER_SIZE);
// cout<<"size is equal to "<< size<< endl;
if(size==-1){
perror("Sorry, cannot read: ");
exit(EXIT_FAILURE);
}
if(size>0) {
int result;
do{
int n=0;
result = write(1,buffer+n,size);
if(result!=-1) n+=result;
size-=result;
} while(result!=-1&&result<size);
if(result==-1){
perror("Sorry, cannot write: ");
exit(EXIT_FAILURE);
}
if(i!=argc-1){
do{
int n=0;
result = write(1,delim+n,d_size);
if(result!=-1) n+=result;
d_size-=result;
} while (result!= -1 && result<d_size);
if(result==-1){
perror("Sorry, cannot write delim: ");
exit(EXIT_FAILURE);
}
}
}
} while(size>0);
}
//write(1,buf,BUFFER_SIZE);
//cout<<"Hello, World!"<<endl;
//cout<<endl;
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment