예전에 공부하면서 작성했던 C system programming 예제를 첨부한다.
전반적인 시스템 코드 작성 예제가 두루 포함되어있어서 도움이 많이 될거다.
2주차
code3-1
#include<stdio.h>
#include<stdlib.h>
#include<fcntl.h>
#include<unistd.h>
int main(){
int filedes;
char fname[] = "afile";
if((filedes = open(fname, O_RDWR)) == -1){
printf("%s cannot be opened. \n", fname);
}
close(filedes);
return 0;
}
code3-2
#include<stdio.h>
#include<stdlib.h>
#include<fcntl.h>
#define PERMS 0644
char *filename = "newfile";
void main(){
int fd;
if((fd = open(filename, O_RDWR | O_CREAT, PERMS)) == -1){
printf("Cannot create %s \n", filename);
exit(1);
}
exit(0);
}
code3-3
#include<stdio.h>
#include<stdlib.h>
#include<fcntl.h>
#include<unistd.h>
#define BUFSIZE 512
void main(){
char buffer[BUFSIZE];
int fd;
ssize_t nread;
long total = 0;
if((fd = open("testfile", O_RDONLY)) == -1){
exit(1);
}
while((nread = read(fd, buffer, BUFSIZE)) > 0){
total += nread;
}
close(fd);
printf("Number of characters in testfile: %ld\n", total);
exit(0);
}
code3-4
#include<stdio.h>
#include<stdlib.h>
#include<unistd.h>
int main(){
if((write(1, "Welcome to System Programming", 27)) != 27){
write(2, "A write error has occurred on file descriptor 1 \n", 47);
}
exit(0);
}
lab-1
#include<stdio.h>
#include<stdlib.h>
#include<fcntl.h>
#include<unistd.h>
#define BUFSIZE 512
int main(int argc, char *argv[]){
char buffer[BUFSIZE];
char *fname1 = argv[1];
char *fname2 = argv[2];
int fd1;
int fd2;
int nread;
if((fd1 = open(fname1, O_RDONLY)) == -1){ // readonly open
printf("open %s\n", fname1);
exit(1);
}
//creat(fname2, O_RDWR|O_APPEND); // create file bfile
if((fd2 = open(fname2, O_RDWR|O_APPEND)) == -1){ // read and write
printf("open %s\n", fname2);
exit(1);
}
printf("start copying \n");
while((nread = read(fd1, buffer, BUFSIZE)) > 0){
printf("\n\n%d\n\n",nread);
write(fd2, buffer, nread);
}
printf("finish\n");
close(fd1);
close(fd2);
exit(0);
}
3주차
code3-5
#include<stdio.h>
#include<unistd.h>
int main(){
if(lseek(STDIN_FILENO, 0, SEEK_CUR) == -1)
printf("cannot seek \n");
else
printf("seek OK \n");
return 0;
}
code3-6
#include<stdio.h>
#include<unistd.h>
#include<fcntl.h>
#include<sys/types.h>
#include<sys/stat.h>
#include<error.h>
char buf1[] = "abcdefghij";
char buf2[] = "ABCDEFGHIJ";
int main(){
int fd;
if((fd = creat("file.hole", S_IRUSR | S_IWUSR | S_IRGRP | S_IROTH)) < 0)
perror("file.hole");
if(write(fd, buf1, 10) != 10)
perror("buf1");
if(lseek(fd, 40, SEEK_SET) == -1)
perror("lseek");
if(write(fd, buf2, 10) != 10)
perror("buf2");
return 0;
}
code3-7
#include<stdio.h>
#include<sys/stat.h>
#include<sys/types.h>
#include<string.h>
#include<stdlib.h>
#include<fcntl.h>
#include<unistd.h>
#define BUFFSIZE 512
#define FILESIZE (100 * 100 * 1024)
#define COUNT FILESIZE / BUFFSIZE
void main(){
int i, fd;
char buf[BUFFSIZE];
memset(buf, '.', BUFFSIZE);
if((fd = creat("file.write", S_IRUSR | S_IWUSR)) < 0)
exit(1);
for(i = 0; i < COUNT; ++i)
write(fd, buf, BUFFSIZE);
close(fd);
exit(0);
}
code3-8
#include<stdio.h>
#include<unistd.h>
#include<fcntl.h>
#include<sys/stat.h>
#include<error.h>
int main(){
int fd;
if((fd = creat("afile", S_IRUSR | S_IWUSR)) == -1)
perror("afile");
printf("This is displayed on the screen. \n");
close(STDOUT_FILENO);
dup(fd);
close(fd);
printf("This is written into the redirected file. \n");
return 0;
}
code3-9
#include<stdio.h>
#include<unistd.h>
#include<fcntl.h>
#include<sys/stat.h>
#include<error.h>
int main(){
int fd;
if((fd = creat("afile", S_IRUSR | S_IWUSR)) == -1)
perror("afile");
printf("This is displayed on the screen. \n");
dup2(fd, STDOUT_FILENO); // TO 1
close(fd);
printf("This is written into the redirected file. \n");
return 0;
}
code3-10
#include<stdio.h>
#include<sys/types.h>
#include<fcntl.h>
#include<unistd.h>
#include<sys/stat.h>
#include<error.h>
int main(int argc, char* argv[]){
if(argc != 2)
printf("usage: a.out <pathname>");
if(access(argv[1], R_OK) < 0)
perror("R_OK");
else
printf("read acess OK \n");
if(open(argv[1], O_RDONLY) < 0)
perror("O_RDONLY");
else
printf("open for reading OK \n");
return 0;
}
lab-2
#include<stdio.h>
#include<stdlib.h>
#include<fcntl.h>
#include<unistd.h>
#include<string.h>
#define BUF_SIZE 64
int main(){
char *filename = "test.txt";
char *buf1 = "abcdefghijklmnop";
char buffer[BUF_SIZE];
int fd;
int nread;
fd = open(filename, O_RDWR | O_CREAT | O_APPEND, S_IRUSR | S_IWUSR);
if(write(fd, buf1, 16) == -1)
exit(1);
if(lseek(fd, 10, SEEK_SET) == -1)
exit(1);
while(nread = read(fd, buffer, BUF_SIZE) > 0)
printf("%s\n", buffer);
memset(buffer, 0, BUF_SIZE); // initial
if(lseek(fd, -5, SEEK_END) == -1)
exit(1);
while(nread = read(fd, buffer, BUF_SIZE) > 0)
printf("%s\n", buffer);
return 0;
}
lab-3
#include<stdio.h>
#include<sys/types.h>
#include<sys/stat.h>
#include<unistd.h>
#include<fcntl.h>
#include<time.h>
int main(){
struct stat buf;
int fd;
fd = creat("testfile", S_IRUSR | S_IWUSR);
stat("testfile", &buf);
printf("file inode: %ld\n", (long)buf.st_ino); // i - node
printf("file first created: %s", ctime(&buf.st_ctime)); // status change time
printf("file last updated: %s", ctime(&buf.st_mtime)); // change time
printf("file last accessed: %s", ctime(&buf.st_atime)); // access time
return 0;
}
lab-4
#include<stdio.h>
#include<stdlib.h>
#include<fcntl.h>
#include<unistd.h>
#include<sys/types.h>
#include<sys/stat.h>
int main(int argc, char *argv[]){
char buf[20];
int fd;
if(access(argv[1], F_OK) == 0){
if((fd = open(argv[1], O_RDWR, S_IRUSR | S_IWUSR)) == -1)
exit(1);
if(read(fd, buf, 20) == -1)
exit(1);
if(write(1, buf, 20) == -1) // print to stdout -> monitor
exit(1);
printf("\n");
}
else{
if((fd = creat(argv[1], S_IRUSR | S_IWUSR)) == -1)
exit(1);
if(write(fd, "hello world", 11) == -1)
exit(1);
}
return 0;
}
4주차
code4-1
#include<stdio.h>
#include<sys/stat.h>
#include<sys/types.h>
#include<fcntl.h>
#include<unistd.h>
#include "error.h"
int main(){
int fd, len;
char buf[20];
fd = open("tempfile", O_RDWR | O_CREAT | O_TRUNC, 0666);
if(fd == -1) perror("open1");
unlink("tempfile");
len = write(fd, "How are you?", 12);
if(len != 12) perror("write");
lseek(fd, 0L, SEEK_SET);
len = read(fd, buf, sizeof(buf));
if(len < 0) perror("read");
buf[len] = '\0';
printf("%s\n", buf);
close(fd);
fd = open("tempfile", O_RDWR);
if(fd == -1) perror("open2");
close(fd);
return 0;
}
lab-5
#include<stdio.h>
#include<fcntl.h>
#include<unistd.h>
#include<sys/types.h>
#include<sys/stat.h>
#include "error.h"
int main(int argc, char* argv[]){ // ./a.out <original file> <new file>
int fd;
int l;
fd = open(argv[1], O_RDWR, 0666);
if (fd == -1) perror("cannot open this file");
l = link(argv[1], argv[2]);
unlink(argv[1]);
if (l == -1) perror("link error has been occured \n");
close(fd);
return 0;
}
5주차
code4-2
#include<stdio.h>
#include<sys/types.h>
#include<sys/stat.h>
#include<fcntl.h>
#include "error.h"
int main(void){
umask(0);
if(creat("foo", S_IRUSR | S_IWUSR | S_IRGRP | S_IWGRP | S_IROTH | S_IWOTH) < 0)
perror("foo");
umask(S_IRGRP | S_IWGRP | S_IROTH | S_IWOTH);
if(creat("bar", S_IRUSR | S_IWUSR | S_IRGRP | S_IWGRP | S_IROTH | S_IWOTH) < 0)
perror("bar");
return 0;
}
code4-3
#include<stdio.h>
#include<sys/types.h>
#include<sys/stat.h>
#include "error.h"
int main(){
struct stat statbuf;
if(stat("foo", &statbuf) < 0)
perror("stat(foo)");
if(chmod("foo", (statbuf.st_mode & ~S_IXGRP) | S_ISGID) < 0)
perror("chmod(foo)");
if(chmod("bar", S_IRUSR | S_IWUSR | S_IRGRP | S_IROTH) < 0)
perror("chmod(bar)");
return 0;
}
code4-4
#include<stdio.h>
#include<sys/types.h>
#include<sys/stat.h>
#include<fcntl.h>
#include<utime.h>
#include "error.h"
int main(int argc, char* argv[]){
int i;
struct stat statbuf;
struct utimbuf timebuf;
for(i = 1; i < argc; i++){ //begin with index 1 -> ./a.out is index 0 , and fileanme is index 1
if(stat(argv[i], &statbuf) < 0)
perror(argv[i]);
if(open(argv[i], O_RDWR | O_TRUNC) < 0)
perror(argv[i]);
timebuf.actime = statbuf.st_atime;
timebuf.modtime = statbuf.st_mtime;
if(utime(argv[i], &timebuf) < 0)
perror(argv[i]);
}
return 0;
}
code4-5
#include<stdio.h>
#include<sys/types.h>
#include<unistd.h>
#include<string.h>
#include<sys/stat.h>
#include<dirent.h>
#include "error.h"
typedef struct dirent Dirent;
int main(int argc, char* argv[]){
Dirent *dp;
DIR *dir_fd;
while(--argc > 0){
if(!(dir_fd = opendir(*++argv))){ //opendir returns null if fail, ++argv means ./a.out will excepted
if(mkdir(*argv, S_IRWXU | S_IRWXG | S_IRWXO) == -1)
perror("opendir");
continue; //if null then continue
}
for(int i = 0; i < 2; i++){
int cnt = 0;
for(; dp = readdir(dir_fd);){
if(i) printf("%s\n", dp->d_name); //first entry is self entry -> int i = 0 -> self entry )
if(strcmp(dp->d_name, ".") && strcmp(dp->d_name, ".."))
cnt++;
}
if(!cnt){rmdir(*argv); break;}
rewinddir(dir_fd);
}
closedir(dir_fd);
}
return 0;
}
code4-6
#include<stdio.h>
#include<unistd.h>
#include "error.h"
#define PATH_MAX 1024
int main(void){
char path[PATH_MAX + 1];
if(chdir("/tmp") < 0)
perror("error chdir");
else{
if(getcwd(path, PATH_MAX) == NULL)
perror("error getcwd");
else
printf("Current working directory changed to %s \n", path);
}
}
code4-7
#include<stdio.h>
#include<sys/types.h>
#include<unistd.h>
#include<string.h>
int main(int argc, char* argv[]){
char *buf[256], tname[256];
if((argc < 3 && argc > 4) || (argc == 4 && strcmp(argv[1], "-s"))){
printf("Usage: %s <orig_file> <new_file>\n", argv[0]);
return 1;
}
if(argc == 4)
return symlink(argv[2], argv[3]);
else
return link(argv[1], argv[2]);
}
lab-6
#include<stdio.h>
#include<string.h>
#include<sys/types.h>
#include<unistd.h>
#include<sys/stat.h>
#include<dirent.h>
#include "error.h"
typedef struct dirent Dirent;
int match(char *s1, char *s2){ // s1 = filename, s2 = suffix
int diff = strlen(s1) - strlen(s2);
if(strlen(s1) > strlen(s2)) return (strcmp(&s1[diff], s2) == 0);
else return (0);
}
int main(int argc, char* argv[]){
Dirent *dp;
DIR *dir_fd;
dir_fd = opendir(argv[1]); //open the directory
while(dp = readdir(dir_fd)){ // if dp is null then break
if(dp->d_name == "." || dp->d_name == "..")
continue; //if d_name is self or parent then continue
else{
if(match(dp->d_name, argv[2])){ //compare the d_name and the suffix
printf("matched file's i node number: %ld\n", dp->d_ino); // if true print info of the file
printf("matched fils's filename: %s\n", dp->d_name);
}
}
}
return 0;
}
6주차
code6-1
#include<stdio.h>
#include<stdlib.h>
static void my_exit1(void), my_exit2(void);
void err_sys(const char* message);
int main(void){
if(atexit(my_exit2) != 0)
err_sys("can't register my_exit2");
if(atexit(my_exit1) != 0)
err_sys("can't register my_exit1");
if(atexit(my_exit1) != 0)
err_sys("can't register my_exit1");
printf("main in done\n");
return 0;
}
static void my_exit1(void){
printf("first exit handler \n");
}
static void my_exit2(void){
printf("second exit handler \n");
}
void err_sys(const char* message){
fputs(message, stderr);
fputc('\n', stderr);
exit(1);
}
code6-2
#include<stdio.h>
#include<stdlib.h>
extern char **environ;
int main(){
char **env = environ;
while(*env){
printf("%s\n", *env);
env++;
}
exit(0);
}
code6-3
#include<stdio.h>
#include<stdlib.h>
#include<string.h>
int main(int argc, char *argv[]){
char *var, *value;
if(argc == 1 || argc > 3){
fprintf(stderr, "usage: environ var [value]\n");
exit(1);
}
var = argv[1];
value = getenv(var);
if(value)
printf("Variable %s has value %s\n", var, value);
else
printf("Variable %s has no value\n", var);
}
lab-7
#include<stdio.h>
#include<string.h>
#include<stdlib.h>
#include<unistd.h>
int main(){
char* var = "PATH";
char* new_value;
char buff[1024]; //buffer
printf("PATH is %s \n", getenv(var));
getcwd(buff, 1024); // get current directory path to buff
new_value = buff; //allocate current directory path to new_value
setenv(var, new_value, 1); //set new_value to PATH, if exists overwrite PATH
printf("Changed PATH is %s \n", getenv(var));
return 0;
}
7주차
code6-4
#include<stdio.h>
#include<stdlib.h>
#include<setjmp.h>
static void f1(int, int, int);
static void f2(void);
static jmp_buf jmpbuffer;
int main(void){
int count;
int val;
int sum;
count = 2; val = 3; sum = 4;
printf("initial values: count = %d, val = %d, sum = %d\n", count, val, sum);
if(setjmp(jmpbuffer) != 0){
printf("after longjmp: count = %d, val = %d, sum = %d\n", count, val, sum);
exit(0);
}
count = 97; val = 98; sum = 99;
f1(count, val, sum);
}
static void f1(int i, int j, int k){
printf("in f1(): count = %d, val = %d, sum = %d\n", i, j, k);
f2();
}
static void f2(void){
longjmp(jmpbuffer, 1);
}
code7-1
#include<stdio.h>
#include<unistd.h>
int main(void){
int x;
x = 0;
fork();
x = 1;
printf("I am process %ld and my x is %d\n", (long)getpid(), x);
return 0;
}
code7-2
#include<stdio.h>
#include<unistd.h>
#include<sys/types.h>
int main(void){
pid_t childpid;
childpid = fork();
if(childpid == -1){
printf("Failed to fork");
return 1;
}
if(childpid == 0)
printf("hello from child %ld\n", (long)getpid());
else
printf("hello from parent %ld\n", (long)getpid());
return 0;
}
code7-3
#include<stdio.h>
#include<unistd.h>
#include<sys/types.h>
void fork1(){
int x = 1;
pid_t pid = fork();
if(pid == 0){
printf("Child has x = %d\n", ++x);
}else{
printf("Parent has x = %d\n", --x);
}
printf("Bye from process %d with x = %d\n", getpid(), x);
}
int main(){
fork1();
return 0;
}
code7-4
#include<stdio.h>
#include<unistd.h>
#include<sys/types.h>
void fork2(){
printf("L0\n");
fork();
printf("L1\n");
fork();
printf("Bye\n");
}
int main(){
fork2();
return 0;
}
code7-5
#include<stdio.h>
#include<unistd.h>
#include<sys/types.h>
void fork3(){
printf("L0\n");
fork();
printf("L1\n");
fork();
printf("L2\n");
fork();
printf("Bye\n");
}
int main(){
fork3();
return 0;
}
code7-6
#include<stdio.h>
#include<unistd.h>
#include<sys/types.h>
void fork4(){
printf("L0\n");
if(fork() != 0){
printf("L1\n");
if(fork() != 0){
printf("L2\n");
fork();
}
}
printf("Bye\n");
}
int main(){
fork4();
return 0;
}
code7-7
#include<stdio.h>
#include<unistd.h>
#include<sys/types.h>
void fork5(){
printf("L0\n");
if(fork() == 0){
printf("L1\n");
if(fork() == 0){
printf("L2\n");
fork();
}
}
printf("Bye\n");
}
int main(){
fork5();
return 0;
}
code7-8
#include<stdio.h>
#include<stdlib.h>
#include<unistd.h>
#include<sys/types.h>
int main(){
pid_t pid;
char *message;
int n;
printf("fork program starting\n");
pid = fork();
switch(pid){
case -1:
perror("fork failed");
exit(1);
case 0:
message = "This is the child";
n = 5;
break;
default:
message = "This is the parent";
n = 3;
break;
}
for(;n>0;n--){
puts(message);
sleep(1);
}
exit(0);
}
code7-9
#include<stdio.h>
#include<stdlib.h>
#include<unistd.h>
#include<sys/types.h>
int glob = 6;
int main(void){
int var;
pid_t pid;
var = 88;
printf("before fork\n");
if((pid = fork()) < 0)
perror("fork error");
else if(pid == 0){
glob++;
var++;
_exit(0);
}
printf("pid = %d, glob = %d, var = %d\n", getpid(), glob, var);
exit(0);
}
code7-10
#include<stdio.h>
#include<sys/types.h>
#include<sys/wait.h>
#include<unistd.h>
#include<stdlib.h>
int main(void){
pid_t pid;
char* message;
int n;
int exit_code;
printf("fork program starting\n");
pid = fork();
switch(pid){
case -1:
perror("fork failed");
exit(1);
case 0:
message = "This is the child";
n = 5;
exit_code = 37;
break;
default:
message = "This is the parent";
n = 3;
exit_code = 0;
break;
}
for(;n>0;n--){
puts(message);
sleep(1);
}
if(pid != 0){
int stat_val;
pid_t child_pid;
child_pid = wait(&stat_val);
printf("Child has finished: PID = %d\n", child_pid);
if(WIFEXITED(stat_val))
printf("Child exited with code %d\n", WEXITSTATUS(stat_val));
else
printf("Child terminated abnormaly\n");
}
exit(exit_code);
}
code7-11
#include<stdio.h>
#include<stdlib.h>
#include<sys/types.h>
#include<sys/wait.h>
#include<unistd.h>
int main(){
int pid;
int status;
pid = fork();
if(pid < 0){
perror("fork error: ");
exit(0);
}
if(pid == 0){
printf("I am Child\n");
sleep(2);
return 2;
}
else{
printf("Parent: wait (%d)\n", pid);
waitpid(pid, &status, 0);
if(WIFEXITED(status)){
printf("normal exit\n");
printf("return value %d\n", WEXITSTATUS(status));
}
else if(WIFSIGNALED(status)){
printf("signal accpeted\n");
printf("signal number %d\n", WTERMSIG(status));
}
}
exit(0);
}
lab-8
#include<stdio.h>
#include<stdlib.h>
#include<sys/types.h>
#include<sys/wait.h>
#include<unistd.h>
#include<sys/stat.h>
#include<fcntl.h>
#include<string.h>
#define BUFSIZE 512
int main(){
int pid; // pid
int status; // termination status
int parent_pid = getpid(); // parent process's processID.
int string_length; // length of string in inputfileName
char* inputfilename = "sample.txt"; // fetch string from this file.
char* outputfilename = "output.txt"; // store string in this file.
int fd; // file descriptor of inputfile
int fd2; // file descriptor of outputfile
int nread;
int total;
char buffer[BUFSIZE];
if((fd = open(inputfilename, O_RDWR)) < 0){ // open sample.txt
perror("file open error: fd1\n");
exit(1);
}
if((fd2 = open(outputfilename, O_RDWR)) < 0){ //open output.txt
perror("file open error: fd2\n");
exit(1);
}
while(nread = read(fd, buffer, BUFSIZE) > 0) // read content of sample.txt
total += nread;
// print the information
printf("buffer content: %s\n", buffer);
printf("string length: %ld\n", strlen(buffer));
string_length = strlen(buffer); // if string is "system" then string_length = 7 because of \0
// make child process per loop, child process's count limit = string size - 1
// because of \0 added end of the string
while(--string_length){ // will loop length of string - 1
pid = fork(); // create child process
if(pid < 0){
perror("fork error\n");
exit(1);
}
if(pid == 0) // if child process then endwhile
break;
else{ // if parent process then wait until child exit
//sleep(1);
waitpid(pid, &status, 0); // wait child process
}
}
// only child process execute this contidion.
if(pid == 0){ // if child process do
int child_pid = getpid(); // get self pid;
int order = child_pid - parent_pid; // order variable is the order of the child process created by parent process.
char i = 0;
while(order--){
write(fd2, (void*)(buffer+ i), 1); // write 1byte from buffer to output.txt
i++; // index
}
write(fd2, "\n", 1); // add newline to output.txt
exit(0); // child process will exit here. means return
}
else{
printf("Parent: wait (%d)\n", pid);
//waitpid(pid, &status, 0);
if(WIFEXITED(status)){
printf("normal exit\n");
printf("return value %d\n", WEXITSTATUS(status));
}
else if(WIFSIGNALED(status)){
printf("signal accpeted\n");
printf("signal number %d\n", WTERMSIG(status));
}
}
printf("closing file.\n");
printf("operation finished. \n");
close(fd); // close inputfile descriptor: sample.txt
close(fd2); // close outputfile descriptor: output.txt
exit(0);
}
8주차
code7-12
#include<stdio.h>
#include<unistd.h>
main(int argc, char* argv[]){
execl("/bin/ls", "ls", argv[1], (char*)0);
}
code7-13
#include<stdio.h>
#include<unistd.h>
main(){
char *av[3];
av[0] = "ls";
av[1] = "-l";
av[2] = (char*) 0;
execv("/bin/ls", av);
}
code7-14
#include<stdio.h>
#include<unistd.h>
#include<string.h>
#include<stdlib.h>
void usage(void);
char *command_name;
main(int argc, char* argv[]){
char *rindex(const char* s, int c);
if((command_name = rindex(argv[0], '/')) != NULL) command_name++;
else command_name = argv[0];
if(argc < 2) usage();
if(execv(argv[1], &argv[1]) == -1){
perror("execv");
exit(1);
}
}
void usage(void){
fprintf(stderr, "Usage: %s command [option]\n", command_name);
exit(1);
}
code7-15
#include<sys/types.h>
#include<unistd.h>
#include<stdio.h>
#include<stdlib.h>
static void charatatime(char*);
int main(void){
pid_t pid;
if((pid = fork()) < 0) perror("fork error");
else if(pid == 0) charatatime("output from child\n");
else charatatime("output from parent\n");
exit(0);
}
static void charatatime(char* str){
char* ptr;
int c;
setbuf(stdout, NULL);
for(ptr = str; c = *ptr++; )
putc(c, stdout);
}
code7-16
#include<stdio.h>
#include<sys/types.h>
#include<sys/wait.h>
#include<errno.h>
#include<unistd.h>
#include<stdlib.h>
int system(const char* cmdstring){
pid_t pid;
int status;
if(cmdstring == NULL)
return (1);
if((pid = fork()) < 0)
status = -1;
else if(pid == 0){
execl("/bin/sh", "sh", "-c", cmdstring, (char*) 0);
_exit(127);
}else{
while(waitpid(pid, &status, 0) < 0)
if(errno != EINTR){
status = -1;
break;
}
}
return (status);
}
int main(){
if(system("ls -l") < 0){ // give ls -l command for example
perror("system error");
exit(1);
}
return 0;
}
code7-17
#include<stdio.h>
#include<sys/times.h>
#include<time.h>
#include<unistd.h>
#include<stdlib.h>
static void pr_times(clock_t, struct tms*, struct tms*);
static void do_cmd(char*);
int main(int argc, char* argv[]){
int i;
for(i = 1; i<argc; i++)
do_cmd(argv[i]);
exit(0);
}
static void do_cmd(char* cmd){
struct tms tmsstart, tmsend;
clock_t start, end;
int status;
fprintf(stderr, "\ncommand: %s\n", cmd);
if((start = times(&tmsstart)) == -1)
perror("times error");
if((status = system(cmd)) < 0)
perror("system() error");
if((end = times(&tmsend)) == -1)
perror("times error");
pr_times(end - start, &tmsstart, &tmsend);
}
static void pr_times(clock_t real, struct tms *tmsstart, struct tms* tmsend){
static long clktck = 0;
if(clktck == 0){
if((clktck = sysconf(_SC_CLK_TCK)) < 0)
perror("sysconf error");
}
fprintf(stderr, "real: %7.2f\n", real/(double)clktck);
fprintf(stderr, "user: %7.2f\n", (tmsend->tms_utime - tmsstart->tms_utime) / (double) clktck);
fprintf(stderr, "sys: %7.2f\n", (tmsend->tms_stime - tmsstart->tms_stime)/ (double) clktck);
fprintf(stderr, "child user: %7.2f\n", (tmsend->tms_cutime - tmsstart->tms_cutime)/ (double) clktck);
fprintf(stderr, "child sys: %7.2f\n", (tmsend->tms_cstime - tmsstart->tms_cstime)/ (double) clktck);
}
lab-9
#include<stdio.h>
#include<sys/types.h>
#include<sys/wait.h>
#include<unistd.h>
#include<string.h>
#include<stdlib.h>
main(){
int pid;
int status;
int parent_pid = getpid();
int self_pid; // own pid
int order;
char* order_char;
char message[20] = "This is Chiid";
int count = 0;
pid = fork(); // create child -> child1
if(pid < 0){
perror("fork error");
exit(1);
}
else if(pid > 0){ // if process is parent create another child -> child2
pid = fork();
if(pid < 0){
perror("fork error");
exit(1);
}
}
if(pid == 0){ // if process is child then
parent_pid = getppid(); // get parent process pid;
self_pid = getpid(); // get self pid;
order = self_pid - parent_pid;
if(order == 1){
strcat(message, "1");
}
else if(order == 2){
strcat(message, "2");
}
if(execl("/usr/bin/echo","echo", message, (char*)0) == -1){
perror("execl");
exit(1);
}
}else{ // if process if parent then
printf("Parent: Waiting for children\n");
int stat_val;
pid_t child_pid;
while(count != 2){ // looping until all child is exited
child_pid = wait(&stat_val);
if(child_pid>parent_pid)
count++;
}
}
if(count == 2){ // if all child has exited well do print
printf("Parent: All Children terminated\n");
}
}
lab-10
#include<stdio.h>
#include<sys/types.h>
#include<sys/wait.h>
#include<unistd.h>
#include<string.h>
#include<stdlib.h>
main(){
int pid;
int status;
int parent_pid = getpid();
int self_pid; // own pid
int order;
char* order_char;
char message[20] = "This is Chiid";
int count = 0;
pid = fork(); // create child -> child1
if(pid < 0){
perror("fork error");
exit(1);
}
else if(pid > 0){ // if process is parent create another child -> child2
pid = fork();
if(pid < 0){
perror("fork error");
exit(1);
}
}
if(pid == 0){ // if process is child then
parent_pid = getppid(); // get parent process pid;
self_pid = getpid(); // get self pid;
order = self_pid - parent_pid;
if(order == 1){
strcat(message, "1");
}
else if(order == 2){
strcat(message, "2");
}
if(execl("/usr/bin/echo","echo", message, (char*)0) == -1){
perror("execl");
exit(1);
}
}else{ // if process if parent then
printf("Parent: Waiting for children\n");
int status;
pid_t child_pid;
while(count != 2){ // looping until all child is exited
child_pid = wait(&status);
if(child_pid - parent_pid == 2){
printf("Parent: Second Child: \n");
}else if(child_pid - parent_pid == 1){
printf("Parent: First Child: \n");
}
if(WIFEXITED(status)){
printf("status: %d\n", WEXITSTATUS(status));
count++;
}
else if(WIFSIGNALED(status)){
printf("signaled\n");
printf("signal number %d\n", WTERMSIG(status));
}
}
}
if(count == 2){ // if all child has exited well do print
printf("Parent: All Children terminated\n");
}
}
9주차
code8-1
#include<stdio.h>
#include<signal.h>
#include<unistd.h>
void ouch(int);
main(){
signal(SIGINT, ouch);
while(1){
printf("Hello World!\n");
sleep(1);
}
}
void ouch(int sig){
printf("OUCH -l got signal %d\n", sig);
(void) signal(SIGINT, SIG_DFL);
}
code8-2
#include<stdio.h>
#include<signal.h>
#include<stdlib.h>
#define OUTPUT "count-prime.out"
#define MAXNUM 100000
int count;
FILE *fptr;
void sigcatch();
main(){
int number, divisor;
void sigcatch();
fptr = fopen(OUTPUT, "w");
signal(SIGINT, sigcatch);
for(number = 1; number <= MAXNUM; number++){
for(divisor = 2; divisor < number; divisor++)
if((number % divisor) == 0)
break;
if(divisor == number){
fprintf(fptr, "%d \n", number);
count++;
}
}
fclose(fptr);
}
void sigcatch(){
printf("%d primes computed \n", count);
fclose(fptr);
exit(1);
}
lab-11
#include<stdio.h>
#include<stdlib.h>
#include<signal.h>
#include<sys/wait.h>
#include<sys/types.h>
#include<unistd.h>
void int_handler(int sig){ // handler function
printf("Process %d received signal %d\n", getpid(), sig);
exit(0);
}
main(){
int pid;
pid = fork(); // create child
if(pid < 0){
perror("fork error");
exit(1);
}
if(pid == 0){ // if child process do
signal(SIGINT, int_handler); // register signal handler
while(1){} // infinite loop
}
if(pid != 0){ // if parent process do
int status;
if(kill(pid, SIGINT) < 0){ // kill child process
perror("kill error");
exit(1);
}
wait(&status); // waiting child process
if(WIFEXITED(status)){
printf("child exited with code %d\n", WEXITSTATUS(status));
}
else{ // child process is signaled -> else will execute.
printf("Child terminated abnormaly\n");
}
}
}
lab-12
parent.c
#include<stdio.h>
#include<stdlib.h>
#include<unistd.h>
#include<sys/types.h>
#include<sys/wait.h>
#include<signal.h>
main(){
int pid;
pid = fork(); //create child process
if(pid < 0){
perror("fork error");
exit(1);
}
if(pid == 0){ // if child process then do
//execl("/home/razelo/assign/9week/lab#12/child", "./child", (char*)0);
execlp("./child", "./child", (char*) 0); // use env PATH
}
if(pid != 0){ // if parent process then do
int status;
int child_pid;
printf("parent: child initiated\n");
sleep(3); // wait 3 sec then kill child process
kill(pid, SIGTERM); // signal to child process
child_pid = wait(&status);
if(child_pid == pid){ // if child process terminated neither normaly, abnormaly then do
printf("parent: child terminated\n");
}
}
}
child.c
#include<stdio.h>
#include<stdlib.h>
#include<unistd.h>
main(){
//printf("child is executed\n");
sleep(30); // sleep 30 sec
}
반응형
'C & C++ > C' 카테고리의 다른 글
[C] 환경변수를 출력하는 envp의 미스터리한 동작 발견. 이유가 대체 뭘까요? <extern char ** environ;> (1) (0) | 2022.04.13 |
---|---|
[C] C언어 질문: 두 배열 a와 b에서 b = a 에서 에러가 발생하는 이유는 무엇일까? (0) | 2021.11.21 |
[Linux] linux에서 atoi함수 (0) | 2021.10.27 |
[C] gcc사용법 정리해놓은 블로그 (0) | 2021.10.27 |
[C] 포인터가 가질 수 있는 값인 nil이란? (0) | 2021.10.17 |