在没有管道和信号量的子进程中创建未知数量的进程

时间:2018-06-06 09:45:38

标签: c unix concurrency process multiprocessing

我正在尝试修改shell。 我已经尝试了好几次,我在网上搜索了很多,但我无法解决我的问题。首先,我不想通过管道或信号量运行此代码。 我认为使用信号量会更加困难,因为我现在不应该有多少进程(也许我错了,但似乎至少以这种方式)。 在第一种方式中,程序使文件正确,但我不能运行循环,直到用户输入"退出"。我正在尝试while(1)但它不会给我多个文件,并且stdin只活动一次。 在第二种方式中,用户可以使用stdin直到他插入"退出",但是再一次, 它不会提供多个文件,而且内部没有任何内容。 我试图混合这两种方式,我尝试了一天以上,但我不明白问题出在哪里。顺便说一句,我认为在第二种方式, 它应该是文件描述符。 另外,请让我知道我是否正确使用等待系统调用? 提前谢谢。

/ 第一种方式 /

#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
#include <dirent.h>
#include <sys/types.h>
#include <sys/wait.h>
#include <string.h>
#include <fcntl.h>

//void MYshell(char *comm);
int main(){
    /*
    char cmd[100];
    printf("<exit> closes shell\n");
    printf("MYshell:$ ");
    fscanf(stdin,"%s",cmd);
    do{
        if(strcmp(cmd,"exit")==0){
                printf("shell has been closed.\n");
                break;
                exit(EXIT_SUCCESS);
            }
        MYshell(cmd);
        printf("MYshell:$ ");
        fscanf(stdin,"%s",cmd);

    }while(1);
    */

//void MYshell(char *comm){ 
    pid_t fork_ret;
    int fd,dup_ret;
    char cmd[100];
    char name[100];

    printf(" <exit> closes shell\n");

    printf("MYshell:$ ");
    fscanf(stdin,"%s",cmd);

    if(strcmp(cmd,"exit")==0){
            printf("shell has been closed.\n");
            //break;
            exit(EXIT_SUCCESS);
        }

    fork_ret = fork();
    if(fork_ret == -1)
        exit(1);

    if(fork_ret == 0){

        sprintf(name,"%d.log",getpid());
        fd = open(name,O_CREAT | O_WRONLY,S_IRWXU|S_IRWXG|S_IRWXO);
        if(fd<0){
            printf("Error in opening or creating %s.\n",name);
            exit(1);
        }

        dup_ret = dup2(fd,1);
        if(dup_ret<0){
            printf("Error in duplicating stdout descriptor.\n");
            exit(1);
        }
        system(cmd);
        close(fd);
        exit(0);
        }
        //close(fd);
        //exit(EXIT_SUCCESS);

    if(fork_ret>0){
        int stat;
        pid_t child = wait(&stat);
        printf("child = %d\n",child);
        if(WIFEXITED(stat))
            printf("ok\n");
        else
            printf("error\n");
        }
        wait(NULL);
        exit(EXIT_SUCCESS);
}

/* second way*/

#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
#include <dirent.h>
#include <sys/types.h>
#include <sys/wait.h>
#include <string.h>
#include <fcntl.h>

int fd;
char cmd[100];

void MYshell(void);

int main(){

    pid_t fork_ret;
    //int fd,dup_ret;

    printf(" <exit> closes shell\n");
    while(1){
        printf("MYshell:$ ");
        fscanf(stdin,"%s",cmd);
        //tmp = fgets(cmd,sizeof(cmd),stdin);

    if(strcmp(cmd,"exit")==0){
        printf("shell has been closed.\n");
        break;
        exit(EXIT_SUCCESS);
        }
    }

    fork_ret = fork();
    if(fork_ret == -1)
        exit(1);
    if(fork_ret == 0){
        MYshell();
        exit(0);
    }

    if(fork_ret>0){
        wait(NULL);
        exit(0);
    }
    wait(NULL);
    exit(EXIT_SUCCESS);
}

void MYshell(void){
    char name[BUFSIZ];
    int fd,dup_ret;
    sprintf(name,"%d.log",getpid());

    fd = open(name, O_CREAT|O_RDWR , S_IRWXU|S_IRWXG|S_IRWXO);
    if(fd<0){
        printf("Error in opening or creating %s.\n",name);
        exit(1);
    }

    dup_ret = dup2(fd,1);
    if(dup_ret<0){
        printf("Error in duplicating stdout descriptor.\n");
        exit(1);
    }
    system(cmd);
    close(fd);
    exit(0);
}

0 个答案:

没有答案